Bonus - Radio¤
Na Robůtkovi je k dispozici jednoduchá bezdrátová komunikace na vzdálenost jednotek metrů.
- Až 16 "skupin", všechny desky ve stejné skupině přijmají zprávy od všech ostatních zároveň
-
Podporuje tři datové typy:
- Řetězce do délky 30 znaků
- Čísla
- Klíč - hodnota, kdy klíč je řetězec do 22 znaků a hodnota je číslo
Spuštění¤
Pokud chcete používat radio, je třeba importovat jeho knihovnu a poté zavolat begin(<číslo skupiny>);
import * as radio from "simpleradio";
// zapnutí radia, 4 je číslo skupiny. Může být od 0 do 15 včetně.
radio.begin(4);
// vypnutí radia
radio.end();
Odesílání dat¤
K odesílání slouží 3 send
funkce:
// Odeslání řetezce
radio.sendString("Ahoj!");
let hodnota = 22;
radio.sendString(`Hodnota: ${hodnota}`); // s formátováním
// Odeslání čísla
radio.sendNumber(42);
radio.sendNumber(-2.42);
// Odeslání klíč - hodnota
radio.sendKeyValue("rychlost", 10);
Rychlé odesílání¤
Pokud se rychle za sebou pokusíte odeslat dvě různé hodnoty, je možné, že dorazí pouze jedna - je třeba počkat před odesláním další hodnoty:
async function main() {
while (true) {
radio.sendKeyValue("x", 10);
await sleep(50); // čekání, aby se hodnota X stihla odeslat
radio.sendKeyValue("y", 20);
await sleep(1000);
}
}
main();
Přijmání dat¤
Pro přijmání dat slouží funkce on
. První parametr callbacku je vždy přijatá hodnota, druhá je objekt s informacemi o přijmu - od koho (address
) a s jaku sílou signálu (rssi
) data přišla.
// řetězce
radio.on("string", (retezec, info) => {
console.log(
`Přijal jsem řetězec '${retezec}'.
Od: ${info.address},
síla signálu: ${info.rssi})
`
);
});
// číslo
radio.on("number", (cislo, info) => {
console.log(
`Přijal jsem číslo ${cislo}.
Od: ${info.address},
síla signálu: ${info.rssi})
`
);
});
// klíč - hodnota
radio.on("keyvalue", (klic, hodnota, info) => {
console.log(
`Přijal jsem ${klic} = ${hodnota}.
Od: ${info.address},
síla signálu: ${info.rssi})
`
);
});
Každou kategorii přijmacího callbacku lze i zrušit:
radio.off("string");
radio.off("number");
radio.off("keyvalue");
Zadání A¤
Vytvořte program, který pomocí klíč-hodnota bude přes rádio odesílat stav dvou tlačítek na desce
(stisknuto == 1
, nestisknuto == 0
).
Zároveň bude reagovat na příchozí hodnoty a rosvicovat první 2 LED na LED pásku podle příchozího stavu.
Jako klíče použijte IO0
a IO2
. Vždy, když přijde klíč IO0
s hodnotou 1, rozsvítíte LED na indexu 1, a když 0, tak ji zhasnete,
a stejně tak pro další tlačítko a LED.
Najděte kamaráda, abyste si mohli navzájem zkusit, zda program funguje (jeden vysílá, druhý přijmá).
Řešení
import { Pins } from "./libs/robutek.js"
import * as radio from "simpleradio";
import * as gpio from "gpio";
import { SmartLed, LED_WS2812 } from "smartled";
import * as colors from "./libs/colors.js";
radio.begin(5); // skupina 5
const LED_COUNT = 3;
// Nastavíme tlačítka jako vstupy
gpio.pinMode(Pins.ButtonLeft, gpio.PinMode.INPUT);
gpio.pinMode(Pins.ButtonRight, gpio.PinMode.INPUT);
gpio.on("falling", PIN_BTN_LEFT, () => {
// Při stisknutí tlačítka 0
radio.sendKeyValue("IO2", 1); // odešleme hodnotu 1 s klíčem IO2
});
gpio.on("rising", PIN_BTN_LEFT, () => {
// Při uvolnění tlačítka 0
radio.sendKeyValue("IO2", 0); // odešleme hodnotu 0 s klíčem IO2
});
gpio.on("falling", PIN_BTN_RIGHT, () => {
radio.sendKeyValue("IO0", 1); // odešleme hodnotu 1 s klíčem IO0
});
gpio.on("rising", PIN_BTN_RIGHT, () => {
radio.sendKeyValue("IO0", 0); // odešleme hodnotu 0 s klíčem IO0
});
// Nastavíme LED piny jako výstupy
const strip = new SmartLed(Pins.ILED, LED_COUNT);
// Zpracování příchozích správ
radio.on("keyvalue", (klic, hodnota, info) => {
if (klic === "IO0") {
strip.set(1, colors.rainbow(0, hodnota * 10))
} else if (klic === "IO2") {
strip.set(2, colors.rainbow(150, hodnota * 10))
}
strip.show();
});
Výchozí úkol V1¤
Změňtě program ze zadání A tak, aby místo tlačítek vyčítal ADC převodník. Na LED pásku se bude zobrazovat hondota z ADC.