Fireflies
How do Fireflies synchronise?
Go to http://ncase.me/fireflies/ and read about the fireflies synchronization phenomenon.
Code
We want to create virtual fireflies using multiple micro:bit (each micro:bit acts as a firefly). Let’s review some of the key points of the article:
“Each firefly has its own individual internal clock”
A clock in this case is like a counter, so we will start by adding a clock
variable to our program.
// the clock ticker
let clock = 1
“and every time the clock “strikes twelve”, it flashes.”
We can use a forever loop to repeat code that increments the clock.
When the clock reaches “noon” (let’s pick 8
), we turn on the screen briefly (by using the game score animation)
// the clock ticker
let clock = 0
basic.forever(() => {
// if clock "hits noon", flash the screen
if (clock >= 8) {
// flash
game.addScore(1)
// wait for 2 ticks
basic.pause(200)
// reset the clock
clock = 0
} else {
// just wait a bit
basic.pause(100)
// increment the clock
clock += 1
}
})
Step 1: when you see a nearby firefly flash, nudge your clock a little bit forward.
The micro:bit can send radio messages to neighbor micro:bit. We can use these messages to simulate the “flashes” of light.
- When a firefly flashes, it also sends a number over radio using radio send number.
// the clock ticker
let clock = 0
basic.forever(() => {
// if clock "hits noon", flash the screen
if (clock >= 8) {
// notify neighbors
radio.sendNumber(0)
// flash
game.addScore(1)
// wait for 2 ticks
basic.pause(200)
// reset the clock
clock = 0
} else {
// just wait a bit
basic.pause(100)
// increment the clock
clock += 1
}
})
- When a firefly receives a radio packet, it increments its clock by one.
// the clock ticker
let clock = 0
radio.onDataPacketReceived(() => {
// advance clock to catch up neighbors
clock += 1
})
Putting all together
Download this program on as many micro:bit as you can find and try it out in a dark room!
(We’ve added a radio set group block to specify which group the firefly will communicate on).
// the clock ticker
let clock = 0
radio.onDataPacketReceived(() => {
// advance clock to catch up neighbors
clock += 1
})
basic.forever(() => {
// if clock hits noon, flash the screen
if (clock >= 8) {
// notify neighbors
radio.sendNumber(0)
// flash
game.addScore(1)
// wait for 2 ticks
basic.pause(200)
// reset the clock
clock = 0
} else {
// just wait a bit
basic.pause(100)
// increment the clock
clock += 1
}
})
radio.setTransmitPower(1)
radio.setGroup(12)
radio