V dílech minulých jsme se zaměřili na sedmisegmentový displej, který dovedl zobrazit pouze jednu číslici, zobrazili jsme na něm čísla od 0 do 9 a pak jsme si vytvořili jednoduchý načítací efekt. Možností co by se na tom dalo vytvořit, je zcela jistě hodně, nicméně vše se již odvíjí od toho, že máme nějakou šablonu a v ní měníme údaje, nicméně pokud by mě napadlo něco, co by na něm bylo ještě pěkné, jistě to později doplním.
Nyní se však pojďme podívat na to, jak se připojuje dvoubitový sedmisegmentový displej k Arduinu. Displej, který pro dnešní díl mám připravený, má úplně ty samé parametry jako ten předchozí jen s tím rozdílem, že má o jednu číslici navíc, nicméně je pro úplnost shrnu.
- Barva: červená
- max. proud na segment: 30 mA
- Výška znaku: 14,2 mm
- Úbytek napětí v propustném směru: 1,9-2,5 V
- Společný vývod: Anoda
- Počet pinů: 18
Z toho tedy vyplývá, že v každé z řad opět bude jedna anoda a tentokrát 8 katod. Displej se připojuje úplně stejně jako ten předchozí, jen s tím rozdílem, že bude zapotřebí opět daleko více odporů. Tentokrát ale nebude společná anoda vždy uprostřed, tento displej, který mám já má společnou anodu na pinu 13 a 14. Pro tento díl tedy budeme potřebovat následující, pro jeho úspěšné dokončení.
- Desku Arduino
- Sedmisegmentový displej, ale tentokrát se dvěma číslicemi
- Dva anebo 16 odporů v závislosti na tom, zda má displej společnou anodu či katodu (pro anodu 16, pro katodu stačí dva)
- Propojovací kabely
- Bastldesku
Pokud toto všechno máme, pomalu ale jistě se můžeme pustit do toho, jak displej k Arduinu připojit. Pokud jste vytvářeli předchozí díl, můžete polovinu obvodu z něj použít, stačí jen displej dát na střed, přesně tam, kde byl původní a budou se muset doplnit jen krajní piny, tedy na každé straně dva a přehodit anodu ze spodní části do horní na jiný pin, protože v dolní jí tento displej nemá. V mém případě je nemohu rovnou připojit na desku, ale musím použít opět odpory, a protože používám desku DUE, která má 3.3V. Odpory, které budu používat, mají hodnotu 47 ohmů.
Připojení tedy probíhá stejně jako u předchozího displeje, více je na fotce nahoře anebo se můžete na mne obrátit v diskusi pod tímto článkem, rád vás navedu co a jak. Nyní se tedy zaměříme hlavně na programování. Opět to vezmu část po části, ale teď toho napíši více najednou. Tedy nákres toho, ke kterým pinům mám připojen který segment a masku, díky které budu zobrazovat čísla. Je důležité si uvědomit, že čísla jsou stejná a pokud chcete používat jen jednu masku pro zobrazení, musíte mít v poli za sebou všechny piny se segmenty stejně u obou znaků, jinak budete muset pro každé číslo vytvořit masku jinou. Můj kód vypadá takto:
/*
|--30--|--------|--38--|
46--33--------29----41
|--49--|--------|--25--|
42--53--------26----34
|--45--|-(50)--|--22--|---(37)
*/
byte piny_displeje_znak_jedna[] = {46,30,33,49,42,45,53,50};
byte piny_displeje_znak_dva[] = {29,38,41,25,26,22,34,37};
byte cisla_displeje[11][7] = {
{0,0,0,1,0,0,0},//0
{1,1,0,1,1,1,0},//1
{1,0,0,0,0,0,1},//2
{1,0,0,0,1,0,0},//3
{0,1,0,0,1,1,0},//4
{0,0,1,0,1,0,0},//5
{0,0,1,0,0,0,0},//6
{1,0,0,1,1,1,0},//7
{0,0,0,0,0,0,0},//8
{0,0,0,0,1,0,0},//9
{1,1,1,1,1,1,1},//nic
};
Ve funkci setup () nastavíme všechny piny na výstup a rovnou ten pin, ke kterému máme připojeny anody, můžeme nastavit na hodnotu HIGH. To nejzajímavější, co zde však bude, je funkce pro zobrazení čísla. Já jsem jí vyřešil takto:
void zobraz_cislo(int hodnota_cisla){
if(hodnota_cisla<10){
for(int i = 0; i<7; i++){
digitalWrite(piny_displeje_znak_jedna[i], cisla_displeje[10][i]);
digitalWrite(piny_displeje_znak_dva[i], cisla_displeje[hodnota_cisla][i]);
}
}
if(hodnota_cisla>9 && hodnota_cisla<100){
int jednotky = hodnota_cisla % 10;
int desitky = (hodnota_cisla - jednotky) / 10;
for(int i = 0; i<7; i++){
digitalWrite(piny_displeje_znak_jedna[i], cisla_displeje[desitky][i]);
digitalWrite(piny_displeje_znak_dva[i], cisla_displeje[jednotky][i]);
}
}
}
Nyní trochu tuto funkci zkusím vysvětlit. Funkce přijímá jeden parametr, což je číslo, které budeme volat z funkce loop() a které se má zobrazit. Ve funkci jsou dvě podmínky. Ta první se stará o čísla 0 – 9 a ta druhá o čísla 10 – 99. V každé podmínce je pak dále cyklus, který dělá jen to, že z pole, které jsme si vybrali dříve, vybírá konkrétní pin a tomu z masky, podle které zobrazujeme, buď přidává hodnotu 0 anebo 1, což přesně reprezentuje stav LOW a HIGH. Pokud vás v tuto chvíli napadlo něco okolo TTL, napadlo vás to správně, ale o TTL se budeme bavit až později. V této funkci tedy neděláme nic jiného, než že podle masky na určité piny dáváme napětí anebo jej vypínáme.
Pokud by jste se podívali na díl kde jsme s displejem začínali, děláme to samé jako bylo v tomto kódu:
if (cislo == 0) {
digitalWrite(1, LOW);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
digitalWrite(5, LOW);
digitalWrite(6, LOW);
digitalWrite(7, HIGH);//kdyby byl zaplý
}
if(cislo == 1){
digitalWrite(1, LOW); //a tak dále…
}
//ted dlouho, dlouho nic az najednou
if(cislo == 827) {
digitalWrite(1, LOW); //přeji příjemnou zábavu
Tímto cyklem jsme tedy udělali přesně to samé, jako bychom docílili tímto šíleným kódem, se kterým bych se opravdu psát nechtěl, nicméně jsou jedinci, kteří si práci usnadnit nechtějí a tak prosím, vytvářejte dle libosti, co se vám chce, nicméně pokud se to někomu alespoň do sta povede, pochlubte se se svým kódem pod článkem. 😉
My ostatní se budeme držet cyklu nahoře a tomuto poslednímu kódu se hodně velikým obloukem vyhneme.
Kód pro zobrazení číslic tedy máme a teď již neexistuje nic snadnějšího, než funkci zobraz_cislo() zavolat z funkce loop() s nějakým parametrem, v tomto případě to bude číslo.