Rýchlokurz micro:bit/06 Tlačidlá a udalosti
Zo stránky SensorWiki
← Predchádzajúca lekcia | ⌂ Obsah kurzu | Nasledujúca lekcia →
Čo sa naučíte
- reagovať na stlačenie tlačidla pomocou udalostí,
- čo je obsluha udalosti a ako súvisí s funkciami,
- rozlíšiť stlačenie A, B a oboch tlačidiel súčasne.
Vysvetlenie: udalosti
V minulej lekcii program na stlačenie tlačidla aktívne čakal: stále dookola sa pýtal „už je stlačené?“. Takýto prístup má dve nevýhody. Počas čakania nemôže program robiť nič iné a krátke stlačenie sa môže stratiť.
Druhý prístup je riadenie udalosťami (anglicky event-driven programming). Udalosť je niečo, čo sa stane mimo programu a na čo chceme reagovať: stlačenie tlačidla, zatrasenie micro:bitom, prijatie správy rádiom. Program vopred povie: „keď nastane táto udalosť, vykonaj tieto príkazy“. Takáto skupina príkazov sa nazýva obsluha udalosti (anglicky event handler).
Obsluha udalosti je funkcia: pomenovaná skupina príkazov, ktorá sa nevykoná hneď, ale až keď ju niekto zavolá. V tomto prípade ju volá systém micro:bitu vždy, keď zistí stlačenie tlačidla. Nemusíme teda nič stále kontrolovať, systém sa o sledovanie tlačidiel stará za nás, a to aj vtedy, keď program práve robí niečo iné.
Podobne fungujú aj programy na počítači a mobile: tlačidlo v okne aplikácie má obsluhu udalosti „po kliknutí“.
Program: visačka na diskotéku
Po zapnutí sa zobrazí fajka (zariadenie je pripravené). Majiteľ visačky potom tlačidlami ukazuje svoju náladu: tlačidlo A zobrazí veselý smajlík, B smutný a obe tlačidlá naraz „tajný symbol“ ❤ pre toho pravého. Blok on button A pressed je v kategórii Input, v jeho rozbaľovacom zozname vyberiete A, B alebo A+B.
-
Program v blokoch...
input.onButtonPressed(Button.A, function () {
basic.showIcon(IconNames.Happy)
})
input.onButtonPressed(Button.B, function () {
basic.showIcon(IconNames.Sad)
})
input.onButtonPressed(Button.AB, function () {
basic.showIcon(IconNames.Heart)
})
basic.showIcon(IconNames.Yes)
def on_button_pressed_a():
basic.show_icon(IconNames.HAPPY)
input.on_button_pressed(Button.A, on_button_pressed_a)
def on_button_pressed_b():
basic.show_icon(IconNames.SAD)
input.on_button_pressed(Button.B, on_button_pressed_b)
def on_button_pressed_ab():
basic.show_icon(IconNames.HEART)
input.on_button_pressed(Button.AB, on_button_pressed_ab)
basic.show_icon(IconNames.YES)
Ako to funguje
Najlepšie je to vidieť v Pythone, kde je každá obsluha zapísaná v dvoch krokoch:
def on_button_pressed_a():– definícia funkcie. Vytvorí funkciu s menomon_button_pressed_aa odsadené príkazy pod ňou sú jej telo. V tejto chvíli sa ešte nič nevykoná, funkcia sa len pripraví na neskoršie použitie.input.on_button_pressed(Button.A, on_button_pressed_a)– registrácia obsluhy. Systému oznámime: „keď bude stlačené tlačidlo A, zavolaj funkciuon_button_pressed_a“.
JavaScript robí oboje naraz: funkciu zapíše priamo na mieste, kde ju registruje (function () { ... }), bez mena. Takej funkcii sa hovorí anonymná funkcia.
Keď program spustíte, vykoná sa v skutočnosti len registrácia troch obslúh a zobrazenie fajky. Potom program nemá čo robiť, ale neskončí: systém ďalej sleduje tlačidlá a pri každom stlačení zavolá príslušnú obsluhu. Poradie, v akom sú obsluhy v programe zapísané, preto nehrá žiadnu úlohu. V blokoch to vidno na tom, že bloky udalostí stoja samostatne na ploche a nie sú do ničoho vložené.
Teraz už rozumiete aj bloku forever z lekcie 2: basic.forever(on_forever) je tiež registrácia funkcie, ktorú bude systém volať stále dookola.
Ikona na displeji zostane zobrazená, kým ju neprepíše iná obsluha. Visačka si teda „pamätá“ poslednú náladu.
Časté chyby
- Obsluha udalosti vložená do forever alebo on start. Bloky to ani nedovolia, ale v textovom zápise sa to stať môže. Obsluhy sa registrujú raz, samostatne.
- Dve obsluhy tej istej udalosti. MakeCode použije len jednu z nich. Ak má tlačidlo robiť viac vecí, dajte všetky príkazy do jednej obsluhy.
- Dlhé príkazy v obsluhe. Pokiaľ obsluha beží (napr. posúva dlhý text), ďalšie stlačenia sa môžu oneskoriť. Obsluhy udalostí majú byť krátke.
Úlohy
- Doplňte ďalšiu náladu: pri zatrasení visačkou sa zobrazí zmätený smajlík (Confused). Použite blok on shake z kategórie Input. Zatrasenie je tiež udalosť, len ju zaznamená akcelerometer.
- (len V2) Pri dotyku loga (blok on logo pressed) nech visačka zobrazí meno majiteľa.
- Upravte obsluhu tlačidla A tak, aby veselý smajlík trikrát zablikal (použite cyklus z lekcie 4) a potom zostal svietiť.
- Porovnajte túto visačku s programom z lekcie 5: čo sa stane, keď tlačidlo len veľmi krátko ťuknete?
← Predchádzajúca lekcia | ⌂ Obsah kurzu | Nasledujúca lekcia →
