Cat Napping
{Introduction }
Lychee the cat loves the sun and wants to know if your home has a good sunbathing spot. Are you up for the challenge?

{Setting logging to false on start}
First, we want to make sure we know when our micro:bit is collecting data. To do this, let’s create a boolean variable and use it to track when the micro:bit is logging data. We’ll start with the logging variable set to false.
■ In the ||variables:Variables|| category, click on Make a Variable... and make a variable named logging.
■ From the ||variables:Variables|| category, grab the ||variables:set [logging] to [0]|| block and snap it into the empty ||basic(noclick):on start|| container.
■ From the ||logic:Logic|| category, grab a ||logic:<false>|| argument and snap it in to replace the ||variables(noclick):[0]|| value in your ||variables(noclick):set [logging] to [0]|| statement.
let logging = false
logging = false
{Toggle logging on A press}
Let’s give Lychee some control over when she wants to start and stop logging data on the micro:bit.
■ From the ||input:Input|| category, grab a ||input:on button [A] pressed|| container and drag it into your workspace. Then, grab a ||variables:set [logging] to [0]|| block from ||variables:Varables|| and snap it inside of your ||input(noclick):on button [A] pressed|| container.
■ From the ||logic:Logic|| category, grab a ||logic:<not []>|| argument and snap it in to replace the 0 argument. Go back to the ||variables:Variables|| category, grab a ||variables:logging|| variable and snap it in to replace the empty ||logic(noclick):<>|| in the ||logic(noclick):not <>|| statement.
✋🛑 Take a moment to help Lychee answer the following question: What is happening every time she presses the A button?
let logging = false
input.onButtonPressed(Button.A, function () {
logging = !(logging)
})
{Visual logging indicators}
It would help to know when the micro:bit is logging data and when it isn’t. For this step, we will be building out a visual indicator using an if then / else statement.
■ From the ||logic:Logic|| category, grab an ||logic:if <true> then / else|| statement and snap it in at the bottom of your ||input(noclick):on button [A] pressed|| container.
■ From ||variables:Variables||, grab a ||variables:logging|| variable and snap it in to replace the ||logic(noclick):<true>|| condition in your ||logic(noclick):if then / else|| statement.
let logging = false
input.onButtonPressed(Button.A, function () {
logging = !(logging)
if (logging) {
} else {
}
})
{Set the indicator icon}
■ Let’s display an image when the micro:bit is logging data. From the ||basic:Basic|| category, grab a ||basic:show icon [ ]|| block and snap it into the empty top container of your ||logic(noclick):if then / else|| statement.
■ Set it to show the “target” icon (it looks like an empty sun - scroll down to find it!). This will show whenever your micro:bit is collecting data.
💡 In the show icon dropdown menu options, you can hover to see what each design is called.
let logging = false
input.onButtonPressed(Button.A, function () {
logging = !(logging)
if (logging) {
basic.showIcon(IconNames.Target)
} else {
}
})
{Auditory logging indicators}
Let’s now add an auditory indicator that your micro:bit is logging data!
■ From the ||music:Music|| category, grab a ||music:play sound [dadadum] [in background]|| block and snap it into the bottom of the top container of your ||logic(noclick):if then / else|| statement.
■ Click on the [dadadum] dropdown and select nyan, then set the playback mode to ||music(noclick):[until done]||. Your block should now say ||music(noclick):play melody [nyan] [until done]||.
let logging = false
input.onButtonPressed(Button.A, function () {
logging = !(logging)
if (logging) {
basic.showIcon(IconNames.Target)
music.play(music.builtInPlayableMelody(Melodies.Nyan), music.PlaybackMode.UntilDone)
} else {
}
})
{Logging off indicator}
■ Let’s clear the board when the micro:bit is not logging data. From the ||basic:Basic|| category, grab a ||basic:clear screen|| block and snap it into the empty bottom container of your ||logic(noclick):if then / else|| statement.
let logging = false
input.onButtonPressed(Button.A, function () {
logging = !(logging)
if (logging) {
basic.showIcon(IconNames.Target)
music.play(music.builtInPlayableMelody(Melodies.Nyan), music.PlaybackMode.UntilDone)
} else {
basic.clearScreen()
}
})
{Time interval for data logging}
Let’s set up the data logging for Lychee! In order to get Lychee a good amount of data without running out of memory, we should collect one data point for her every minute.
■ From the ||loops:Loops|| category, grab a ||loops:every [500] ms|| container and add it to your workspace.
■ Click on the the 500 dropdown and select 1 minute.
💡 1 minute is equivalent to 60000ms, which is what the number will automatically change to.
loops.everyInterval(60000, function () {
})
{Setting up a logging variable}
Now, let’s use an if then statement to track when the micro:bit is logging data.
■ From the ||logic:Logic|| category, grab a ||logic:if <true> then|| statement and snap it into your ||loops(noclick):every [600000] ms|| container.
■ From the ||variables:Variables|| category, drag out a ||variables:logging|| variable and snap it in to replace the ||logic(noclick):<true>|| argument in the ||logic(noclick):if <true> then|| statement.
let logging = false
loops.everyInterval(60000, function () {
if (logging) {
}
})
{Setting up logging - Part 1}
Lychee loves her sun spots because they provide a nice, sunny and warm place to nap. So, we’ll need to measure the temperature and light in different places around the house.
■ From the ||datalogger:Data Logger|| category, grab a ||datalogger:log data [column [""] value [0]] +|| block and snap it inside the ||logic(noclick):if [logging] then|| statement.
■ Click on the "" after the word column and type in “temp“.
■ From the ||input:Input|| category, select the ||input:temperature (°C)|| parameter and drag it in to replace the 0 after the word value.
let logging = false
loops.everyInterval(60000, function () {
if (logging) {
//@highlight
datalogger.log(
datalogger.createCV("temp", input.temperature())
)
}
})
{Setting up logging - Part 2}
■ On the right of the ||input(noclick):temperature (°C)|| input that you just snapped in, there is a ➕ button. Click on it. You should now see a new row that says ||datalogger(noclick):column [""] value [0]||.
■ Click on the empty "" after the word column and type in “light“.
■ From the ||input:Input|| category, select the ||input:light level|| parameter and drag it in to replace the 0 parameter after the word value.
let logging = false
loops.everyInterval(60000, function () {
if (logging) {
//@highlight
datalogger.log(
datalogger.createCV("temp", input.temperature()),
datalogger.createCV("light", input.lightLevel())
)
}
})
{Time to log data! }
You did it! If you have a micro:bit V2 (the one with the shiny gold logo at the top), download this code and try it out!
■ Find a sun spot in your house and press the A button to start logging data - your display should show an icon and play a sound to indicate that you are logging data.
■ After some time (we recommend at least an hour), press the A button again to stop logging data - your display should clear to indicate that you are not logging data.
{Reviewing your data }
Now that you have logged some data, plug your micro:bit into a laptop or desktop computer. The micro:bit will appear like a USB drive called MICROBIT. Look in there and you’ll see a file called MY_DATA:

Double-click on MY_DATA to open it in a web browser and you’ll see a table with your data:

{Lychee’s preferences }
Does your home have a good sunbathing spot for Lychee? Compare the light and temperature levels you record for different areas around your house! The sunniest and warmest spots will likely be her favorite ☀️😻
//
datalogger