Files

index.md

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 #!ts 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 #!ts 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á).

??? note "Řešení" ```ts 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", PINBTNLEFT, () => { // Při stisknutí tlačítka 0 radio.sendKeyValue("IO2", 1); // odešleme hodnotu 1 s klíčem IO2 }); gpio.on("rising", PINBTNLEFT, () => { // Při uvolnění tlačítka 0 radio.sendKeyValue("IO2", 0); // odešleme hodnotu 0 s klíčem IO2 });

gpio.on("falling", PINBTNRIGHT, () => { radio.sendKeyValue("IO0", 1); // odešleme hodnotu 1 s klíčem IO0 }); gpio.on("rising", PINBTNRIGHT, () => { 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.

Report a bug