Lekce 19
Sedmisegmentový LED zobrazovač

Úvod

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.

Použité komponenty

  • modul Arduino
  • USB kabel
  • sedmisegmentový LED zobrazovač
  • 8× rezistor (220 Ω)
  • nepájivé pole
  • vodiče pro nepájivé pole

Princip

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.

LED sedmisegmentovka

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

LED sedmisegmentovka se spolecnou katodou

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.

LED sedmisegmentovka se spolecnou anodou

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.

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. Sviti? Máme tedy zobrazovač se společnou katodou.

LED sedmisegmentovka se spolecnou katodou

LED zobrazovač se společnou katodou CC

LED sedmisegmentovka se spolecnou anodou

LED zobrazovač se společnou anodou CA


Poznámka:
Segmentem nesmíme svítit příliš dlouho, už asi vteřina trvalého svícení může diodu segmentu spálit. Napětí 3 V z baterie je příliš moc pro červenou LED, která má předepsané napětím 1,9–2 V!

Postup experimentu

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

Blokove schema

Elektronické schéma

Elektronicke schema
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.

podprogram v prostredi mBlock

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.

podprogram v prostredi mBlock

podprogram v prostredi mBlock

podprogram v prostredi mBlock

podprogram v prostredi mBlock

podprogram v prostredi mBlock

podprogram v prostredi mBlock

podprogram v prostredi mBlock

podprogram v prostredi mBlock

podprogram v prostredi mBlock

podprogram v prostredi mBlock

A na závěr konečně hlavní program:

Jak vidno, nakonec celý program včetně všech podprogramů získal skutečně na úctyhodných rozměrech!


ikona vysvetleni Vysvětlení kódu

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ň.


Logická výstavba programu, přehlednost a rozsah kódu

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

podprogram v prostredi mBlock

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ší.

podprogram v prostredi mBlock

podprogram v prostredi mBlock

podprogram v prostredi mBlock

podprogram v prostredi mBlock

podprogram v prostredi mBlock

podprogram v prostredi mBlock

podprogram v prostredi mBlock

podprogram v prostredi mBlock

podprogram v prostredi mBlock

podprogram v prostredi mBlock

A na závěr opět hlavní program a podprogram clear, které zatím nezaznamenaly žádnou změnu:

podprogram v prostredi mBlock


2. ÚPRAVA

V porovnání s předchozí verzí programu je jasně vidět, jak se těla podprogramů digital_0digital_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_0digital_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_0digital_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.

podprogram v prostredi mBlock

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:

podprogram v prostredi mBlock

podprogram v prostredi mBlock

podprogram v prostredi mBlock


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 tlacitko nahrat.

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.

Pohled na experiment