19. díl o Arduinu – 4. bitový sedmisegmentový displej

V minulém díle jsme si něco řekli o tom, jak se zapojují LED diody do matice. Vše, co jsme se v minulém díle naučili, se nám nyní bude hodit, protože se dnes pokusíme zapojit 4bitový sedmisegmentový displej, který právě maticového zapojení využívá. Displej má většinou 12 pinů s tím, že společný vývod je buď katoda anebo anoda. Například u mého displeje jsou piny 6, 8, 9 a 12 anody a zbylé piny, tedy 1,2,3,4,5,7,10,11 slouží pro segmenty a tečku a jsou katody. To znamená, že pokud se rozhodnete tento displej používat, můžete jej otestovat tak, že k anodě přivedete + a k některému ze segmentů mínus. Tedy například že k pinu 6 přivedete od digitálního pinu napětí a přes odpor z pinu třeba 2 to připojíte zpět k Arduinu na místo, označené jako GND, tím se rozsvítí jeden segment v některé z číslic. Pokud k zemi přivedete více segmentů, v té samé číslici se vám rozsvítí více segmentů a pokud přivedete napětí i k dalším číslicím, ty samé segmenty, jaké máte rozsvícené v té, která teď svítí, se rozsvítí i na té další.

IMG_4567

To vše tedy znamená, že pokud se rozhodneme rozsvěcovat jednotlivá čísla, budeme muset dělat to, co bylo napsáno na konci minulého dílu, tedy rozsvítit jednu diodu, zhasnout ji a pak rozsvítit jinou a takhle na střídačku s nimi blikat.

Tentokrát ale nebudeme takto blikat pouze s jednou jedinou diodou, ale těch diod budeme používat v jednom bliknutí více, resp. přesně tolik, kolik segmentů je zapotřebí k vykreslení konkrétní číslice. Pokud budeme vykreslovat jedničku, budou svítit jen dva segmenty, pokud dvojku, těch segmentů bude celkem pět. Pokud budeme vykreslovat číslici 45, budeme na střídačku blikat v předposlední číslici se čtyřmi segmenty a v poslední číslici s pěti segmenty. Pokud tedy toto budeme dělat dostatečně rychle, lidské oko nic nepostřehne a na displeji to bude vypadat, že svítí číslice 45, i když tomu ve skutečnosti tak není.

Pokud tedy budeme chtít vykreslit na tomto displeji číslo 1234, budeme muset nejdříve na první číslici vykreslit jedničku, pak na druhé číslici dvojku, potom na třetí číslici trojku a nakonec na čtvrté číslici čtyřku. Tímto dostatečně rychlým opakováním docílíme správného efektu, ale dost o teorii, pojďme se na vše podívat prakticky.

Jako v každém díle začneme nejdříve základní deklarací proměnných, tentokrát ale něco lehce změníme. Uděláme něco nového, co jsme předtím nedělali. Vytvoříme proměnné, ve kterých budeme mít uloženo, o jaké segmenty displeje se jedná.

Na začátek celého kódu, aniž bychom to vložili do kterékoliv funkce tak deklarujeme toto:

int digit1 = 37;

int digit2 = 34;

int digit3 = 33;

int digit4 = 30;

 

int segA = 43;

int segB = 44;

int segC = 52;

int segD = 51;

int segE = 48;

int segF = 40;

int segG = 47;

Tímto kódem neuděláme nic jiného, než že vytvoříme několik proměnných, které mají určitou hodnotu. První čtyři budeme používat pro čtyři čísla displeje a těch dalších sedm bude pro jednotlivé segmenty. Jak jsem již na začátku tohoto dílu řekl, budeme překreslovat několik diod a přepínat mezi nimi. Právě kvůli ulehčení si vytvoříme toto, protože to bude o hodně jednodušší.

Pokud se rozhodnete někdo z vás na tento pokus použít desku UNO, jde to. Není problém například na některé segmenty použít analogové vstupy. Jen místo čísla pinu napíšete třeba A0, A1 atd. Tímto můžete použít i analogové vstupy na desce, kterou máte. Teď se pustíme do funkce setup() ve které nastavíme všechny výše deklarované proměnné tak, že se jedná o piny a přiřadíme jim, k čemu jsou, tedy:

pinMode(segA, OUTPUT);

pinMode(segB, OUTPUT);

pinMode(segC, OUTPUT);

pinMode(segD, OUTPUT);

pinMode(segE, OUTPUT);

pinMode(segF, OUTPUT);

pinMode(segG, OUTPUT);

 

pinMode(digit1, OUTPUT);

pinMode(digit2, OUTPUT);

pinMode(digit3, OUTPUT);

pinMode(digit4, OUTPUT);

Obdobným způsobem budeme využívat v dalších funkcích toho, že přesně víme, co konkrétní řádek dělá. Do teď jsme vždy místo názvu proměnné používali číslo pinu, což by u takto složité věci už mohlo být značně zavádějící. Nejdůležitějším na tom je to, abyste opravdu podle schématu vašeho displeje zapojili přesně ten pin, který jste si pojmenovali a aby při jeho zapojení se právě ten segment rozsvítil. Pokud toto neuděláte, tato deklarace nemá žádný smysl! Nyní se podíváme na dvě jednoduché funkce, které si budou pomáhat, ta jedna bude na zapínání segmentů, ta druhá na pouštění čísel. Tedy jedna bude hlavní, ta, které předáme číslo, co chceme zobrazit a ta druhá jí bude jen pomáhat.

Ta, která jí bude pouze pomáhat, se bude jmenovat zapni_segmenty() a její kód můžeme napsat třeba takto:

void zapni_segmenty(int cislo_displeje) {

#define SEGMENT_ON  LOW

#define SEGMENT_OFF HIGH

 

switch (cislo_displeje){

case 0:

digitalWrite(segA, SEGMENT_ON);

digitalWrite(segB, SEGMENT_ON);

digitalWrite(segC, SEGMENT_ON);

digitalWrite(segD, SEGMENT_ON);

digitalWrite(segE, SEGMENT_ON);

digitalWrite(segF, SEGMENT_ON);

digitalWrite(segG, SEGMENT_OFF);

break;

case 1:

digitalWrite(segA, SEGMENT_OFF);

digitalWrite(segB, SEGMENT_ON);

digitalWrite(segC, SEGMENT_ON);

digitalWrite(segD, SEGMENT_OFF);

digitalWrite(segE, SEGMENT_OFF);

digitalWrite(segF, SEGMENT_OFF);

digitalWrite(segG, SEGMENT_OFF);

break;

case 2:

digitalWrite(segA, SEGMENT_ON);

digitalWrite(segB, SEGMENT_ON);

digitalWrite(segC, SEGMENT_OFF);

digitalWrite(segD, SEGMENT_ON);

digitalWrite(segE, SEGMENT_ON);

digitalWrite(segF, SEGMENT_OFF);

digitalWrite(segG, SEGMENT_ON);

break;

case 3:

digitalWrite(segA, SEGMENT_ON);

digitalWrite(segB, SEGMENT_ON);

digitalWrite(segC, SEGMENT_ON);

digitalWrite(segD, SEGMENT_ON);

digitalWrite(segE, SEGMENT_OFF);

digitalWrite(segF, SEGMENT_OFF);

digitalWrite(segG, SEGMENT_ON);

break;

case 4:

digitalWrite(segA, SEGMENT_OFF);

digitalWrite(segB, SEGMENT_ON);

digitalWrite(segC, SEGMENT_ON);

digitalWrite(segD, SEGMENT_OFF);

digitalWrite(segE, SEGMENT_OFF);

digitalWrite(segF, SEGMENT_ON);

digitalWrite(segG, SEGMENT_ON);

break;

case 5:

digitalWrite(segA, SEGMENT_ON);

digitalWrite(segB, SEGMENT_OFF);

digitalWrite(segC, SEGMENT_ON);

digitalWrite(segD, SEGMENT_ON);

digitalWrite(segE, SEGMENT_OFF);

digitalWrite(segF, SEGMENT_ON);

digitalWrite(segG, SEGMENT_ON);

break;

case 6:

digitalWrite(segA, SEGMENT_ON);

digitalWrite(segB, SEGMENT_OFF);

digitalWrite(segC, SEGMENT_ON);

digitalWrite(segD, SEGMENT_ON);

digitalWrite(segE, SEGMENT_ON);

digitalWrite(segF, SEGMENT_ON);

digitalWrite(segG, SEGMENT_ON);

break;

case 7:

digitalWrite(segA, SEGMENT_ON);

digitalWrite(segB, SEGMENT_ON);

digitalWrite(segC, SEGMENT_ON);

digitalWrite(segD, SEGMENT_OFF);

digitalWrite(segE, SEGMENT_OFF);

digitalWrite(segF, SEGMENT_OFF);

digitalWrite(segG, SEGMENT_OFF);

break;

case 8:

digitalWrite(segA, SEGMENT_ON);

digitalWrite(segB, SEGMENT_ON);

digitalWrite(segC, SEGMENT_ON);

digitalWrite(segD, SEGMENT_ON);

digitalWrite(segE, SEGMENT_ON);

digitalWrite(segF, SEGMENT_ON);

digitalWrite(segG, SEGMENT_ON);

break;

case 9:

digitalWrite(segA, SEGMENT_ON);

digitalWrite(segB, SEGMENT_ON);

digitalWrite(segC, SEGMENT_ON);

digitalWrite(segD, SEGMENT_ON);

digitalWrite(segE, SEGMENT_OFF);

digitalWrite(segF, SEGMENT_ON);

digitalWrite(segG, SEGMENT_ON);

break;

case 10:

digitalWrite(segA, SEGMENT_OFF);

digitalWrite(segB, SEGMENT_OFF);

digitalWrite(segC, SEGMENT_OFF);

digitalWrite(segD, SEGMENT_OFF);

digitalWrite(segE, SEGMENT_OFF);

digitalWrite(segF, SEGMENT_OFF);

digitalWrite(segG, SEGMENT_OFF);

break;

}

}

První dva řádky, které začínají slovem #define zde být nemusí, a jako druhý parametr se pak jen natvrdo napíše HIGH a nebo LOW. Nicméně existují displeje, který mají stejně piny, jsou stejně veliké, prostě k nerozeznání a jedny mají společnou katodu a druhou anodu. Pokud si kód napíšete takto a vyměníte jej za ten druhý typ, což se může velmi snadno stát, změna na druhý typ je opravdu velmi jednoduchá. Jen se to přepíše na dvou řádcích a je hotovo, v tom druhém případě, kdy to budete mít v každém řádku napsáno natvrdo, tak budeme muset ručně každý řádek změnit, což je opravdu na hodně dlouho. Proto si myslím, že takto je to pro tento účel o dost lepší. Úplně stejného výsledku se dá použít funkcí IF a několikrát podmínku s ELSE IF a tak podobně, ale toto je o dost lepší. Hlavně je to o dost rychlejší, což sice nepoznáme, ale kdybychom dělali nějaký obrovský projekt, tak vědět že je tato metoda rychlejší se nám určitě vyplatí a to nejen pro programování na Arduinu.

K této funkci tedy ještě vytvoříme funkci zobraz_cislo, která bude získávat z hlavní funkce loop() číslo, které se má zobrazit. Funkce není ani moc dlouhá a rozsáhlá a vypadá přibližně takto:

void zobraz_cislo(int cislo){

#define DIGIT_ON HIGH

#define DIGIT_OFF LOW

#define svitivost 5

int jedna;

int dva;

int tri;

int ctyry;

if(cislo>=0 && cislo<10){

digitalWrite(digit1, DIGIT_OFF);

digitalWrite(digit2, DIGIT_OFF);

digitalWrite(digit3, DIGIT_OFF);

digitalWrite(digit4, DIGIT_ON);

zapni_segmenty(cislo);

delay(svitivost);

digitalWrite(digit4, DIGIT_OFF);

}else if(cislo>=10 && cislo<100){

digitalWrite(digit1, DIGIT_OFF);

digitalWrite(digit2, DIGIT_OFF);

jedna = cislo / 10;

dva = cislo % 10;

digitalWrite(digit3, DIGIT_ON);

zapni_segmenty(jedna);

delay(svitivost);

digitalWrite(digit3, DIGIT_OFF);

digitalWrite(digit4, DIGIT_ON);

zapni_segmenty(dva);

delay(svitivost);

digitalWrite(digit4, DIGIT_OFF);

}else if(cislo>=100 && cislo<1000){

digitalWrite(digit1, DIGIT_OFF);

jedna = cislo / 100;

dva = cislo % 100;

digitalWrite(digit2, DIGIT_ON);

zapni_segmenty(jedna);

delay(svitivost);

digitalWrite(digit2, DIGIT_OFF);

tri = dva % 10;

dva = dva / 10;

digitalWrite(digit3, DIGIT_ON);

zapni_segmenty(dva);

delay(svitivost);

digitalWrite(digit3, DIGIT_OFF);

digitalWrite(digit4, DIGIT_ON);

zapni_segmenty(tri);

delay(svitivost);

digitalWrite(digit4, DIGIT_OFF);

}else if(cislo>=1000 && cislo <10000){

jedna = cislo / 1000;

dva = cislo % 1000;

digitalWrite(digit1, DIGIT_ON);

zapni_segmenty(jedna);

delay(svitivost);

digitalWrite(digit1, DIGIT_OFF);

tri = dva % 100;

dva = dva / 100;

digitalWrite(digit2, DIGIT_ON);

zapni_segmenty(dva);

delay(svitivost);

digitalWrite(digit2, DIGIT_OFF);

ctyry = tri % 10;

tri = tri / 10;

digitalWrite(digit3, DIGIT_ON);

zapni_segmenty(tri);

delay(svitivost);

digitalWrite(digit3, DIGIT_OFF);

digitalWrite(digit4, DIGIT_ON);

zapni_segmenty(ctyry);

delay(svitivost);

digitalWrite(digit4, DIGIT_OFF);

}else{

//error - protože se jedná o číslo, které není možné na tomto displeji zobrazit

}

}

Tento kód vypadá sice hrozně, ale jde dost zjednodušit, funkce, která udělá, dá se říci to samé, jako ta předchozí vypadá takto, ale je na pochopení o něco složitější.

void zobraz_cislo(int toDisplay) {

#define DISPLAY_BRIGHTNESS  500

#define DIGIT_ON  HIGH

#define DIGIT_OFF  LOW

long beginTime = millis();

for(int digit = 4 ; digit > 0 ; digit--) {

switch(digit) {

case 1:

digitalWrite(digit1, DIGIT_ON);

break;

case 2:

digitalWrite(digit2, DIGIT_ON);

break;

case 3:

digitalWrite(digit3, DIGIT_ON);

break;

case 4:

digitalWrite(digit4, DIGIT_ON);

break;

}

zapni_segmenty(toDisplay % 10);

toDisplay /= 10;

delayMicroseconds(DISPLAY_BRIGHTNESS);

zapni_segmenty(10);

digitalWrite(digit1, DIGIT_OFF);

digitalWrite(digit2, DIGIT_OFF);

digitalWrite(digit3, DIGIT_OFF);

digitalWrite(digit4, DIGIT_OFF);

}

while( (millis() - beginTime) < 10) ;

}

Tato funkce udělá úplně to samé, jako ta dlouhá, předchozí, ale pro začátečníky je o dost těžší pochopit, copak ta první je sice dlouhá, ale pochopí jí naprosto každý. Teď už jen stačí z hlavní funkce loop() zavolat funkci zobraz_cislo s hodnotou nějakého čísla, například:

zobraz_cislo(1234);

A po nahrání do Arduina se na displeji zobrazí číslo 1234. Teď by se ještě (jako je to mým zvykem) hodilo, na konec dílu vytvořit cyklus, který bude vypadat třeba takto:

zobraz_cislo(i);

i++;

if(i>9999){

i = 0;

}

delay(5);

Tímto zobrazíme všechny čísla od 0 – 9999. Stejně jako v následujícím videu.


1. díl o Arduinu - Historie

Arduino je open-source platforma určená pro navrhování hraček a rychlou tvorbu prototypů nejrůznějších součástek. Platforma je založena na mikro-kontrolorech ATMega od firmy Atmel a grafickém vývojovém prostředí, které dá se říci, vychází z prostředí Wiring.

2. díl o Arduinu - typy desek

V současné době je na trhu opravdu velké množství nejrůznějších desek, které lze pro projekty v Arduinu použít. Některé jsou velmi vhodné, jiné vám budou způsobovat vrásky na čele. Jde totiž sehnat desku, pro jejíž programování je zapotřebí externí převodník, protože se sama přímo nedá připojit k PC.

3. díl o Arduinu - speciální typy desek

V minulém díle jsme se zaměřili na základní typy desek, na kterých je možné stavit projekty Arduino. Nyní se však pokusím zaměřit na speciální typy desek, které svůj účel mají, dá se říci svým způsobem předurčen. Jde totiž o desky, které nebudete potřebovat tak často, jako ty předchozí, ale v případě některých je dobré vědět, že existují, protože výsledné prototypování je díky nim o dost jednodušší.

4. díl o Arduinu – Shieldy

Arduino samo o sobě v některých verzích obsahuje různá vylepšení základní verze, viz mutace Arduina Uno na desky Ethernet nebo Bluetooth. Jako příklad si uvedeme připojení k Wi-Fi u stolního počítače.

5. díl o Arduinu – Seznamujeme se s deskou UNO

Než se pustíme do jakéhokoliv programování, popíšeme si trochu jednu z těch desek, kterou budeme ze začátku používat pro projekty. Touto deskou bude Arduino Uno. Arduino Uno je základní deska, která dovede pohánět všechny projekty, na kterých se budeme s Arduinem seznamovat.

6. díl o Arduinu – Připojujeme Arduino k PC a instalujeme IDE

Vývojové prostředí pro Arduino je napsané v jazyce Java. To znamená, že je dostupné pro všechny platformy, na kterých je Java dostupná, z těch hlavních zmíním Windows, Linux a Mac OS X, protože pro ty je již připravená instalace na oficiálních stránkách Arduina.

7. díl o Arduinu – První aplikace

Po minulém díle již máme Arduino plně připojené k PC a je plně funkční. Nyní se tedy podíváme na to, jak vytvořit úplně první program, který na našem Arduinu budeme spouštět.

8. díl o Arduinu - Bastldeska

V minulém díle jsme si představili jednoduchou aplikaci. Byl to, dá se říci počátek všeho, co je zapotřebí pro to, abychom na Arduinu začali cokoliv dělat. A tak po stopách předchozího dílu se nyní podíváme na to, jak k Arduinu připojit skutečnou LED diodu, abychom nebyli omezeni pouze na tu jednu, která je připojena k pinu číslo 13 v případě desky UNO.

9. díl o Arduinu - Připojujeme LED diodu

V předminulém díle jsme si vysvětlili, jak Arduino pracuje a vytvořili jsme jednoduchý program, který nám rozblikal diodu, která byla připojena k pinu číslo 13 přímo na desce Una.

10. díl o Arduinu - Připojujeme LED diody seriově

V minulém díle jsme připojovali jen jednu LED diodu, nyní se ale podíváme na to, jak zapojit více diod tak aby svítily společně a aby jejich zapojení bylo sériové. Sériovým zapojením se rozumí, že diody budou zapojeny za sebou. To znamená, že do této větve dvou diod bude zapotřebí umístit jen jeden jediný odpor.

11. díl o Arduinu - připojujeme LED diody paralelně

Po vzoru předchozího dílu, kdy jsme připojovali dvě diody sériově s odporem na Arduino a jednoho před ním, kdy jsme připojovali pouze jednu LED diodu s odporem, se dnes podíváme na to, jak správně zapojit LED diody paralelně.

12. díl o Arduinu - Připojujeme LED diody sériovoparalelně

V minulých dílech jsme si řekli všechno o tom, jak se připojují LED diody sériově i paralelně. Nyní nastal čas, abychom diody zapojili oběma způsoby najednou. To vše z toho důvodu, že například takto jsou zapojeny diody v LED páscích, proto je možné je stříhat.

13. díl o Arduinu - Blikáme LED diody napřeskáčku

O tom, jak zapojit LED diody víme již snad vše, nepřekvapí nás sériové zapojení, nezapotíme se u paralelního a kombinace obou najednou, je už také za námi. Nyní se ale podíváme na to, jak připojit dvě diody nezávisle na sobě, budeme tedy tvořit dva okruhy, kdy každý bude ovládaný zvlášť.

14. díl o Arduinu - Knight rider

Po vzoru předchozího dílu, kdy jsme sepínali diody proti sobě na dvou okruzích, se dnes podíváme na to, jak vytvořit světlo, které mělo auto se jménem K.I.T.T. ze seriálu Knight Rider. Způsobů by se jistě našlo více, nicméně ten, který se zde pokusím popsat je podle mě ten nejjednodušší.

15. díl o Arduinu - 1. bitový sedmisegmentový displej

O LED diodách a Arduinu již víme vše, nyní tedy trochu postoupíme a pokusíme se zapojit sedmi-segmentový displej a budeme na něm zobrazovat číslo. Tento displej se tedy skládá ze sedmi segmentů, respektive z osmi, pokud počítáme i tečku, které jsou označeny písmeny od A do G.

16. díl o Arduinu - 1. bitový sedmisegmentový displej - loading effect

V minulém díle jsme si připojili jeden sedmisegmentový displej, který dovedl zobrazit pouze jedno jediné číslo. Na tomto displeji jsme pak následně zobrazili číslice od 0-9. Nyní se však podíváme na jednoduchý kód, který by nám měl vytvořit jednoduchý efekt, podobný tomu, který možná často vidíte, když něco načítáte.

17. díl o Arduinu - 2. bitový sedmisegmentový displej

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.

18. díl o Arduinu - maticové zapojení LED diod

V minulých dílech jsme začali displeje, které byly složeny z LED diod. Zobrazovali jsme na nich čísla a v jednom případě jsme i simulovali načítání. A i přes to, že jsem kdysi řekl, že z diod co se zapojení týče, je to snad vše, budeme se v tomto díle k nim vracet, protože existuje ještě jedno zapojení, které jsme si sice představili již dříve, ale tentokrát jej ještě trochu vylepšíme.

20. díl o Arduinu - Sériový monitor

Dnes si řekneme něco o sériovém monitoru. Arduino když pracuje, tak existuje možnost, díky které Arduino zpět počítači, ke kterému je připojeno po seriové lince posílá nejrůznější informace. Tyto informace mohou být buď hodnoty z nějakého čidla či čidel, informace o tom, jestli je dané relé sepnuté či konkrétní dioda svítí a mnoho dalšího.

21. díl o Arduinu - připojujeme senzor DHT-11

V minulém díle jsme načali sériový monitor a dnes se na něm pokusíme zobrazit první data z čidla. Čidlo, které budeme pro náš pokus používat má označení DHT-11. Tento typ čidla je velmi oblíbený, protože měří teplotu a vlhkost.

22. díl o Arduinu - připojujeme senzor DHT-22

Minule jsme si představili senzor DHT-11, který je sice velmi oblíbený, ale zároveň ne moc přesný, proto se dnes podíváme na jeho vylepšenou verzi, tedy na senzor DHT-22. Senzor DHT-22 má tyto vlastnosti.