Přeskočit obsah

Lekce 9 - radio¤

Na ELKS 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 tří tlačítek na desce (stisknuto == 1, nestisknuto == 0). Zároveň bude reagovat na příchozí hodnoty a rosvicovat první 3 LED na desce podle příchozího stavu.

Jako klíče použijte sw0, sw1 a sw2. Vždy, když přijde klíč sw0 s hodnotou 1, rozsvítíte LED-G, a když 0, tak ji zhasnete, a stejně tak pro další dvě tlačítka a LED.

Najděte kamaráda, abyste si mohli navzájem zkusit, zda program funguje (jeden vysílá, druhý přijmá).

Řešení
import * as radio from "simpleradio";
import * as gpio from "gpio";

radio.begin(5); // skupina 5

const PIN_SW0 = 18;
const PIN_SW1 = 16;
const PIN_SW2 = 42;

const PIN_LED0 = 17;
const PIN_LED1 = 15;
const PIN_LED2 = 45;

// Nastavíme tlačítka jako vstupy
gpio.pinMode(PIN_SW0, gpio.PinMode.INPUT);
gpio.pinMode(PIN_SW1, gpio.PinMode.INPUT);
gpio.pinMode(PIN_SW2, gpio.PinMode.INPUT);

gpio.on("falling", PIN_SW0, () => {
  // Při stisknutí tlačítka 0
  radio.sendKeyValue("sw0", 1); // odešleme hodnotu 1 s klíčem sw0
});
gpio.on("rising", PIN_SW0, () => {
  // Při uvolnění tlačítka 0
  radio.sendKeyValue("sw0", 0); // odešleme hodnotu 0 s klíčem sw0
});

gpio.on("falling", PIN_SW1, () => {
  radio.sendKeyValue("sw1", 1);
});
gpio.on("rising", PIN_SW1, () => {
  radio.sendKeyValue("sw1", 0);
});

gpio.on("falling", PIN_SW2, () => {
  radio.sendKeyValue("sw2", 1);
});
gpio.on("rising", PIN_SW2, () => {
  radio.sendKeyValue("sw2", 0);
});



// Nastavíme LED piny jako výstupy
gpio.pinMode(PIN_LED0, gpio.PinMode.OUTPUT);
gpio.pinMode(PIN_LED1, gpio.PinMode.OUTPUT);
gpio.pinMode(PIN_LED2, gpio.PinMode.OUTPUT);

// Zpracování příchozích správ
radio.on("keyvalue", (klic, hodnota, info) => {
  if (klic === "sw0") {
    gpio.write(PIN_LED0, hodnota);
  } else if (klic === "sw1") {
    gpio.write(PIN_LED1, hodnota);
  } else if (klic === "sw2") {
    gpio.write(PIN_LED2, hodnota);
  }
});

Výchozí úkol V1¤

Změňtě program ze zadání A tak, aby místo tlačítek vyčítal potenciometr, a místo ledek rozsvicoval LED pásek. Je na vás, zda vzládnete rozsvicovat a pohybovat duhou, nebo pouze jednou z LED podle toho, jak se natočí potenciometr na vysílači.