Sedmisegmentový LED zobrazovač představuje soustavu sedmi LED vytvarovaných do tvaru segmentů, ze kterých lze jejich rozsvěcením zobrazovat určité symboly. Kombinací vypnutých a zapnutých segmentů můžeme docílit zobrazení arabských číslic, hexadecimálních číslic, případně i dalších písmen a znaků. Máme-li být přesní, tak je třeba upozornit, že se sice říká „sedmisegmentový“ LED zobrazovač, ale ve skutečnosti tento modul obsahuje LED osm. Kromě sedmi segmentů pro zobrazení znaků je zde ještě kulatá LED, která představuje desetinnou tečku.
Sedmisegmentový LED zobrazovač je nejpoužívanějším případem segmentového displeje. Je vhodný pouze pro zobrazování číslic, maximálně hexadecimálních číslic A až F. Pro číslicový indikátor je minimální počet segmentů právě sedm. Takový zobrazovací modul se familiárně nazývá „sedmisegmentovka“. Na obrázku vidíme rozložení a označení jednotlivých segmentů včetně LED pro signalizaci desetinné čárky.
Diodové sedmisegmentovky mají relativně rychlou odezvu, přibližně 10 nanosekund, a spotřebu proudu od 0,5 až 1 mA na jeden segment u těch nejmenších (tzn. celá sedmisegmentovka 3,5–7 mA). Napětí anody je závislé na barvě, tedy 1,5 až 2,5 V. Aby se ovládání diod zjednodušilo, mají diody navzájem propojené anody či katody. Společná katoda (CC) a společná anoda (CA).
Sedmisegmentový displej se společnou katodou
Společná katoda (Common Cathode, CC) – všechny katody LED segmentů jsou spojeny dohromady na nízkou úroveň LOW (GND). Jednotlivé segmenty (a–g) jsou rozsvíceny tak, že anoda segmentu je zapojena na vysokou úroveň HIGH (+5 V) přes omezovací odpory.
Sedmisegmentový displej se společnou anodou
Společná anoda (Common Anode, CA) – všechny anody LED segmentů jsou spojeny dohromady na vysokou úroveň HIGH (+5 V). Jednotlivé segmenty (a–g) jsou rozsvíceny tak, že katoda segmentu je zapojena na nízkou úroveň LOW (GND) přes omezovací odpory.
Zdroj obrázků: https://
Rozdíl mezi těmito dvěma displeji, jak jejich název napovídá, spočívá v tom, že společná katoda má všechny katody 7-segmentů spojených dohromady a společná anoda má všechny anody 7-segmentů spojených dohromady.
Především je potřeba zjistit, jaký displej máme ve své experimentální sadě, zda CC nebo CA? Nejednoduší způsob je pomocí 3 V baterie CR2032, která je k dispozici v sadě MAXI Starter kit. Prostřední pin na displeji, je společný vývod – tedy buď společná katoda, nebo anoda. Zkusíme se rychle dotknout pólem „+“ baterie do společného pinu a „–“ do pinu vedle. Svítí? Pokud ano, máme zobrazovač se společnou anodou. Jestliže nesvítí, zkusíme otočit baterii a dotknout „–“ do společného pinu a „+“ do pinu vedle. Svítí? Máme tedy zobrazovač se společnou katodou.
LED zobrazovač se společnou katodou CC
LED zobrazovač se společnou anodou CA
Krok 1: Sestavíme si obvod podle následujícího obrázku nebo schématu. Následující zapojení je příklad zapojení pro CC zobrazovač. V případě CA zobrazovače je třeba zapojit společný pin na +5 V.
Blokové schéma
Elektronické schéma
LED zobrazovač CC | Modul Arduino |
---|---|
a | 7 |
b | 6 |
c | 5 |
d | 11 |
e | 10 |
f | 8 |
g | 9 |
dp | 4 |
GND | GND |
Krok 2: V prostředí mBlock vytvoříme následující program. Asi nejlepší postup pro tvorbu tohoto programu s tolika podprogramy je začít „tak trochu pozpátku“. Tedy nejdříve vytvořit podprogram clear
, který zhasíná celý zobrazovač, pak postupně podprogramy digital_0
, digital_1
, …, digital_9
pro zobrazení jednotlivých číslic. Podprogram clear
je volán ve všech podprogramech pro jednotlivé číslice, proto je třeba jen definovat dříve, než začneme vytvářet podprogramy pro rozsvícení segmentů dané číslice. Tvorbu hlavní část programu si tedy paradoxně musíme nechat až na finále.
Nyní je třeba definovat jednotlivé procedury digital_0
, digital_1
, …, digital_9
pro zobrazení jednotlivých číslic 0–9. Pracovní plocha určená pro kód v prostředí mBlock se začne poměrně rychle plnit, je třeba umisťovat jednotlivé bloky podprogramů s citem pro přehlednost.
A na závěr konečně hlavní program:
Celý program včetně podprogramu lze stáhnout z:
http://
Jak vidno, nakonec celý program včetně všech podprogramů získal skutečně na úctyhodných rozměrech!
Tento program vychází asi z prvního nápadu, podle kterého bychom program vytvořili. Je zde hlavní program, který postupně rozsvěcí čísla 0, 1, …, 9. Pro rozsvícení potřebných segmentů daného čísla je speciálně vytvořen podprogram – například pro rozsvícení číslice 0 to je podprogram digital_0
. V každém podprogramu je nejdříve celý zobrazovač zhasnut pomocí podprogramu clear
, pak jsou rozsvíceny jen ty segmenty zobrazovače, které zobrazí požadovanou číslici. Jelikož je celý program vytvořen pro oba typy LED zobrazovače, tedy se společnou anodou CA a i se společnou katodou CC. Typ zobrazovače se nastavuje pomocí proměnné CA v úvodu hlavního programu. Všechny podprogramy proto obsahují úvodní podmínku, která tyto případy rozděluje a dle potřeby nastavuje výstupní digitální piny modulu Arduino buď na vysokou (HIGH), nebo nízkou (LOW) úroveň.
Výše uvedený kód funguje, to je asi to, co by nás jako programátory mělo v prvé řadě zajímat. Otázkou je, zda výše uvedený kód programu je skutečně tím nejlepším řešením. Konkrétně při pohledu na předešlý kód nás určitě musí ohromit jeho neskutečný rozsah. Je to způsobeno tím, že program je napsán pro oba typy LED zobrazovačů, tedy CC i CA, tedy všechny podprogramy digital_0
, digital_1
, …, digital_9
obsluhují veškeré nastavení LED segmentů dvakrát (jednou pro CA, podruhé pro CC). Navíc je zde pro každou zobrazovanou číslici založen speciální podprogram. To také celkový rozsah kódu zvětší. Protože tvorba programů není jen o vytvoření funkčního kódu, což se nám teď již povedlo, ale i o jeho jednoduchosti a určité univerzálnosti, zkusíme původní rozsáhlý kód programu předělat.
Kdyby se nám podařilo vyřešit odsluhu jednotlivých segmentů LED zobrazovače jedním obecným podprogramem, mohli bychom kód podprogramů digital_0
, digital_1
, …, digital_9
buď výrazně zjednodušil, nebo dokonce zcela vynechat. Prvním pokusem o zjednodušení programu tedy bude redukce příkazových bloků v podprogramech digital_0
, digital_1
, …, digital_9
. Vytvoříme si univerzální podprogram Rozsvit
, který bude mít vstupní parametry a
, b
, c
, d
, e
, f
, g
a dp
, do kterých se bude zadávat, který ze segmentů (a–dp) má být rozsvícen. Pochopitelně podprogram Rozsvit
bude řešit i to, zda je použit zobrazovač CC nebo CA. Tím nebude třeba testovat typ zobrazovače v podprogramu každé zobrazené číslice. Úsporu kódu, zejména v podprogramech digital_0
, digital_1
, …, digital_9
, uvidíme v následujících ukázkách kódu. Jako první je pochopitelně uveden kód podprogramu Rozvit
, ve kterém dle vstupních parametrů a–dp dojde k rozsvícení daných LED segmentů (a–dp).
Pochopitelně je v kódu podprogramu Rozvit
rozdělen podle typu nastaveného zobrazovače. Je škoda, že prostředí mBlock ve svých standardních programových blocích nemá možnost zapsat na digitální výstup hodnotu proměnné, pak by bylo možné kód podprogramu Rozvit
zredukovat ještě na polovinu.
Máme-li podprogram Rozsvit
, můžeme všechny podprogramy digital_0
, digital_1
, …, digital_9
nyní napsat jen pomocí podprogramu Rozsvit
s příslušnými parametry. Jejich kód se tím výrazně zjednoduší.
A na závěr opět hlavní program a podprogram clear
, které zatím nezaznamenaly žádnou změnu:
Celý program včetně podprogramu lze stáhnout z:
http://
2. ÚPRAVA
V porovnání s předchozí verzí programu je jasně vidět, jak se těla podprogramů digital_0
až digital_9
díky použití podprogramu Rozsvit
výrazně zredukovaly. Skoro by se dalo říci, že je otázkou, zda je nutné pro tak jednoduché operace (smaž segmentovku a rozsviť zadané segmenty) mít kód rozdělen na deset podprogramů. Toto je jistě správná úvaha a ještě ji využijeme nadále. Abychom tuto optimalizaci tedy posunuli dále, zkusíme všechny tyto podprogramy nahradit jedním společným. Vytvoříme si podprogram, který by měl nahradit všech deset podprogramů digital_0
až digital_9
. Tento „univerzální“ podprogram, pojmenujme ho například digital
, bude mít vstupní parametr určující číslici, která se má zobrazit a dle toho bude volat podprogram Rozsvit
– stejně jako to doteď dělaly podprogramy digital_0
až digital_9
.
Kód podprogramu digital
bude vypadat následujícím způsobem. Vstupní parametr cislice
určuje číslici, která má být zobrazena – vlastně tím říká, zda má podprogram digital
být použit jako digital_0
… nebo digital_9
.
Výhodou podprogramu digital
je i to, že díky jeho vstupnímu parametru jej můžeme volat pomocí proměnné. Není třeba ji tedy v programovém kódu volat desetkrát za sebou, jako to bylo při volání podprogramů digital_0
… nebo digital_9
. Tím, že je možné vstupní parametr předávat pomocí proměnné hod
, jejíž hodnota se může postupně zvyšovat z hodnoty 0 na hodnotu 9, je možné tento podprogram volat opakovaně v programové smyčce. Celkový program lze tedy tímto způsobem přepsat. Tím se tedy zredukuje i hlavní kód.
FINÁLNÍ KÓD
Celkový program (včetně všech podprogramů) bude vypadat následujícím způsobem:
Celý program včetně podprogramu lze stáhnout z:
http://
Porovnejme rozsah původního kódu programu, kde jsme postupně volali deset různých podprogramů, s poslední verzí, kde je v cyklu s deseti kroky opakovaně volán univerzální podprogram s rozdílným parametrem. Je pravda, že i nyní je rozsah upraveného programu poměrně veliký, ale v porovnání s první verzí je zde výrazný rozdíl.
Tento příklad optimalizace programového kódu nám v tomto konkrétním případě měl ukázat, jak je vhodné u složitějších projektů nejdříve celý program řádně promyslet, pak zvolit „taktiku“ obecnějšího využití podprogramů a nakonec stejně celý program několikrát předělat. 😉 Nevěříte? Tak se podívejte na popis programu v následující lekci, tam je popsána ještě jedna úprava zde použitých dvou základních podprogramů (digital
a Rozvit
) pro obsluhu LED zobrazovače. A jistě by se našlo další vylepšení i tam.
Krok 3: Zkompilujeme kód a nahrajeme do modulu Arduino tlačítkem .
Krok 4: Nyní bychom měli vidět, jak na zobrazovači v sekundových intervalech postupně přeblikávají znaky 1, 2, …, 9 a 0.