Aplikace B11 Blikáme více diodami

V této aplikaci se naučíme blikat nezávisle více diodami.

název: B11 Blikáme více diodami
kategorie: B mírně pokročilí
ref.číslo: B10
projekt: kurz micro:bit
verze: 01, 2017-04-15
autor: Ivo Obr, Lanškroun


 

V lekci B3 jsme blikali jednou diodou a náš program byl jednoduchý. Obsluhovali jsme programem jednu diodu a tím jsme si mohli dovolit to, že jsme počítač “uspali” na dobu 500 milisekund, pak jsme provedli programem další příkaz a zase jsme “uspali” mikropočítač na dalších 500 milisekund. Co když budou ale diody dvě? Pokud se bude jednat o stejnou periodu blikání, nebude to problém, pouze rozsvítíme nebo zhasneme diody v době mimo “spánek”. Když bude ale muset každá dioda blikat jinou frekvencí, pak už by to bylo složitější. No, mohli bychom najít periodu společnou, kdy se např. obě dvě současně zapínají a pak si rozkreslit, jak zapínat a jak na dlouho uspávat mikropočítač. Co když ale bude diod šest a každá má blikat jinou frekvencí? Na to bychom teoreticky návod našli, ale sestavit program by už bylo pro nás nemožné. Budeme to muset zařídit jinak.

V praxi počítač obsluhuje mnoho různých zařízení a nemůžeme ho na nějakou dobu uspat, neboť by mohl něco zaspat. Tak ho necháme stále pracovat cyklem “while True”. Budeme však sledovat neustále čas, a když uplyne požadovaná doba (například těch 500 milisekund) tak diodu rozsvítíme nebo zhasneme. Můžeme tak procházet více diod a u každé se ptát, jestli už její čas uplynul a jestli je tedy potřeba změnit její stav.

Udělejme si příklad. Budeme mít dvě diody s adresami na Microbitu (1, 2) a (3, 2). První diodu (1, 2) budeme rozsvěcet a zhasínat s periodou 1000 milisekund, druhou diodu budeme rozsvěcet a zhasínat s periodou 840 milisekund. Odvážlivci si zkusí napsat program s příkazem sleep().

Řekli jsme si, že budeme sledovat čas. V mikropočítači je příkaz, který pracuje s časem. Jeho použití je následovné :

cas_ms = running_time()

kde “cas_ms” je proměnná celočíselná, ve které je po vykonání příkazu hodnota času v milisekundách od zapnutí mikropočítače. Do kulatých závorek nic nezapisujeme.

Pro každou LED diodu si připravíme dvě proměnné, první logická bude pro stav LED diody (VYPNUTO – ZAPNUTO) s obsahem (False – True). Proměnné si pojmenujeme “sviti_1” a “sviti_2”. Pro sledování času to budou proměnné “cas_1” a “cas_2”. V těchto proměnných budou časy, kdy jsme naposledy manipulovali s LED diodami (rozsvítili nebo vypnuli).

A nyní postup pro první diodu, pro druhou to bude stejné pouze s jinými proměnnými a adresou LED diody.

1) Na začátku programu, který už se nebude opakovat nastavíme stav diody, jestli bude na začátku svítit nebo ne. Tento stav zapíšeme do proměnné “sviti_1”. Zvolíme si, že po zapnutí mikropočítače bude LED dioda (1, 2) svítit:

display.set_pixel(1, 2, 9)
sviti_1 = True

Protože jsme se stavem diody manipulovali, zapamatujeme si čas, kdy k tomu došlo.

cas_1 = running_time()

2) V těle opakování příkazu “while True” se musíme zeptat, jestli už uběhlo 500 milisekund, abychom mohli stav diody obrátit. Uděláme to tím, že odečteme od současného času minulý čas, kdy jsme diodu rozsvítili nebo vypnuli. Takže

čas od poslední manipulace = running_time() – cas_1

a budeme se ptát, zdali tento čas je větší nebo se rovná 500 milisekund. Na to se zeptáme příkazem “if”. Pokud je čas od poslední manipulace takto velký, pak spustíme příkazu na změnu stavu LED diody (červené písmo) a nesmíme zapomenout, že jsme změnili stav a tak si poznamenat  poslední čas změny (zelené písmo).

if (running_time() – cas_1) => 500:
if sviti_1:
display.set_pixel(1, 2, 0)
sviti_1 = False
else
display.set_pixel(1, 2, 9)
sviti_1 = True
cas_1 = running_time()

To samé bude i pro druhou (respektive třetí a další) LED diodu. Celý program pak vypadá takto:

Komentář k programu :

řádek 14:

Ptáme-li se, zda je něco větší než nebo se rovná, uvádíme operátor porovnání. Operátory porovnání (relace) jsou :

==            rovná se
              je větší než
<              je menší než
>=            je větší nebo rovno
<=            je menší nebo rovno
!=             nerovná se

Výsledkem je hodnota False nebo True.

Poznámka :

Každou LED diodu můžeme chápat jako nějaké zařízení. Každé zařízení řízené mikropočítačem potřebuje neustálé obsluhy a tak v programu pro skutečné řízení nesmíme použít žádný příkaz “sleep()”. Pokud bychom ho použili, tak  v době “spánku” by mohl například robot “zaspat” signál od překážky a najet do ní.

Program v cyklu “while True” postupuje od jednoho zařízení ke druhému, třetímu a tak dále a to stále opakuje velkou rychlostí. Pokud nějaké zařízení potřebuje obsluhu ( u nás přepnout stav), tak to program vykoná.

Jistě se zeptáte, že pro některé signály, přicházející z externího prostředí reakce na ně může být pomalá. Pak se tyto případy řeší pomocí “přerušení”, ale to je již pro jinou úroveň programování. Zatím se tím netrapte.

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