Lekce 8 - 7-Segmentový displej

28.02.2013 15:12

     V 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ět

Diskusní téma: Lekce 8 - 7-Segmentový displej

Datum
Vložil
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
Vložil
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
Vložil
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
Vložil
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
Vložil
Titulek

Odpory

Dobrý den.
Opravdu jsou tam odpory 1,3 kOhmu ?

Vyhledávání

arduino8.cz © 2015 Všechna práva vyhrazena.