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