Lekce 8 - 7-Segmentový displej
28.02.2013 15:12V dnešním díle si k Arduinu připojíme 2 druhy 7-segmentového dipleje. V přvním případě půjde a klasické LED 7-segmentové zobrazovače a ve druhém půjde o diplej z tekutých krystalů, který jsem vyhrabal v šuplíku.
K připojení dipleje nepoužijeme klasický převdník BCD kódu pro zobrazovače, ale připojíme si ho přímo k Arduinu. V tomto případě nepoužijeme Arduinu UNO z důvodu malého počtu digitálních pinů (nadruhou stranu jich má UNO právě 14 - což umožnuje připojení 2 čislic, ale nezbyde nám další žádný volný pin). Samozřejmně i na UNO se toto dá vyzkoušet, avšach pro praktištější zapojení s dalšími vstupy a výstupy se nehodí. BCD převodník nám sice umožní připojit číslici na 4 piny, ale pro tento projekt jsem žádný v zasobě nenašel a projekt by to vytvořilo složitější a dražší.
Takže, v prvním případě použijeme displej z tekutých krystalů. Bohužel na mém dipleji jsem žádný napis nenašel, ale po delším pátrání jsem nalezl výrobce tohoto dipleje. Jedná se o firmu https://www.display-elektronik.de. Tato se zabývá výrobou dipleju, ale můj již v nabídce nemá. Vycházím však z podobných tzpů displejů výrobce. Displej má 2 a 1/2 číslice. Půlka znamená, že jedna číslice zobrazí pouze čislo 1. Celkem má 16 vývodů. Po trošce bádání jsem zjistil, že displej má společnou anodu (+) na pinu 16 a z ostatních datasheetů jsem zjistil, že pracovní napští je 3,3 až 5V. Po trošce zkoušení jsem si udělal diagram zapojení a nyní již stačí k displeji napsat potřebný kód. Podobné displeje stojí na našem trhu v této velikosti od 40 do 100 Kč.
Důležité je též si rozvrhnout jaké segmenty číslovky se mají zobrazit. Nejdříve jsem si pro čísla načtrl tabulku a tu pomocí byte[][] (třírozměrné pole byte) impementoval do funkce, která jednotlivé čislovky vykresluje.
Jak můžete v kódu vidět, možnost změny připojení je snadné provést změnou čísel pinů v nastavení jednotlivých čísel na začátku kódu. Zkusil jsem to podrobněji okomentovat, aby jste vše pochopili. Kód je optimalizovaný pro můj displej z tekutých krystalů. Pro jiné typy je potřeba provést drobné úpravy.
// -- 7 -- // | | // 1 6 // |-- 2 --| // | | // 3 5 // | | // -- 4 -- // Piny připojené k dipleji číslice 1. zprava byte Digit_1[] = {30,31,32,33,34,35,36}; //{ 1, 2, 3, 4, 5, 6, 7}; // Piny připojené k dipleji číslice 2. zprava byte Digit_2[] = {37,38,39,40,41,42,43}; // zbrazení čislovky 1 na 3. čísle zprava byte Digit_3 = 50; void setup() { InitDigit(Digit_1); InitDigit(Digit_2); } void loop() { for (int i = 0; i < 300; i++) { ShowNumber(i); delay(25) ; } } // Zobrazení čislovky pro celý displej void ShowNumber(int value) { if (value < 10) // případ čislice menší než 10 { ShowDigit(Digit_1, value); // na prvním čislovce zprava je zobrazeno číslo ShowDigit(Digit_2, 10); // vymaže na druhé čislici všechny segmenty digitalWrite(Digit_3, HIGH); // 3. čislovka se nezobrazuje (1xx) } else if ((value > 9) & (value < 100)) // číslo 10 - 99 { int desitky = (value - (value % 10))/10; //zjištění počtu desítek ShowDigit(Digit_1, value - (desitky*10)); // zobrazení 1. čisla ShowDigit(Digit_2, desitky); // zobrazení desítek digitalWrite(Digit_3, HIGH); // zobrazení stovek } else if ((value > 99) & (value < 200)) //číslo 100 - 199 { int value_x = value - 100; //zjištění dvoumístného čísla pro zobrazení int desitky = (value_x - (value_x % 10))/10; // zjištění desítek ShowDigit(Digit_1, value_x - (desitky*10)); // zobrazení jednotek ShowDigit(Digit_2, desitky); // zobrazení desítek digitalWrite(Digit_3, LOW); // zobrazení 3. čislice zprava (1xx;) } else // v jiném případě je na dipleji zobrazen symbol "-E" { ShowDigit(Digit_1, 11); // pro první čislovku zpara zobrazeno "E" ShowDigit(Digit_2, 12); // pro druhou čislovku "-" digitalWrite(Digit_3, HIGH); // sta vypnuty } } // zobrazení jednotlivých číslic a symbolů void ShowDigit(byte digit[], byte value) { byte DigitData[13][7] = { // zde uloženy data pro číslice a symboly {0,1,0,0,0,0,0},//0 {1,1,1,1,0,0,1},//1 {1,0,0,0,1,0,0},//2 {1,0,1,0,0,0,0},//3 {0,0,1,1,0,0,1},//4 {0,0,1,0,0,1,0},//5 {0,0,0,0,0,1,0},//6 {1,1,1,1,0,0,0},//7 {0,0,0,0,0,0,0},//8 {0,0,1,0,0,0,0},//9 {1,1,1,1,1,1,1}, //10 - clear All segments {0,0,0,0,1,1,0}, // 11 - "E" {1,0,1,1,1,1,1}, // 12 - "-" }; for (int i = 0; i < 8; i++) { digitalWrite(digit[i], DigitData[value][i]); } } // nastavení pinů pro jednotlivou číslici na výstup a HIGH void InitDigit(byte digitPin[]) { for (int i = 0; i < 8; i++) { pinMode(digitPin[i], OUTPUT); digitalWrite(digitPin[i], HIGH); } }
Jak jste si také všimli, v datovém poli, kde jsou uložené číslice jsou také na indexu 10 data pro zhasnutí celé číslice a také můžeme zobrazit znak "E" a "-". To se nám hodí, když potřebujeme zobrazit, že hodnota není v rozmezí pro náš displej. V tomto případě můžeme zobrazit číslo 0 - 199. Pro dvojmístné displeje to bude 0-99. K zobrazenení čísla 199 je nutné (2 x 7) + (1 pin na číslovku 1) pinů z našeho Arduina.
Program v cyklu trvající 25 milisekund zobrazuje na dipleji číslo od 0 do 199 a v dalším připadě protože je hodnota nastavena až dé 299 zobrazuje pro demostraci chybovou hlášku "-E", že hodnota je mimo rozsah.
V zapojení můžete vidět, že nebyly použity žádné jiné součástky, kromě samotného displeje propojovacích vodičů a mini nepajivého kontaktního pole. V druhém případě, kdy si připojíme 7-segmentové LED zobrazovače již další součástky budou potřeba. Vzhledem k tomu, že segmenty číslovky od firmy Kingbright SA-52 pracují s napětím 2 až 2,2V (I=20mA) budeme muset každý segment připojit přes odpor 1,3kOhmu (při napětí z výstupů Arduina 5V). Samotné desetiné tečky na zobrazovači připojeny nebudou v tomto zapojení, budeme tedy potřebovat pro 2 číslice celkem 14 odporů o hodnotě 1,3kOhmu. Já sám jsem je při zkoušení v takovém množstí nenašel, použil jsem tedy jiné hodnoty a to výšší, s tím, že LED displej tolik nesvítí a je dobře čitelný až při nižším osvětlení (poznámka: použil jsem u jedné číslice odpory 27kOhmů a u druhé 18kOhmů a číslice šly i přesto přečíst).
Popis pinů jednotlivých segmentů u LED 7-segmentové displeje se společnou anodou (+):
V programu oproti předchozímu zapojení s diplejem s tekutých krystalů musíme provést malé úpravy. Stačí pouze zakomentovat nejaké řádky, protože zde nám chybí číslovka třetí a to naše jednička pro zobrazení stovek. Já sem upravený zdrojový kód vkládat nebudu ale je ke ztažení zde.
Výslek jak v jednom tak ve druhém případě, múžete vidět na videu:
———
ZpětDiskusní téma: Lekce 8 - 7-Segmentový displej
Datum | 06.09.2018 |
---|---|
Vložil | Veronika |
Titulek | R |
No odpory treba na každý segment 1ks. A ich veľkosť závisí od citlivosti LED. Ak je nízka, treba vysoký prúd do segmentu LED. Ešte ide aj o to, koľko dovolí výstupný prúd ten ktorý Atmel procesor. Aj na jednotlivý výstup, ale najmä má obmedzenie na veľkosť spoločného prúdu - teda celkový výstupný prúd. Červené LED majú úbytky napätí okolo 1,6-1,8V.
———
Datum | 09.07.2018 |
---|---|
Vložil | Lukáš |
Titulek | Digitální hodiny |
Zdravím,
chtěl jsem se zeptat jestli by šlo toto udělat za pomoci CD4543 (převodníku z BCD na sedmi-segmentový displej)
———
Datum | 15.02.2017 |
---|---|
Vložil | milan |
Titulek | odpory |
nestačil by připojit 1 odpor na společnou anodu/katodu? pokud mám displej s 4 číslicemi, tam tam nechci připojovat 30 odporů
———
Datum | 14.02.2017 |
---|---|
Vložil | luky |
Titulek | odpory |
podla mna tie odpory su nespravne ...
ak pocitam dobre -
(5V - 2,2v)/0.02 = 140 ohmov
kde 5 v je zdroj, 2.2 je ubytok napatia na diode a 20mA je prud..
spravne ? :)
———
Datum | 12.10.2016 |
---|---|
Vložil | Roman C |
Titulek | Odpory |
Dobrý den.
Opravdu jsou tam odpory 1,3 kOhmu ?
———