Displejů pro Arduino existuje spousta. Některé zobrazují text, jiné grafiku, a některé jsou určené hlavně pro čísla. Tentokrát se podíváme na jednoduchý osmimístný sedmisegmentový LED displej, který je řízený pomocí obvodu 74HC595.
Na první pohled je to obyčejný číselný displej, jaký známe třeba z měřáků, hodin, kuchyňských vah nebo různých přístrojů. Umí zobrazovat číslice, některá písmena a desetinné tečky. Právě proto se hodí na jednoduché projekty, kde chceme zobrazit například čas, napětí, teplotu, počet kusů, skóre nebo libovolnou číselnou hodnotu.
Zajímavé na tomto modulu je hlavně to, že k jeho ovládání není potřeba velké množství pinů. O řízení displeje se stará dvojice posuvných registrů 74HC595, díky kterým stačí Arduinu jen několik datových vodičů.

Co je sedmisegmentový displej
Sedmisegmentový displej je displej složený z několika samostatných LED segmentů. Každá číslice se skládá ze sedmi hlavních částí označovaných obvykle písmeny A až G. K tomu bývá přidaná ještě desetinná tečka DP.
Když rozsvítíme správnou kombinaci segmentů, vznikne číslice.
Například:
číslice 1 používá jen dva pravé segmenty,
číslice 8 používá všechny segmenty,
číslice 0 používá skoro všechny segmenty kromě prostředního.
Díky tomu je takový displej jednoduchý, dobře čitelný a pro zobrazování čísel úplně ideální.
Nevýhoda je v tom, že kdybychom chtěli každý segment ovládat přímo z Arduina, potřebovali bychom hodně pinů. Jeden znak má 7 segmentů plus desetinnou tečku, tedy 8 výstupů. A pokud máme displej s osmi číslicemi, je hned jasné, že přímé zapojení by nebylo moc praktické.

Proč je na modulu 74HC595
Obvod 74HC595 je posuvný registr. To znamená, že do něj Arduino pošle data postupně po jednom vodiči a obvod je potom nastaví najednou na svých výstupech.
Zjednodušeně řečeno:
Arduino pošle řadu jedniček a nul,
74HC595 si je uloží,
po signálu na pinu latch je zobrazí na výstupech.
Díky tomu můžeme ovládat více výstupů pomocí malého počtu pinů.
U tohoto displeje se obvykle používají dva obvody 74HC595. Jeden se stará o to, které segmenty mají svítit, a druhý vybírá, která číslice je právě aktivní.

Jak displej vlastně zobrazuje osm číslic
Tady přichází důležitá věc. Displej většinou nerozsvítí všech osm číslic najednou. Místo toho používá princip zvaný multiplexování.
To znamená, že se velmi rychle přepínají jednotlivé číslice:
zapne se první číslice a nastaví se její segmenty,
potom se zapne druhá číslice a nastaví se její segmenty,
potom třetí,
a tak pořád dokola.
Děje se to tak rychle, že lidské oko blikání nevnímá a displej vypadá, jako by svítil celý najednou.
Tohle je dobré vědět hlavně kvůli programu. Displej je potřeba pravidelně obnovovat. Když v programu použijeme dlouhý delay(), displej může zhasínat, blikat nebo se nebude aktualizovat plynule.

Co budeme potřebovat
Pro základní pokus stačí:
- Arduino UNO, Nano nebo Mega
- 8místný LED displej s 74HC595
- několik propojovacích vodičů
- USB kabel k Arduinu
- Arduino IDE
Já budu v ukázce počítat s klasickým Arduinem napájeným z 5 V.
U modulů s 74HC595 je dobré si vždy zkontrolovat popisky přímo na desce. Různí výrobci mohou mít trochu jiné značení pinů.
Piny modulu
Na podobných modulech bývají nejčastěji tyto piny:
| Pin modulu | Význam |
|---|---|
| 5V / Vcc | napájení modulu |
| GND | zem |
| DIO / DATA / SER | datový vstup |
| SCK / CLK / SRCLK | hodinový signál |
| RCK / LATCH / STCLK | potvrzení dat na výstup |
Názvy se mohou trochu lišit, ale princip je stejný.
Datový pin posílá jedničky a nuly. Hodinový pin říká obvodu, kdy má další bit načíst. Latch pin potom přenese připravená data na výstupy.
Zapojení k Arduinu
Zkušební zapojení provedeme takto:
| Modul displeje | Arduino |
|---|---|
| VCC / 5V | 5V |
| GND | GND |
| DIO / DATA | D7 |
| SCK / CLK | D6 |
| RCK / LATCH | D5 |
Piny D7, D6 a D5 nejsou povinné. V programu je možné nastavit jiné. Důležité je jen to, aby zapojení odpovídalo programu.
První testovací program
Pro první pokus není potřeba žádná speciální knihovna. Arduino má funkci shiftOut(), která umí posílat data do posuvného registru.
Následující program zobrazí na displeji jednoduché počítadlo. Hodnota se každou sekundu zvýší o 1.
U podobných modulů se může lišit pořadí registrů, pořadí číslic nebo logika rozsvícení segmentů. Proto jsou v horní části programu přepínače, které se dají podle potřeby upravit.
// 8místný 7segmentový displej s 74HC595
// Ukázka pro Arduino UNO / Nano / Mega
const byte DATA_PIN = 7; // DIO / DATA / SER
const byte CLOCK_PIN = 6; // SCK / CLK
const byte LATCH_PIN = 5; // RCK / LATCH
// Podle konkrétního modulu může být potřeba tyto hodnoty změnit
const bool SEGMENTS_ACTIVE_LOW = true;
const bool DIGITS_ACTIVE_LOW = false;
const bool SEND_DIGIT_FIRST = false;
// Mapa fyzického pořadí číslic na modulu
// Řeší případ, kdy se číslo zobrazuje ve špatné polovině displeje
const byte digitMap[8] = {
4, 5, 6, 7, 0, 1, 2, 3
};
// Mapa segmentů:
// bit 0 = A
// bit 1 = B
// bit 2 = C
// bit 3 = D
// bit 4 = E
// bit 5 = F
// bit 6 = G
// bit 7 = DP
const byte BLANK = 0b00000000;
const byte digitPattern[10] = {
0b00111111, // 0
0b00000110, // 1
0b01011011, // 2
0b01001111, // 3
0b01100110, // 4
0b01101101, // 5
0b01111101, // 6
0b00000111, // 7
0b01111111, // 8
0b01101111 // 9
};
byte displayBuffer[8];
void setup() {
pinMode(DATA_PIN, OUTPUT);
pinMode(CLOCK_PIN, OUTPUT);
pinMode(LATCH_PIN, OUTPUT);
clearBuffer();
setNumber(0);
}
void loop() {
static unsigned long lastUpdate = 0;
static unsigned long counter = 0;
// Displej se musí obnovovat pořád dokola
refreshDisplay();
// Jednou za sekundu změníme zobrazovanou hodnotu
if (millis() - lastUpdate >= 1000) {
lastUpdate = millis();
setNumber(counter);
counter++;
}
}
void clearBuffer() {
for (byte i = 0; i < 8; i++) {
displayBuffer[i] = BLANK;
}
}
void setNumber(unsigned long value) {
clearBuffer();
int position = 7;
do {
byte number = value % 10;
displayBuffer[position] = digitPattern[number];
value = value / 10;
position--;
} while (value > 0 && position >= 0);
}
void refreshDisplay() {
for (byte i = 0; i < 8; i++) {
byte physicalDigit = digitMap[i];
byte digitByte = (1 << physicalDigit);
byte segmentByte = displayBuffer[i];
writeDisplay(digitByte, segmentByte);
// Délka svitu jedné číslice
delayMicroseconds(1000);
// Krátké zhasnutí pomáhá proti prosvítání sousedních číslic
writeDisplay(0, 0);
}
}
void writeDisplay(byte digitByte, byte segmentByte) {
if (DIGITS_ACTIVE_LOW) {
digitByte = ~digitByte;
}
if (SEGMENTS_ACTIVE_LOW) {
segmentByte = ~segmentByte;
}
digitalWrite(LATCH_PIN, LOW);
if (SEND_DIGIT_FIRST) {
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, digitByte);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, segmentByte);
} else {
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, segmentByte);
shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, digitByte);
}
digitalWrite(LATCH_PIN, HIGH);
}
U podobných modulů se může lišit fyzické pořadí číslic. Pokud se číslo nezobrazuje od kraje, ale třeba až od prostředku displeje, nemusí být chyba v zapojení. Stačí v programu upravit mapu číslic digitMap, která říká, která logická pozice odpovídá které fyzické číslici na displeji.
Když displej nezobrazuje správně
U těchto modulů se může stát, že první program nebude hned přesně sedět. Není to nutně chyba zapojení. Často se jen liší vnitřní zapojení konkrétního modulu.
Typické projevy:
Číslo je zobrazené obráceně
Pokud se číslice zobrazují zprava doleva opačně, není potřeba měnit zapojení. Stačí upravit pořadí hodnot v poli digitMap.
const byte digitMap[8] = {
3, 2, 1, 0, 7, 6, 5, 4
};
Svítí špatné segmenty
Pokud číslice vůbec nevypadají jako číslice, může být jiné pořadí bitů pro segmenty. V tom případě je potřeba upravit tabulku digitPattern.
Svítí všechno obráceně
Pokud segmenty svítí opačně, než mají, zkus změnit:
const bool SEGMENTS_ACTIVE_LOW = true;
Aktivní je špatná číslice nebo svítí více číslic
V tom případě může být obrácená logika výběru číslic:
const bool DIGITS_ACTIVE_LOW = true;
Displej nereaguje vůbec
Zkontroluj hlavně:
- napájení VCC a GND,
- prohozené datové piny,
- jestli odpovídá zapojení v programu,
- jestli je modul opravdu napájený z vhodného napětí.
Zobrazení desetinné tečky
Desetinná tečka je jen další segment. V naší tabulce je uložená v bitu 7.
Pokud chceme například u některé číslice rozsvítit desetinnou tečku, stačí k její hodnotě přidat bit:
displayBuffer[6] |= 0b10000000;
Například hodnota 23.4 se dá jednoduše zobrazit jako číslo 234 a desetinnou tečku rozsvítit za druhou číslicí.
Pro různé měřicí projekty je to praktické. Můžeme tak zobrazovat třeba:
- teplotu
23.4, - napětí
12.6, - proud
0.58, - vzdálenost,
- procenta baterie.
Proč nepoužít rovnou TM1637 nebo MAX7219
Existují i jiné moduly se sedmisegmentovými displeji. Hodně známé jsou například displeje s obvodem TM1637 nebo MAX7219.
Ty jsou pro začátečníka často jednodušší, protože mají hotové knihovny a starají se o většinu práce samy. Pošleme jim číslo a modul se postará o zobrazování.
Displej s 74HC595 je proti tomu trochu „nižší úroveň“. Musíme více řešit, jaká data posíláme, jak vybíráme číslice a jak displej obnovujeme.
To ale nemusí být nevýhoda. Naopak je to pěkný způsob, jak pochopit:
- jak funguje posuvný registr,
- jak se ovládají jednotlivé segmenty,
- co je multiplexování,
- proč displej musí být rychle obnovovaný,
- jak Arduino pracuje s jednotlivými bity.
Pro hotový projekt bych někdy sáhl po MAX7219 nebo TM1637. Pro pochopení principu je ale 74HC595 výborný.
Na co si dát pozor
Displej potřebuje pravidelné obnovování
Protože se používá multiplexování, program nesmí na dlouho zamrznout. Dlouhé použití delay() může způsobit blikání nebo zhasnutí displeje.
Lepší je používat millis() a displej průběžně obnovovat v hlavní smyčce.
Jas závisí na rychlosti obnovování
Když je každá číslice zapnutá jen krátce, displej může být méně jasný. Když je zapnutá moc dlouho, může začít být vidět blikání.
V ukázkovém programu se jas a stabilita dají částečně ovlivnit hodnotou:
delayMicroseconds(1000);
Menší hodnota znamená rychlejší obnovování. Větší hodnota může zvýšit jas, ale při příliš velké hodnotě už může být vidět blikání.
Proud může být vyšší, než se zdá
Sedmisegmentový displej je složený z mnoha LED. I když díky multiplexování nesvítí všechno najednou, proud může být při vyšším jasu znatelný.
Pro pokusy s Arduinem to obvykle nevadí, ale u bateriových projektů je dobré s tím počítat.
74HC595 není plnohodnotný LED driver jako MAX7219
Obvod 74HC595 je posuvný registr. Výrobce modulu ho sice používá jako jednoduchý budič displeje, ale neumí automaticky řídit jas, proud ani multiplexování tak pohodlně jako specializované LED drivery.
O část práce se tedy musí postarat program.
Závěr
8místný LED displej s 74HC595 je jednoduchý, levný a docela poučný modul. Na první pohled slouží jen k zobrazování čísel, ale ve skutečnosti se na něm dá dobře pochopit několik důležitých principů.
Ukazuje, jak funguje sedmisegmentový displej, co dělá posuvný registr 74HC595 a proč se u vícemístných displejů používá multiplexování. Pro úplně hotový projekt existují pohodlnější moduly, třeba s MAX7219 nebo TM1637, ale právě tady je dobře vidět, co se při zobrazování děje uvnitř.
Pro začátečnické pokusy je to ideální součástka. Stačí několik vodičů, Arduino a jednoduchý program. A hned máme přehledný číselný výstup pro další projekty, měření a experimenty.
Další díly ze začátečnické série o modulech najdete zde:
