Aplikace B7 Zapínáme a vypínáme jedním tlačítkem

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….).

 

 

Posted in kat B - mírně pokročilí.