Close

TinyLab: Sedmisegmentový displej

TinyLab: Sedmisegmentový displej

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.

Sedmisegmentový displej s desetinnou tečkou (zdroj: https://en.wikipedia.org/wiki/File:Seven_segment_02_Pengo.jpg)

Sedmisegmentový displej s desetinnou tečkou (zdroj: https://en.wikipedia.org/wiki/File:Seven_segment_02_Pengo.jpg)

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.

Vnitřní zapojení sedmisegmentového displeje (zdroj: https://www.gme.cz/data/attachments/dsh.512-009.1.pdf)

Vnitřní zapojení sedmisegmentového displeje (zdroj: https://www.gme.cz/data/attachments/dsh.512-009.1.pdf)

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ů.

Sedmisegmentový displej se čtyřmi číslicemi (zdroj: https://cz.mouser.com/ProductDetail/Vishay/TDCG1050M?qs=sGAEpiMZZMvkC18yXH9iIqyJsypj8o8kg44rnx4xTqQ%3d)

Sedmisegmentový displej se čtyřmi číslicemi (zdroj: https://cz.mouser.com/ProductDetail/Vishay/TDCG1050M?qs=sGAEpiMZZMvkC18yXH9iIqyJsypj8o8kg44rnx4xTqQ%3d)

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ů.

Vnitřní zapojení sedmisegmentového displeje se čtyřmi číslicemi (zdroj: https://cz.mouser.com/datasheet/2/427/tdcx10x0m-88849.pdf)

Vnitřní zapojení sedmisegmentového displeje se čtyřmi číslicemi (zdroj: https://cz.mouser.com/datasheet/2/427/tdcx10x0m-88849.pdf)

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“.

TinyLab: Poloha přepínačů pro ovládání sedmisegmentového displeje

Poloha přepínačů pro ovládání sedmisegmentového displeje

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 -> A
  • B b -> b
  • C c -> c
  • D d -> d
  • E e -> E
  • F f -> F
  • H h -> H
  • L l -> L
  • P 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.

Zbyšek Voda

2 Comments on “TinyLab: Sedmisegmentový displej

Ladap
11.10.2020 at 14:10

Dobrý den
Mám takový problém. LED displej – 7 segmentový, 8 znaků MAX7219 – červený na kterém potřebuji zobrazit údaje z teplotního čidla. Dokážu ho rozsvítit, zobrazit číslo na libovolné pozici ale nedokážu zobrazit údaj z čidla nebo jen třeba číslo 15752.
Děkuji za odpověd
prchalcaslav@seznam.cz

Oldřich Horáček
15.10.2020 at 10:49

Dobrý den, tohle by mělo fungovat na první šup. Nejspíše bude nějaký zádrhel v programu. Zkuste na tom ještě zapracovat, nebo se poradit na našem fóru. https://forum.hwkitchen.cz/ kde bude dobré také nasdílet kód. Bastlení ZDAR! Oldřich

Napsat komentář