Valovastus ja ledi kytkettynä micro:bit:iin koekytkentälevyn avulla |
#include "MicroBit.h"
MicroBit uBit;
int main()
{
uBit.init();
while(1){
int valo = uBit.io.P1.getAnalogValue();
uBit.io.P0.setAnalogValue(valo);
uBit.display.scrollAsync(valo);
uBit.sleep(10);
}
}
Valosensorin antamaa arvoa oli kätevä tutkia tulostamalla se ledinäytölle (uBit.display.scroll), mutta tämä aiheutti ohjelmaan hitautta, koska säie jäi odottamaan metodin paluuta. Pienen tutkimisen jälkeen löysin asynkronisen scroll-metodin, joka palaa heti ja jää suorittamaan scrollausta taustalla (uBit.display.scrollAsync). Näin sen homman pitää toimia :-)
Toinen kokeilu liittyi ledin vilkutteluun digitaalimoodissa (on/off) ja kuvioiden tulostamiseen ledinäytölle. A-nappia painamalla ledi alkaa vilkkumaan päälle ja pois sekunnin välein, B-napista tulostuu risti keskelle näyttöä, ja P1-pinnin yhdistäminen GND:n kanssa saa aikaan ristikuvion liikkumisen ledinäytön vasemmasta yläkulmasta oikeaan alakulmaan.
Kuvan saaminen ledinäytölle vaikuttaa helpolta, MicroBitImage-objekti luodaan antamalla ledien valaistusarvot (0-255) merkkijonona vaakariveittäin pilkulla erotettuna (rivin loppussa rivinvaihto \n).
#include "MicroBit.h"
MicroBit uBit;
MicroBitImage cross("0,255,0\n255,255,255\n0,255,0\n");
void printCross(int x, int y){
MicroBitImage image(5,5);
image.paste(cross, x, y);
uBit.display.print(image);
}
void onButton(MicroBitEvent e)
{
if (e.source == MICROBIT_ID_BUTTON_A){
for(int i=0; i<3; i++){
uBit.io.P0.setDigitalValue(1);
uBit.sleep(1000);
uBit.io.P0.setDigitalValue(0);
uBit.sleep(1000);
}
}
if (e.source == MICROBIT_ID_BUTTON_B)
printCross(1, 1);
if (e.source == MICROBIT_ID_IO_P1){
for(int i=0; i<3; i++){
printCross(i, i);
uBit.sleep(1000);
}
}
}
int main()
{
uBit.init();
uBit.messageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_EVT_ANY, onButton);
uBit.messageBus.listen(MICROBIT_ID_BUTTON_B, MICROBIT_EVT_ANY, onButton);
uBit.messageBus.listen(MICROBIT_ID_IO_P1, MICROBIT_EVT_ANY, onButton);
uBit.io.P1.isTouched();
while (1)
uBit.sleep(10000);
}
Toinen kokeilu liittyi ledin vilkutteluun digitaalimoodissa (on/off) ja kuvioiden tulostamiseen ledinäytölle. A-nappia painamalla ledi alkaa vilkkumaan päälle ja pois sekunnin välein, B-napista tulostuu risti keskelle näyttöä, ja P1-pinnin yhdistäminen GND:n kanssa saa aikaan ristikuvion liikkumisen ledinäytön vasemmasta yläkulmasta oikeaan alakulmaan.
Kuvan saaminen ledinäytölle vaikuttaa helpolta, MicroBitImage-objekti luodaan antamalla ledien valaistusarvot (0-255) merkkijonona vaakariveittäin pilkulla erotettuna (rivin loppussa rivinvaihto \n).
Ledin vilkuttelua ja ristin liikuttelua näytöllä |
#include "MicroBit.h"
MicroBit uBit;
MicroBitImage cross("0,255,0\n255,255,255\n0,255,0\n");
void printCross(int x, int y){
MicroBitImage image(5,5);
image.paste(cross, x, y);
uBit.display.print(image);
}
void onButton(MicroBitEvent e)
{
if (e.source == MICROBIT_ID_BUTTON_A){
for(int i=0; i<3; i++){
uBit.io.P0.setDigitalValue(1);
uBit.sleep(1000);
uBit.io.P0.setDigitalValue(0);
uBit.sleep(1000);
}
}
if (e.source == MICROBIT_ID_BUTTON_B)
printCross(1, 1);
if (e.source == MICROBIT_ID_IO_P1){
for(int i=0; i<3; i++){
printCross(i, i);
uBit.sleep(1000);
}
}
}
int main()
{
uBit.init();
uBit.messageBus.listen(MICROBIT_ID_BUTTON_A, MICROBIT_EVT_ANY, onButton);
uBit.messageBus.listen(MICROBIT_ID_BUTTON_B, MICROBIT_EVT_ANY, onButton);
uBit.messageBus.listen(MICROBIT_ID_IO_P1, MICROBIT_EVT_ANY, onButton);
uBit.io.P1.isTouched();
while (1)
uBit.sleep(10000);
}
Ainakin näiden kokeilujen perusteella dokumentaatio on selkeää ja koodin saa toimimaan vaivattomasti. Mainio systeemi tämä mbed micro:bit!
Ainoa ihmettelyn aihe tänään on se, miksi micro:bit tekee kaiken kolmeen kertaan (teksti skrollaa ruudulla kolme kertaa, ledit vilkkuvat kolme kertaa enemmän kuin koodin mukaan pitäisi). Ehkä tällekin löytyy vielä jokin selitys :-)