V minulé lekci jsme poznali řízení LED zobrazovače. Jelikož se tyto zobrazovače používají poměrně často v různých aplikacích, nevyrábějí se jen jednočíslicové, ale lze použít i vícemístný LED zobrazovač. V této lekci si tedy ukážeme, jak ovládat čtyřmístný (sedmisegmentový) LED zobrazovač. Výsledkem našeho snažení by měly být jednoduché stopky, které budou postupně počítat vteřiny.
Čtyřmístný LED zobrazovač, který nyní budeme používat, vlastně odpovídá předchozímu sedmisegmentovému zobrazovači, jen obsahuje čtveřici společných vstupů (společná anoda nebo katoda dle typu), kterými se nastavuje jeden ze čtyř LED zobrazovačů, která má aktuálně svítit. V daný okamžik se tedy může zobrazovat jenom jedna číslice. Jak tedy na čtyřmístném LED zobrazovači zobrazit čtyři číslice najednou? Jelikož je lidské oko poměrně pomalé, můžeme při velmi rychlém střídání zobrazených čísel na jednotlivých místech zobrazovače vnímat zároveň rozsvícené všechny čtyři zobrazovače. A všechny při tom mohou zobrazovat zcela jinou číslici.
Opět je třeba zjistit, jaký typ zobrazovače je v naší sadě (zda CC nebo CA). Postup je stejný jako v předešlé lekci. Následující obrázek ukazuje rozložení vývodů zobrazovače, vývody d1
–d4
jsou společné vývody (tedy buď společná anoda, nebo katoda). Proti jednomu z těchto vývodů je třeba zkoušet rozsvítiti některý ze segmentů pomocí knoflíkové 3 V baterie. Opět je třeba si dát pozor na zbytečně dlouhé rozsvícení LED segmentu!
Krok 1: Sestavíme si obvod podle následujícího obrázku nebo schématu. Oproti předchozí lekci zde není třeba rozdělovat zapojení podle použitého typu zobrazovače (CC nebo CA). Společné vývody d1
–d4
jsou připojeny k digitálním výstupům modulu Arduino, typ zobrazovače tedy ošetříme softwarově nastavenou výstupní úrovní na těchto pinech. Zapojení mezi 4× LED zobrazovačem a modulem Arduino uvádí tabulka.
Blokové schéma
Elektronické schéma
4× LED zobrazovač |
Modul Arduino |
---|---|
A | 2 |
B | 3 |
C | 4 |
D | 5 |
E | 6 |
F | 7 |
G | 8 |
DP | 9 |
D1 | 10 |
D2 | 11 |
D3 | 12 |
D4 | 13 |
Krok 2: V prostředí mBlock vytvoříme následující program. Asi bude dobré opět program vytvořit „odzadu“, tedy nejdříve od jednotlivých podprogramů (vyberMisto
, rozsvit
a zobrazCislici
), pak dokončit hlavní program.
Celý program včetně podprogramu lze stáhnout z:
http://
Obecná obsluha sedmisegmentového LED zobrazovače vychází z principu, který jsme si ukázali v minulé lekci. Tedy ze dvou podprogramů – jeden slouží k rozsvícení zadaných segmentů LED zobrazovače a druhý pro zobrazení zadané číslice. Oproti předchozímu programu zde ale došlo k určitému vylepšení, aby i tato část kódu ukázala, že je stále co zlepšovat.
Podprogram rozsvit
, který má za úkol dle zadaných vstupních parametrů rozsvítit jednotlivé segmenty LED zobrazovače, byl nyní na svém začátku rozšířen o bloky zhasnutí všech segmentů (modré bloky nastavení digitálních výstupů na začátku každé sekce typu zobrazovače). Díky tomu, můžeme nyní tento podprogram používat bez podprogramu pro úplné zhasnutí zobrazovače – v předchozí lekci jsme kvůli tomu měli speciální podprogram clear
(zde již není třeba). Jinak se podprogram rozsvit
nezměnil. Stále je to jen systém vzájemně navazujících podmínek, které testují vstupní parametry odpovídající daným segmentům (A
, B
, …, DP
) zobrazovače a které pak rozsvěcejí dané segmenty.
Druhá změna proběhla v podprogramu pro zobrazení číslice na zvoleném zobrazovači. Tento podprogram se nyní jmenuje zobrazCislici
(oproti názvu digital
z minulé lekce), což ale není tak důležité. Především je třeba se podívat na funkční strukturu podprogramu. Kromě absence příkazů pro zhasnutí zobrazovače (viz předešlý odstavec) je vidět, že tento podprogram je nyní tvořen sérií vzájemně vnořených podmínek. Uvědomíme-li si, jak pracoval v předchozí lekci podprogram digital
, vidíme, zde určitou neefektivitu. Vstupní parametr určoval, která číslice se má zobrazit. Následovala série na sebe navazujících podmínek, kde se testoval tento parametr. Pokud došlo ke shodě, došlo k zobrazení. Struktura podmínek, které stále na sebe navazovaly, však zapříčinily, že docházelo k testování všech deseti znaků (0–9), i když logicky byl zobrazen jen jeden. Například pokud se zobrazila číslice 1, nadále byl zbytečně testován případ pro číslice 2, 3, …, 9. Přitom bylo jasné, že tyto podmínky už prostě nemohou být splněny. To nutí procesor dělat zbytečnou práci a zbytečně snižuje výpočetní výkon systému. Pokud však podmínky do sebe vnoříme tak, že každá následující je ve větvi „jinak“, je kaskáda následujících podmínek prováděna jen, pokud byla předchozí podmínka nesplněna. Takže, pokud je vstupním parametrem zadáno, že se má zobrazit číslice 1, případy 2, 3, … 9 již testovány nebudou (leží v jiné větvi programu).
Pozorný čtenář se ale jistě všiml dalšího rozdílu podprogramu zobrazCislici
oproti podprogramu digital
(z minulé lekce), a to je druhý vstupní parametr – tecka
. Jelikož v tomto programu, kde chceme simulovat stopky, chceme zobrazovat nejen počet sekund, ale i jejich desetin, je třeba zobrazit za některou z číslic desetinnou tečku. To právě zařizuje vstupní parametr tecka
. Parametr tecka
je v podprogramu zobrazCislici
předán podprogramu rozsvit
jako parametr pro rozsvícení desetinné tečky. Je-li tedy parametr tecka
nastaven na 0, dojde k zobrazení číslice bez desetinné tečky (stejně, jako v předchozí lekci). Naopak pro vstupní hodnotu vyšší než 0 (např. 1) bude zadaná číslice na daném místě LED zobrazovače rozsvícena s desetinnou tečkou.
Čistě pro zájemce doporučujeme se vrátit k předešlé lekci a zkusit si podle výše popsaných principů předělat podprogramy „digit“ a „rozsvit“. Získáme tím univerzálnější podobu programu a ušetříme proceduru „clear“.
Hlavní program má dva základní úkoly: zaprvé měřit uběhlý čas, zadruhé obsluhovat všechny čtyři LED zobrazovače a zobrazovat na ně příslušné symboly. Jelikož pracujeme se čtyřnásobným zobrazovačem, musí být před zobrazením výstupu zvoleno místo, na kterém se má zadaný symbol zobrazit. K tomuto účelu máme podprogram vyberMisto
, jehož vstupní parametr zobrazovac
určí, který společný vývod daného zobrazovače má být připojen. Jedná se tedy o sérii podmínek, které dle vstupního parametru a typu zobrazovače zapojí na výstupní digitální pin společných vývodů jednotlivých zobrazovačů potřebnou výstupní úroveň. Například pro zobrazení číslice na prvním zobrazovači (typ CC) je potřeba jeho společný vývod nastavit na nízkou úroveň (LOW) a společné vývody ostatních tří zobrazovačů nastavit na vysokou úroveň (HIGH). Tím máme vyřešené zobrazování hodnoty času. Teď jej ještě musíme změřit.
V hlavním programu využijeme pro měření času programového bloku obsluhující interní časovač modulu Arduino s pomocí pracovní proměnné n
. Obě tyto hodnoty na začátku programu nastavíme na hodnotu 0. Do proměnné n
je postupně dosazován desetinásobek hodnoty interního časovače (jako celé číslo), čímž získáváme počet desetin sekund uplynulých od spuštění programu. Z této hodnoty je postupně získáván počet desetin sekundy (zbytek po dělení 10), počet sekund (zbytek po dělení 100) vydělený deseti a převeden na celé číslo, počet desítek sekund (zbytek po dělení 1000) vydělená deseti a převeden na celé číslo a pochopitelně počet stovek sekund (proměnná n
vydělená 1000 a převedeno na celé číslo). A to jsou právě ty číslice, které budeme podprogramem zobrazCislici
postupně vypisovat na LED zobrazovače. Nesmíme zapomenout za zobrazovačem odpovídajícímu počtu sekund rozsvítit desetinnou tečku hodnotou 1 vstupního parametru tecka
. Po zobrazení každé číslice program počká na 5 ms, aby jej mohlo oko dobře zaznamenat, pak následuje zobrazení další číslice. Výsledným efektem je zobrazení všech 4 číslic odpovídajícím uplynulému času.
Poslední podmínka v nekonečné smyčce „opakuj stále“ hlavního programu testuje hodnotu proměnné na překročení hodnoty 9999 (čas 999,9 s). Při překročení tohoto maximálního času dojde k vynulování interního časovače modulu Arduino i proměnné n
. Čas pak běží opět od nuly.
Krok 3: Zkompilujeme kód a nahrajeme do modulu Arduino tlačítkem .
Krok 4: Nyní můžeme vidět, jak na všech čtyřech místech LED zobrazovače se postupně zobrazuje hodnota běžícího času, včetně desetin vteřiny. Také ale můžeme vidět, že na prvních místech se zobrazuje číslice 0 – například 002.3
. To není moc hezké. Což takhle se zamyslet a upravit programový kód, aby zobrazovaný formát času byl bez těch nul na začátku!