pxt-calliope/docs/projects/fireflies.md
Peli de Halleux 2b504d863d
Radiodocsupdate (#1430)
* a few updates

* more updates

* reorder radio blocks

* more shuffling of new radio apis

* fixing hot or ocold

* more doc fixes

* more updates

* fixing docs issues

* more doc fixes

* restore docs errors

* missing packate

* renamed argument of callback

* mssing radio

* more odcs fixes

* lock turtle

* ignore docs for now
2018-10-15 15:32:09 -07:00

3.1 KiB

Fireflies

~ avatar

Turn your @boardname@ into fireflies.

~

https://youtu.be/ZGvtnE1Wy6U

How do Fireflies synchronize?

Go to http://ncase.me/fireflies/ and read about the fireflies synchronization phenomenon.

Code the firefly

We want to create virtual fireflies using multiple @boardname@s (each @boardname@ acts as a firefly). Let's review some of the key points from 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 ||basic:forever|| loop to repeat code that increments the clock. When the clock reaches "noon" (let's pick 8 as noon), 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
    }
})

When you see a nearby firefly flash, nudge your clock a little bit forward

The @boardname@ can send radio messages to a neighbor @boardname@. We can use these messages to simulate the "flashes" of light.

When a firefly flashes, it also sends a number over radio using ||radio: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.onReceivedNumber(function (receivedNumber) {
    // advance clock to catch up neighbors
    clock += 1
})

Put it all together

https://youtu.be/XzZeB4yYnEw

Download this program on as many @boardname@s as you can find and try it out in the dark!

Note: We've added a ||radio:radio set group|| block to specify which group the firefly will communicate on.

// the clock ticker
let clock = 0
radio.onReceivedNumber(function (receivedNumber) {
    // 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