Lekce 2 - RGB LED + tlačítko + události¤
V této lekci si ukážeme ovládání RGB LED umístěné na ESP32 a práci s událostmi řízenými tlačítkem nebo časem.
Jelikož je TypeScript (JavaScript) imperativní, vykonávájí se příkazy v takovém pořadí, v jakém jsou zapsány.
Stáhnout ZIP s prázdným projektem
Zadání A¤
Nejdříve si zopakujeme předchozí lekci, a rozsvítíme RGB LED na ESP32 (GPIO 48
) jednou barvou (například červenou).
Na začátku tohoto úkolu si stáhneme nový zip soubor obsahující prázdný projekt. Po stažení složku rozbalíme a otevřeme ve Visual Studio Code. V souboru index.ts
jsou připraveny import
příkazy: ty nám umožní využívat funkcionalitu z různých souborů, např. jednoduše ovládat LEDku, nebo využívat nadefinované barvy.
Abychom mohli LED u procesoru ovládat, musíme ji získat příkazem const led = new SmartLed(...)
, a do závorky napíšeme číslo PINu, počet LED světel (zatím je to 1), a typ světla: LED_WS2812
. Barvu LED nastavíme pomocí led.set(0, colors.nějaká_barva)
a zobrazíme pomocí led.show()
.
Řešení
import { SmartLed, LED_WS2812 } from "smartled";
import * as colors from "./libs/colors.js"
const LED_PIN = 48;
const LED_COUNT = 1;
const ledStrip = new SmartLed(LED_PIN, LED_COUNT, LED_WS2812); // připojí pásek na pin 48, s 1 ledkou a typem WS2812
ledStrip.set(0, colors.red); // nastaví barvu nulté LED na červenou (RGB 255 0 0)
ledStrip.show(); // zobrazí nastavení na LED
Co je to událost v programování?¤
Událost, která je programem rozpoznávána (například stisknutí nebo puštění tlačítka nebo uplynutí nějakého času). Po zaznamenání události se vykoná kód, který je k ní přiřazen.
S událostí řízenou časem už jsme se setkali: pomocí setInterval
umíme vyvolat něco, co se opakuje každých X
milisekund.
Události řízené stiskem tlačítka můžeme ovládat pomocí přiložené knihovny gpio
.
GPIO
je jednoduchá elektronická konstrukce, která nám umožňuje posílat nebo přijímat bit informace, a na základě toho měnit chování našeho programu.
Abychom mohli přijímat signál ze stisknutí tlačítka, nejdříve musíme nastavit vybraný pin jako vstupní. To uděláme příkazem gpio.pinMode(PIN, gpio.PinMode.INPUT)
, kde PIN je číslo pinu (najdeme na stránce), a druhý argument je režim. Pokud bychom chtěli např. použít LEDky přímo na desce, chceme dané piny použít jako výstupní, tedy gpio.PinMode.OUTPUT
.
Jakmile máme nastavené vstupní tlačítko, můžeme na něm pozorovat události pomocí gpio.on()
. Reakci na stisknutí tlačítka vyvoláme argumentem "falling"
, reakci na puštění "rising"
. Kód, který při stisku tlačítka něco vykoná, tedy může vypadat takto:
const BTN_PIN = nějaké číslo;
gpio.pinMode(BTN_PIN, gpio.PinMode.INPUT);
gpio.on("falling", BTN_PIN, () => {
// něco udělej
});
Zadání B¤
Pomocí událostí rozsvítíme při stisknutí tlačítka (GPIO 0) RGB LED na ESP32 (GPIO 48
) a při puštění ho opět zhasneme.
Řešení
import * as gpio from "gpio";
import { SmartLed, LED_WS2812 } from "smartled";
import * as colors from "./libs/colors.js"
const LED_PIN = 48;
const LED_COUNT = 1;
const BTN_LEFT = 18;
const ledStrip = new SmartLed(LED_PIN, LED_COUNT, LED_WS2812); // připojí pásek na pin 48, s 1 ledkou a typem WS2812
gpio.pinMode(BTN_LEFT, gpio.PinMode.INPUT); // nastaví pin 18 jako vstup
gpio.on("falling", BTN_LEFT, () => { // událost, která proběhne při stisknutí tlačítka připojeného na pin 0
ledStrip.set(0, colors.red); // nastaví barvu nulté LED na červenou (RGB 255 0 0)
ledStrip.show(); // zobrazí nastavení na LED
});
gpio.on("rising", BTN_PIN, () => { // událost, která proběhne při puštění tlačítka připojeného na pin 0
ledStrip.set(0, colors.off); // nastaví nultou LED na zhasnutou (RGB 0 0 0)
ledStrip.show(); // zobrazí nastavení na LED
});
Zadání C¤
Dvakrát za sekundu vypíšeme stav zmáčknutí tlačítka (0 nebo 1). Opakování dosáhneme pomocí setInterval()
. Stav daného tlačítka získáme pomocí gpio.read(číslo pinu)
.
Řešení
import * as gpio from "gpio";
const LBTN_PIN = 18;
gpio.pinMode(BTN_PIN, gpio.PinMode.INPUT); // nastaví pin nula jako vstup
setInterval(() => { // pravidelně vyvolává událost
console.log(gpio.read(BTN_PIN)); // načte a vypíše stav tlačítka připojeného na pin 0
}, 500); // čas opakování se udává v milisekundách (500 ms je 0,5 sekundy)
Zadání výstupního úkolu V1¤
Při stisknutí tlačítka (GPIO 0) vypíšeme pozdrav.
Zadání výstupního úkolu V2¤
Při stisknutí tlačítka (GPIO 0) rozsvítíme RGB LED na ESP32 (GPIO 48
) jednou barvou a při puštění barvu změníme na jinou.