Osmimístný LED displej s 74HC595: sedmisegmentový displej pro Arduino
Pravidla fóra
Vkládejte prosím jen HOTOVÉ projekty, které chcete představit ostatním.
Vkládejte prosím jen HOTOVÉ projekty, které chcete představit ostatním.
Osmimístný LED displej s 74HC595: sedmisegmentový displej pro Arduino
Dnes se podíváme na jednoduchý 7-mi segmentový displej řízený posuvným registrem a jeho ovládání pomocí Arduina.
https://www.michaluvbrloh.cz/2026/09/30 ... o-arduino/
https://www.michaluvbrloh.cz/2026/09/30 ... o-arduino/
https://www.michaluvbrloh.cz - Můj web
https://hackaday.io/projects/hacker/1326779 - Moje některé probíhající i dokončené projekty
https://hackaday.io/projects/hacker/1326779 - Moje některé probíhající i dokončené projekty
Re: Osmimístný LED displej s 74HC595: sedmisegmentový displej pro Arduino
Podle mého názoru se tato sestava (posuvný registr a displeje s navzájem pospojovanými segmenty) k Arduinu moc nehodí.
Právě proto, že je nutné se starat o multiplexování.
Jestli jde jen o zobrazení nějakého statického nápisu, tak asi ano. To by se zvládnout dalo.
Kdyby to mělo ale ještě komunikovat, listovat někde v menu, něco měřit, využívat inerrupty ... atd., tak už bych měl trochu strach, jestli se podaří udržet pravidelný multiplex, aby nějaké segmenty viditelně nepoblikávaly.
Posuvné registry bych použil v případě, kdy bude každý segment (LEDka) ovládaný zvlášť.
Pak by stačilo:
- připravit jeden dlouhý (64-bitový) řetězec (8 znaků * 8 segmentů)
- nasypat ho do řady posuvných registrů (každá zobrazovací jednotka by měla svůj 8-bitový)
- jedním pulsem na LATCH ho překlopit do LEDek
- jas by se dal plynule upravovat pomocí PWM na společné elektrodě všech displejů
Dál už se o zobrazení není třeba starat.
Z vlastní zkušenosti bych se ale přikláněl spíš k použití toho v článku zmíněného TM1637 v kombinaci s displejem se spojenými segmenty.
Pak už se o multiplexování stará samotný obvod a Arduino má volné prostředky pro své činnosti.
Jinak máš pěkné články, sleduji všechny.
Právě proto, že je nutné se starat o multiplexování.
Jestli jde jen o zobrazení nějakého statického nápisu, tak asi ano. To by se zvládnout dalo.
Kdyby to mělo ale ještě komunikovat, listovat někde v menu, něco měřit, využívat inerrupty ... atd., tak už bych měl trochu strach, jestli se podaří udržet pravidelný multiplex, aby nějaké segmenty viditelně nepoblikávaly.
Posuvné registry bych použil v případě, kdy bude každý segment (LEDka) ovládaný zvlášť.
Pak by stačilo:
- připravit jeden dlouhý (64-bitový) řetězec (8 znaků * 8 segmentů)
- nasypat ho do řady posuvných registrů (každá zobrazovací jednotka by měla svůj 8-bitový)
- jedním pulsem na LATCH ho překlopit do LEDek
- jas by se dal plynule upravovat pomocí PWM na společné elektrodě všech displejů
Dál už se o zobrazení není třeba starat.
Z vlastní zkušenosti bych se ale přikláněl spíš k použití toho v článku zmíněného TM1637 v kombinaci s displejem se spojenými segmenty.
Pak už se o multiplexování stará samotný obvod a Arduino má volné prostředky pro své činnosti.
Jinak máš pěkné články, sleduji všechny.
Re: Osmimístný LED displej s 74HC595: sedmisegmentový displej pro Arduino
Taky se mi to líbí
Ale to blokující Delay() bych přepsal na verzi s millis() (Blink without delay ), i když by to bylo o něco pracnější.
(Obecně se snažím dělat věci v loop() rychlé a nechat je testovat to, co potřebují, co nejčastěji.)
Ale to blokující Delay() bych přepsal na verzi s millis() (Blink without delay ), i když by to bylo o něco pracnější.
(Obecně se snažím dělat věci v loop() rychlé a nechat je testovat to, co potřebují, co nejčastěji.)
Re: Osmimístný LED displej s 74HC595: sedmisegmentový displej pro Arduino
Díky. Tenhle displej se mi v zásobách válí už dlouho. Tenkrát jsem s ním chtěl něco dělat ale nakonec k tomu nikdy nedošlo. Lepší na použití je displej s vlastním řízením kterému stačí poslat data a on si multiplex řídí sám. O něm bude článek další středu 
https://www.michaluvbrloh.cz - Můj web
https://hackaday.io/projects/hacker/1326779 - Moje některé probíhající i dokončené projekty
https://hackaday.io/projects/hacker/1326779 - Moje některé probíhající i dokončené projekty
Re: Osmimístný LED displej s 74HC595: sedmisegmentový displej pro Arduino
na internetu se často objevuje řízení LED displeje pomocí posuvných registrů. Asi nejhorší možné řešení. To se používalov dobách, kdy nebylyu ještě ani procesory, natož mikropočítače. Klasický multiplex je lepší. Ten se používal ve spojení s procesory. Pro mikropočítače je nejlepší řešení sériové řízení pomocí obvodu od Maxima (7219).
S časem se vše zhoršuje (zákon prof. Parkinsona)

Re: Osmimístný LED displej s 74HC595: sedmisegmentový displej pro Arduino
Osmimístný displej s 74HC595 bez práce v loop(). Obnovu číslic necháme na Timer1
Osmimístný sedmisegmentový modul s dvojicí 74HC595 neumí multiplexovat sám. Program musí rychle přepínat číslice, jinak displej bliká nebo zhasne. V běžné ukázce se o to stará loop() a delayMicroseconds(). Jde to ale i tak, že smyčka zůstane prázdná a celou obnovu si vezme přerušení od Timer1.
Na Arduino UNO a Nano s ATmega328P k tomu stačí jeden časovač. Druhý časovač na čtení číslic z paměti není potřeba. Buffer je v RAM a obsluha Timer1 si z něj bajt segmentů vezme sama.
Proč ne delay() v loop()
Modul nerozsvítí všech osm míst najednou. Zapne jednu číslici, nastaví její segmenty, za chvíli přepne na další a tak pořád dokola. Když je to dost rychlé, oko blikání nevidí.
Ukázkový program to dělá blokujícím čekáním, typicky delayMicroseconds(1000) na každou číslici. Celý průchod tak zablokuje smyčku zhruba na 8 ms. Počítadlo to přežije. Jakmile v loop() přibude měření, sériová linka nebo delší výpočet, displej se rozbliká.
Přerušení od časovače tenhle problém oddělí. Hlavní program může stát, displej se obnovuje dál.
Zapojení
Co se mění v programu
V setup() zůstanou piny, vynulování bufferu a první setNumber(0). Navíc se nastaví Timer1 do režimu CTC. Při taktu 16 MHz, předděličce 8 a OCR1A = 1999 přijde přerušení přesně jednou za 1 ms.
loop() se vyprázdní:
V ISR(TIMER1_COMPA_vect) se děje jen tohle:
V obsluze nesmí být shiftOut(), digitalWrite(), delayMicroseconds() ani Serial. Jsou pomalé a v přerušení nemají co dělat. Timer0 se nesahej. millis() dál běží, tahle smyčka ho jen nepotřebuje.
Jas a blikání
Perioda Timer1 je současně délka svitu jedné číslice. Menší OCR1A znamená rychlejší obnovu a nižší jas. Větší perioda jas zvedne, ale od zhruba 2 ms na číslici už blikání uvidíš. Proud modulu pořád není zanedbatelný. 74HC595 není budič jako MAX7219, proud ani jas sám nehlídá.
Druhý časovač dává smysl až ve chvíli, kdy máš druhou nezávislou periodu, která nesmí rozhodit jas. Třeba měření ADC jednou za 100 ms. Na samotné přečtení číslic a jejich poslání ven je jeden Timer1 přesnější i jednodušší.
Osmimístný sedmisegmentový modul s dvojicí 74HC595 neumí multiplexovat sám. Program musí rychle přepínat číslice, jinak displej bliká nebo zhasne. V běžné ukázce se o to stará loop() a delayMicroseconds(). Jde to ale i tak, že smyčka zůstane prázdná a celou obnovu si vezme přerušení od Timer1.
Na Arduino UNO a Nano s ATmega328P k tomu stačí jeden časovač. Druhý časovač na čtení číslic z paměti není potřeba. Buffer je v RAM a obsluha Timer1 si z něj bajt segmentů vezme sama.
Proč ne delay() v loop()
Modul nerozsvítí všech osm míst najednou. Zapne jednu číslici, nastaví její segmenty, za chvíli přepne na další a tak pořád dokola. Když je to dost rychlé, oko blikání nevidí.
Ukázkový program to dělá blokujícím čekáním, typicky delayMicroseconds(1000) na každou číslici. Celý průchod tak zablokuje smyčku zhruba na 8 ms. Počítadlo to přežije. Jakmile v loop() přibude měření, sériová linka nebo delší výpočet, displej se rozbliká.
Přerušení od časovače tenhle problém oddělí. Hlavní program může stát, displej se obnovuje dál.
Zapojení
- VCC modulu na 5 V
- GND na GND
- DIO / DATA na D7
- SCK / CLK na D6
- RCK / LATCH na D5
Co se mění v programu
V setup() zůstanou piny, vynulování bufferu a první setNumber(0). Navíc se nastaví Timer1 do režimu CTC. Při taktu 16 MHz, předděličce 8 a OCR1A = 1999 přijde přerušení přesně jednou za 1 ms.
loop() se vyprázdní:
Kód: Vybrat vše
void loop() {}
- Oba registry se krátce zapíšou nulami, ať neprosvítá sousední číslice.
- Index 0…7 se posune o jednu pozici a přemapuje přes digitMap.
- Z displayBuffer se vezme bajt segmentů, složí se bajt výběru číslice a uplatní se SEGMENTS_ACTIVE_LOW a DIGITS_ACTIVE_LOW.
- Oba bajty se pošlou do 74HC595 v pořadí podle SEND_DIGIT_FIRST. Latch se zvedne až po nich.
- Číslice svítí do dalšího tiku, tedy asi 1 ms. To odpovídá původnímu delayMicroseconds(1000).
- Jednou za 1000 průchodů softwarový dělič zvedne počítadlo a zavolá setNumber(). Tím se plní paměť, ze které multiplex čte.
V obsluze nesmí být shiftOut(), digitalWrite(), delayMicroseconds() ani Serial. Jsou pomalé a v přerušení nemají co dělat. Timer0 se nesahej. millis() dál běží, tahle smyčka ho jen nepotřebuje.
Jas a blikání
Perioda Timer1 je současně délka svitu jedné číslice. Menší OCR1A znamená rychlejší obnovu a nižší jas. Větší perioda jas zvedne, ale od zhruba 2 ms na číslici už blikání uvidíš. Proud modulu pořád není zanedbatelný. 74HC595 není budič jako MAX7219, proud ani jas sám nehlídá.
Druhý časovač dává smysl až ve chvíli, kdy máš druhou nezávislou periodu, která nesmí rozhodit jas. Třeba měření ADC jednou za 100 ms. Na samotné přečtení číslic a jejich poslání ven je jeden Timer1 přesnější i jednodušší.
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 0 hostů