5

Micro:Bit Voting - Espruino

 2 years ago
source link: https://www.espruino.com/MicroBit+Voting
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

Micro:Bit Voting

If you have a classroom of kids, one thing you might want to do is to make a voting system where children can do something with their Micro:bit and have it shown at the front of the class.

We're going to use a Pixl.js board with Espruino to receive data that is transmitted over Bluetooth by Micro:bits programmed with MakeCode and display it on the Pixl.js screen.

Because standard Eddystone Bluetooth advertising is used, multiple receivers can be made - using other Bluetooth LE Espruino devices or just a PC with special software.

Micro:Bit software

  • Go to MakeCode and ensure you're in Blocks mode up the top.
  • Under the Advanced heading click Add Package (you may have to expand Advanced first)
Add Package
  • Type Bluetooth and click on the Bluetooth package
Bluetooth Package
  • Click Yes to the dialog telling you that radio functions won't be available.
Bluetooth Package Warning
  • Now pull in the On Button A Pressed block from Input
  • Pull bluetooth advertise url from Bluetooth into the On Button A Pressed
  • Pull show leds from Basic into the end of On Button A Pressed as well
  • Right-click and duplicate all the blocks
  • In the first block, change https://makecode.com to https://makecode.com#1, and write 1 in the show leds block
  • In the second block, change On Button A Pressed to On Button B Pressed, https://makecode.com to https://makecode.com#2, and write 2 in the show leds block

Your code should look like this:

Finished code

Click Download and save the file to each Micro:bit you're interested in.

Pixl.js Software

On the Pixl, we'll write code that scans for any advertised URLs that contain a # character, and use the text after the # as a vote.

For Pixl.js, follow the Getting Started Guide to get connected with the Espruino IDE.

Copy and paste the following code to the right-hand side of the IDE and click Upload, and you're done!

// List of eddystone devices
var eddystone = {};
// List of votes
var votes = {};

// Start scanning for devices
NRF.setScan(function(dev) {
  if (dev.serviceData && dev.serviceData.feaa)
    eddystone[dev.id] = dev;
});

/* Every so often, scan over the list of devices
we have and tally up the votes */
setInterval(function() {
  // reset votes
  votes = {};
  // tally them up
  for (var id in eddystone) {
    var dev = eddystone[id];
    if (!dev.age) dev.age=0;
    dev.age++;
    // only use votes from devices we heard from recently
    if (dev.age < 40) {
      // if the URL contains a hash, the vote is what comes after
      var url = E.toString(dev.serviceData.feaa).substr(3);
      var hash = url.lastIndexOf("#");
      if (hash) {
        var vote = url.substr(hash+1);
        if (vote in votes)
          votes[vote]++;
        else
          votes[vote]=1;
      }
    }
  }
  // now display on the screen
  g.clear();
  g.setFontVector(40);
  g.setFontAlign(0,0);
  g.drawString(0|votes["1"], g.getWidth()/4, g.getHeight()/2);
  g.drawString(0|votes["2"], 3*g.getWidth()/4, g.getHeight()/2);
  g.flip();  
}, 500);

Type save() to write this code to Pixl.js so it'll be run automatically even after power is removed and restored.

Voting with Pixl.js

More functionality

Since anything after a # is used as a vote, you can easily have more than two items to vote with. The following code for MakeCode will vote with a number between 0 and 9 (changed by pressing the A and B buttons)

Voting 0 to 9

You can then pick up the results in the votes variable. For instance to display a bar graph instead of 2 numbers, just change the code at the end of the setInterval to:

// now display on the screen
g.clear();
g.setFontAlign(0,0);
for (var i=0;i<10;i++) {
  g.fillRect(i*12, 55-(0|votes[i])*10, i*12+11, 55);
  g.drawString(0|votes[i], i*12+5, 60);
}  
g.flip();

You could also use the Arduino connectors on the back of the Pixl.js to connect extra hardware that can be controlled by the Micro:bits, for instance motors, WiFi connection, or large LED displays.


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK