V dnešním dílu seriálu článků o desce TinyLab se podíváme, jak se dá ovládat sedmisegmentový displej, který je na ní připojený. Na začátku si projdeme trochu teorii k sedmisegmentovým displejům a poté si ukážeme ovládání. Pokud chcete teorii přeskočit, jděte rovnou na část „Jak se to ovládá?“.
Sedmisegmentový displej
Sedmisegmentovka není nic jiného, než 7 ledek zatavených do jednoho pouzdra, které jsou poskládané do podoby znaku. Jednotlivým částem, které znak tvoří a které můžeme nezávisle rozsvěcovat, říkáme segmenty. Některé displeje mají navíc ještě jednu LED pro desetinnou tečku.
Vnitřní zapojení LED v displeji je většinou takové, že ledky sdílejí jednu z nožiček (pinů). Pokud je to ta, ke které připojujeme kladné napětí, jedná se o displeje se společnou anodou. Pokud spojíme ty, které připojujeme k zemi, získáme displej se společnou katodou. Zapojení se může lišit podle typu displeje i výrobce. Na obrázku níže vidíme jedno z možných zapojení LED v displeji. Jedná se o displej se společnou anodou.
Kdybychom chtěli na displeji z tohoto obrázku rozsvítit číslici nula, připojili bychom piny 3 a 8 (nebo alespoň jeden z nich) přes rezistor k 5V a piny 9, 7, 6, 4, 2, 1 k zemi.
Více číslic
Když chceme mít více, než jednu číslici, můžeme sáhnout po displeji, který v sobě kombinuje více takovýchto jednočíslicových displejů.
V rámci šetření pinů jsou v pouzdře opět některé piny spojené dohromady. V tomto případě spojujeme piny všech číslic, které ovládají jeden segment. Přináší to s sebou sice nutnost ovládat číslice postupně (vždy na jedné rozsvítíme požadovanou číslici, zhasneme, jdeme na další a když toto děláme dostatečně rychle, lidské oko si ničeho nevšimne), ale ušetří nám tento přístup spoustu pinů.
Na ovládání takového displeje tak potřebujeme 14 pinů, což může být pro některé aplikace pořád moc velké číslo.
Jde ušetřit ještě více pinů?
Ale jistě! Musíme ale přizvat na pomoc nějaký čip, ke kterému displej připojíme a on se nám postará o jeho řízení. Jemu pak posíláme pouze příkazy typu: „piny 1 až 13 připoj k 5V, pin 14 k zemi“, popřípadě u chytřejších čipů: „na druhé číslici zobraz jedničku“, „zhasni se“, atd. Jedním z čipů, který můžeme použít, je MAX7219, který najdeme i na desce TinyLab. K jeho ovládání nám stačí připojit tři vodiče (komunikuje přes sběrnici SPI, ale to není podstatné) a to už je pěkná úspora pinů oproti původním čtrnácti.
Jak se to ovládá?
Než začneme ovládat displej na TinyLabu, musíme zapnout potřebné přepínače. Jsou to ty u pinů 10, 11, 12. Také musíme přepnout trojici přepínačů pod sedmisegmentovým displejem do pozice „To Control 7-Segment“.
Pro Arduino existuje knihovna LedControl, kterou už jsme si do Arduino IDE přidali v tomto článku. Nejjednodušší bude si ukázat její použití na příkladu, ve kterém bude TinyLab počítat od 0 do 9999.
#include "LedControl.h" // na kterých pinech máme připojený čip MAX7219 // poslední jednička značí, máme připojený jeden čip // čipy MAX7219 totiž můžeme řetězit za sebe a ovládat tak více displejů LedControl lc = LedControl(10, 12, 11, 1); void setup() { // po zapnutí napájení je MAX v úsporném režimu // musíme ho nejdříve probudit // nula značí adresu zařízení lc.shutdown(0, false); // nastavíme jas displeje (možné hodnoty jsou 0 až 15) lc.setIntensity(0,8); // pro jistotu smažeme vše, co by bylo na displeji zobrazené lc.clearDisplay(0); } // vrátí číslici na dané pozici číslované zprava byte digitOnPosition(int num, byte pos) { for(byte i = 0; i < pos; i++) { num /= 10; } return num % 10; } void loop() { for(int i = 0; i < 9999; i++) { // které číslo zobrazit for(int j = 0; j < 4; j++) { // na jaké pozici (0 je nejvíce vlevo) byte digit = digitOnPosition(i, j); // na zařízení s adresou 0 na znaku 3-j nastav číslici digit // false značí, že se nemá zobrazit desetinná tečka u této číslice lc.setDigit(0, 3 - j, digit, false); } delay(10); } }
Knihovna také umí zobrazit znaky, ale jenom ty, které jdou dobře zobrazit na displeji.
0 1 2 3 4 5 6 7 8 9
A a
-> AB b
-> bC c
-> cD d
-> dE e
-> EF f
-> FH h
-> HL l
-> LP p
-> P-
. ,
-> rozsvítí desetinnou tečku_
mezera
#include "LedControl.h" LedControl lc = LedControl(10, 12, 11, 1); char chars[] = {'A', 'B', 'C', 'D', 'E', 'F', 'H', 'L', 'P', '-', '.', '_', ' '}; void setup() { lc.shutdown(0, false); lc.setIntensity(0,8); lc.clearDisplay(0); } void loop() { for(int i = 0; i < 13; i++) { lc.setChar(0, 0, chars[i], false); lc.setChar(0, 1, chars[i], false); lc.setChar(0, 2, chars[i], false); lc.setChar(0, 3, chars[i], false); delay(500); } }
Více informací k této knihovně najdete zde.
A to je pro dnešek vše. Máte nějaké dotazy? Zeptejte se v komentářích, nebo na našem fóru.