V lekci A7 jsme se naučili zapínat a vypínat naše světlo (matici LED diod) jen jedním tlačítkem a to např. tlačítkem “A”. V této lekci sestavíme nový postup, který nás připraví na řešení složitějších programů.
název: B7 Zapínáme a vypínáme světlo jedním tlačítkem
kategorie: B mírně pokročilí
ref.číslo: B7
projekt: 10+10 dní s microbitem pro mírně pokročilé, lekce B7
verze: 01, 2017-04-03
autor: Ivo Obr, Lanškroun
V lekci A7 jsme se naučili zapínat a vypínat naše světlo (matici LED diod) jen jedním tlačítkem a to např. tlačítkem “A”. V této lekci už nebudeme úplně kopírovat blokovou strukturu lekce A7, ale sestavíme se nový postup, který nám tuto činnost umožní. U složitějších programů budeme muset sledovat více věcí než jenom čekat na stisk konkrétního tlačítka. Z toho důvodu si jednotlivé stavy sledovaných objektů budeme pamatovat.
Naše lampa bude mít dva základní stavy a to rozsvíceno nebo zhasnuto. Trochu už zabíháme do lekce A8. Stav naší lampy si proto musíme zapamatovat a to tak, že si vytvoříme logickou proměnnou “stav”, do které dáme hodnotu “True”, když bude lampu rožneme a ta bude svítit, hodnotu “False”, když lampu vypneme a ta nebude svítit.
Postup:
1) Na začátku programu si dáme do proměnné, kterou nazveme “stav” hodnotu “False” a příkazem “display.clear()” zajistíme, že LED diody nesvítí.
2) Použijeme příkaz “while True”, který bude stále opakovat další příkazy.
3) Těmi dalšími příkazy v těle příkazu “while” bude jeden příkaz “if”, kterým se budeme dotazovat, zda-li tlačítko “A” bylo stisknuto. Myslí se tím stisk a uvolnění. Pokud ANO, tak se musíme rozhodnout, co budeme dále dělat a to na základě stavu naší lampy :
když lampa svítí,
zhasneme ji a do proměnné “stav” dáme hodnotu “False”
jinak
ji rozsvítíme a do proměnné “stav” dáme hodnotu “True”.
Takže k tvorbě programu. Nejdříve si opět zapíšeme úvodní povinný příkaz
from microbit import *
Vytvoříme si obraz světla – to je zapnutí všech LED diod na plný jas :
svetlo = Image(“99999:99999:99999:99999:99999”)
Dále zhasneme displej na úplném začátku programu :
display.clear()
Vytvoříme si proměnnou se jménem “stav” a dáme do ní hodnotu “False”
stav = False
Následuje opakování všech příkazů uzavřených do těla cyklu “while” (bude jen jeden):
while True:
Tím příkazem je příkaz “if” kde zjišťujeme, zdali je tlačítko stisknuté. Příkaz patří do těla příkazu “while True” a proto musí být odsazen o čtyři sloupce doprava.
if button_a.was_pressed():
Jestliže výše uvedený příkaz “if” zjistí, že tlačítko je stisknuté, to znamená že někdo vyžaduje změnu a ta může být buď “zapnutí” nebo “vypnutí” lampy a to dle toho, v jakém stavu lampa je. Zeptáme se opět pomocí příkazu “if”, který bude součástí předchozího “if”. Říká se tomu vnořený příkaz. Nesmíme zapomenout posunout o osm sloupců vpravo.
if stav == True:
Zeptali jsme se, zda-li je v proměnné “stav” hodnota “True”. Tady se nepoužije operátor “=”, protože se používá na přiřazení hodnoty do proměnné stojící vlevo od rovnítka. Operátor “==” je “ekvivalence” respektive shoda. Je jedním z operátorů porovnání (relace), které si probereme v další lekci.
Pokud porovnáváme obsah proměnné “stav” s hodnotou “True”, výsledek může být buď “True” nebo “False”. Když je obsahem proměnné “stav” hodnota “True”, je výsledek porovnání opět hodnota “True”. Proto můžeme psát zkráceně :
if stav:
Když je stav roven hodnotě “True” (lampa svítí), tak ji zhasneme a do proměnné “stav” dáme hodnotu “False”. Protože příkazy spadají pod “if”, který je posunut o osm sloupců doprava, musíme příkazy posunout o dvanáct sloupců.
display.clear()
stav = False
Pokud byl však obsah proměnné “stav” opačný (False), tak musíme provést příkazy s opačným účinkem. V blokových programech to bylo slovo “else” v bloku “if”, takže tady to bude něco podobného.
Slovo “else” bude patřit k “if stav:” které má posun o osm sloupců, takže jeho pokračování s “else” bude také od osmého sloupce a příkazy za “else” od dvanáctého sloupce.
else:
display.show(svetlo)
stav = True
Jak bude vypadat celý program je uvedeno na obrázku :
Nyní si zkusíme upravit program tak, aby prvním stiskem tlačítka “A” se z vypnutého stavu rozsvítila lampa jen na 50% (přibližně), druhým stiskem se lampa rozsvítila naplno a dalším stiskem vypnula. Takže naše lampa bude mít 3 stavy a proto si už nevystačíme se dvěma logickými stavy “False” a “True”.
Necháme si naše pojmenování proměnné na zjišťování stavu lampy jméno “stav” a její typ bude numerická celočíselná s hodnotami :
0 – lampa je vypnutá (nesvítí)
1 – lampa svítí na 50%
2 – lampa svítí maximálním jasem
Na samotném začátku si nastavíme do proměnné “stav” nulu a lampu zhasneme. Tady se už nevyhneme použití operátoru “==” (ekvivalence). Takže dotaz na stav bude vypadat takto :
if stav == 0:
Další změna bude v tom, že máme více stavů a nevystačíme si jen s jedním “else”. Těch “else” bude potřeba více a to zároveň s dotazem na hodnotu uloženou v proměnné “stav”. Místo slova “else” použijeme slovo “elif”. Bude to vypadat takto:
if stav == 0:
display.show(svetlo1)
stav = 1
elif stav == 1:
display.show(svetlo2)
stav = 2
elif stav == 2:
display.clear()
stav = 0
Všimněte si rozdíly u “=” a “==”. Jedno rovnítko přiřazuje hodnotu do proměnné stojící vlevo od rovnítka, dvě rovnítka porovnávají hodnotu pravé a levé strany a výsledkem je “True” nebo “False”.
Program pak vypadá následovně :
Samozřejmostí je test na správnost napsání programu a pak jeho uložení do složky MICROLA pod jménem B7.py. Také si doplňte poznámky na začátek programu, už si to automaticky dělejte. V dalším už nebudu na tuto činnost upozorňovat.
Jaké máme programovací možnosti u tlačítek v MicroPython? Zde jsou možnosti :
Máme dva objekty – dvě tlačítka :
button_a
button_b
K těmto tlačítkům můžeme přiřadit něco, čemu říkáme “metody”, česky bychom to označili jako činnosti, které můžeme vykonat u těchto objektů – tlačítek. Tyto metody nám vracejí hodnoty buď logické nebo celočíselné.
is_pressed()
Nabývá hodnoty “True”, pokud je tlačítko stisknuté. Pokud není stisknuté, má hodnotu “False”.
was_pressed()
Nabývá hodnoty “True”, pokud bylo tlačítko stisknuto a uvolněno. Po “použití” metody se její hodnota nastaví na “False”.
get_presses()
Nabývá celočíselných hodnot a je rovna celkovému počtu stisknutí tlačítka. Po “použití” metody se hodnota nastaví na nulu.
Takže výsledné použití je objekt.metoda
Příklady :
Výraz: Typ: Hodnota:
button_a.is_pressed() logický False/True
button_b.is_pressed() logický False/True
button_a.was_pressed() logický False/True
button_b.was_pressed() logický False/True
button_a.get_presses() celočíselný 0, 1, 2, …….
button_b.get_presses() celočíselný 0, 1, 2, …….
Úkoly této lekce :
- Změna stavu lampy probíhá stiskáváním tlačítka “A” takto : 0 -> 1 -> 2 -> 0 -> 1 atd….. Zkuste dopsat program, kde stiskem tlačítka “B” se obrátí posloupnost změny stavu lampy. (nápověda : dopsat v rámci “while True” ještě jeden příkaz “if” na test tlačítka “B” a stejně, jak je to u prvého “if button_a” dopsat následnost stavů ale obráceně 0 -> 2 -> 1 -> 0 -> 2 atd….).