Stiskněte "Enter" pro přeskočení obsahu

Arduino hodiny s maticovým displejem

21

Arduino Clock with Matrix Display

Now, you do not have to use google translate for translate this page to english. You can just read blue text. Let me know if you find any mistakes.

Tak jsem se pustil opět do nějakého Arduino bastlení. I když nerad vyrábím věci, které lze běžně koupit…sešlo se mi tu pár maticových displejů, RTC modul a nějaký to Arduino. Stačilo přidat kus jeklu, pár řádků programu a mám hodiny s maticovým displejem.

Původní myšlenka byla vyrobit jednoduché hodiny, které mají svítící displej. Žádné píčoviny, které by v noci působily rušivě – stačí blikání dvojtečky jako signalizace chodu. Pro mě není ani potřeba bateriové napájení, nebo desítky různých funkcí. Prostě jenom kostka, která bude zobrazovat čas v tmavé místnosti.

Let me show you my Arduino clock with matrix display. I do not like to make ordinery thing what you can ussualy buy. But I wanted a simple clock which can show only time (hour and minute) without any animation and other disturbing elements. Well I have made this clock with Arduino nano (Chinese clone) and four matrix dot displays.

Hodiny jsou velmi jednoduché. Zobrazovací část je založena na čtyřech maticových displejích 8*8 bodů s řadičem MAX7219. Z Číny jde objednat přímo modul se čtyřmi displeji na jedné desce. Dále obvod obsahuje modul reálného času DS3231, klon Arduino Nano a dvě tlačítka. Celek je napájen 5V adaptérem.

Clock construction is really easy. Display is based on four matrix displays (8 x 8 pixels) with MAX7219 driver. I ordered one module with 4 displays on one board. Next, there are real time clock module with DS3231, Arduino Nano (Chinese clone in my case) and two push butons. I use external 5V power supply.

Konstrukce je vyrobena z jeklu 50×30 mm s vyfrézovaným otvorem pro displej. V něm je kvůli zvýšení kontrastu vloženo červené plexi. Vzadu jsou otvory na pověšení a nahoře dvě dírky s mikrospínači pro ovládání např. párátkem.

Body of clock is made from steel profile 50×30 mm with milled hole for display. I used red acrylic for make better contrast of display. There are some holes – for hanging on the back and two small holes with push buttons on the top.

Jednotlivé komponenty | all components
Základová barva | base paint
Matná černá. Vzadu jsou otvory pro zavěšení, nahoře pro nastavení | Black color. Two holes for hanging, two holes on the top for setting

Kvůli úspoře místa (maximální šířka všeho cca 25 mm) jsem musel displeje připájet na desku přímo. Vypájel jsem tedy dutinkové lišty a displeje do desky zapájel.

There is not enough space in the steel profile (maximum width is only 25 mm). I had to solder all displays directly to pcb for save space.

Úspora místa je znatelná | A lot of space is saved

Na horní straně jsou na univerzálním tišťáku dva mikrospínače. Oba připojují piny Arduina na GND. V procesoru je nastaven interní pull-up. Nejsou tedy potřeba žádné dodatečné součástky.

There are two push buttons on the top of board. Both connect inputs from Arduino with GND. Internal pull-up resistors are set in processor. No additionals resistors are necessary.

Na zadní straně je vše propojeno. 5 V je přivedeno na všechny komponenty. Protože už používám stabilizovaný 5V zdroj, není přívod přiveden na pin VIN Arduina, ale přes diodu 1N4148 přímo na pin 5V. Kdyby bylo napájení přivedeno na vstup VIN byl by stabilizátor na desce zatěžován velkým procházejícím proudem pro LED displej.

All modules in the back are connected with 5 V bus. Because I use 5V puwer supply I do not have to use VIN pin, but directly (via the 1N4148 diode) to 5V pin. If I used VIN input, the stabilizer would be overloaded with the display current.

Schéma zapojení | schematics

Zapojení pinů Arduina:

  • D2 – button 1 (připojuje GND, nastaven internal_pullup)
  • D3 – button 2 (připojuje GND, nastaven internal_pullup)
  • D4 – matrix display, pin DIN
  • D5 – matrix display, pin CLK
  • D6 – matrix display, pin CS
  • A4 – RTC modul, pin SDA
  • A5 – RTC modul, pin SCL
  • GND – společné pro všechny moduly | common for all modules
  • 5V – společné přes všechny moduly, přívod přes 1N4148 (na fotce není) | common for all modules

Program si můžete stáhnout zde, na mém GitHubu: https://github.com/…Matrix-Clock 

You can download all program from my GitHub: https://github.com/mylms/Arduino-Matrix-Clock

Program hodin je poměrně jednoduchý. Používám knihovnu LedControl na ovládání maticových displejů a knihovnu Wire pro komunikaci přes I2C. Pro komunikaci s RTC se nepoužívá žádná dodatečná knihovna. Na začátku programu jsou nadefinované jednotlivé znaky. Čtení aktuálního času volám cca jednou za 500 ms. Zároveň v tomto čase blikám s dvojtečkou – dvojtečka se tedy rozsvítí cca jednou za sekundu (pokud je zapnuté blikání).

Sketch is really simple. It use LedControl library for matrix display. Library Wire is used for I2C communication. For communication with real time clock module is not used any other library. At the beginning of the sketch all symbols are defined. Read actual time from RTC is twice a second. In the same interval colon blinking (only if blinking is active).

Hodiny je možné nastavit pomocí dvou tlačítek na vrchní straně. Stisknutím obou tlačítek zároveň se hodiny přepnou do režimu nastavení. Levým tlačítkem (BTN1) se přepíná parametr, který se mění, pravým tlačítkem (BTN2) se parametr zvyšuje. Po nastavení všech údajů se hodiny tlačítkem přepnou do režimu zobrazení aktuálního času.

It is possible to set clock with two buttons. When both buttons are pressed, clock goes to setting mode. Left button (BTN 1) can change the parameter, right button (BTN 2) change value of parameter. After set all parameters is clock bring back to show actual time.

Ve verzi 1.0 a 1.1 je možné měnit pouze čas – hodiny a minuty. Dále pak intenzitu svitu displeje a font. Možné je nastavit čas pomocí sériového portu.

In version 1.0 and 1.1 clock can show only time – hours and minute. It is possible to change brightness and font. All parameters can be change via serial port.

Od verze 1.2 lze v menu měnit hodiny (H), minuty (M), rok (y), měsíc (m), den (d), formát 12/24 hodin (/), zobrazení data (D), font (f), styl dvojtečky (:), intenzitu osvětlení (b), otočení fontu ( R ), otočení displeje ( r ). Po nastavení všech parametrů se zobrazí na displeji nápis „Strt“, po stisknutí tlačítka BTN1 se sekundy nastaví na 0 a hodiny se rozběhnou. Stejně tedy jako  v předchozí verzi.
Dále lze hodiny nastavit snadněji pomocí sériového portu (oproti předchozím verzím se liší styl zápisu). Rychlost sériové linky je 9600 baud. Je nutné odeslat přes sériovou linku vždy 3 znaky. První slouží jako příkaz, další dva jako číslo ve standardním desítkovém formátu (00 – 99). U čísla je vždy nutné zapsat dvě číslice. Příkazy se shodují se znaky v menu. Odesláním znaku otazníku „?“ do hodin se vypíše aktuální čas a nastavení.

From version 1.2 i’ts possible to change hour (H), minute (M), year (y), month (m), day (d), 12/24 clock format (/), show date (D), font (f), colon style (:), brightness (b), font rotate ( R ), display rotate ( r ). After set all parameters is „Strt“ shown. After press BTN1 are second set to 0 and clock goes to start. It is same like in older version.
Clock can set via serial port. Speed is 9600 baud. Three characters must be send. First is command, second and third are number in decimal notation (00 – 99). Commands are the same like in menu. After send „?“ clock send help back to serial monitor.

Od verze 1.3 lze navíc otočit font vzhůru nohama a zobrazit aktuální teplotu, která je načítána z RTC modulu. Teplota je tedy přibližná a ovlivněna teplotou samotného modulu.

From version 1.3 it’s possible to turn font upside down and show temperature. Temperature is readed from real time clock module. Temperature is only approximate and depend on temperature of RTC module.

Od verze 1.4 je možné otočit text tak, aby byl čitelný vertikálně (parametr v00/v01). Lze tedy hodiny použít na výšku. Dále je možné připojením vstupu D10 a/nebo D11 na GND zobrazit jeden ze třech textů. Ty je nutné upravit přímo v kódu.

From version 1.4 it’s possible to turn display vertically (parameter v00/v01). Now you can turn clock like „portrait“. Next, if you connect input D10 and/or D11 to GND you can show one of three messages.. Messages must be changed directly in the code.

Nastavení pomocí sériové linky:

  • ? – výpis hodnot z hodin
  • H – hodiny (např. H15 = nastaví 15 hodiny); 00 – 23
  • M – minuty (např. M22 = nastaví 22 minut); 00 – 59
  • S – sekundy (např. M10 = nastaví 10 sekund); 00 – 59
  • y – rok (např. y19 = nastaví 2019); 00 – 99
  • m – měsíc (např. m03 = nastaví březen); 01 – 12
  • d – den (např. d31 = nastaví 31. den); 01 – 31
  • D – kolikátou sekundu se zobrazí datum (např. D40 = datum se zobrazí od 40. sekundy); 00 – 60
  • t – kolikátou sekundu se zobrazí teplota (např. D00 = teplota se nebude vůbec zobrazovat); 00 – 60
  • / – nastaví režim 12/24 hodin (/00 = 12h režim, /01 = 24 h režim); 00 – 01
  • f – font (f01 = nastaví 1 font); 01 – 05
  • : – styl zobrazení dvojtečky (:00 = zhaslá, :01 = stále svítí, :02 = bliká); 00 – 02
  • b – intenzita osvětlení (b00 = nastaví nejmenší intenzitu osvětlení); 00 – 15
  • R – otočení fontu (R00 = vypne otočení fontu); 00 – 01
  • r – otočení displeje (r00 = vypne otočení displeje); 00 – 01
  • U – otočení fontu „vzhůru nohama“  (U00 = vypne otočení); 00 – 01
  • v – hodiny vertikálne (v00 – hodiny horizontálně); 00 – 01

Různé fonty čísel | some different fonts
Možné zobrazení na výšku | vertical view

Protože je USB konektor jednoduše přístupný z levé strany hodin, lze jakoukoliv funkcionalitu (měření teploty, automatický přechod z letního času na zimní, apod.) dodělat.

Because USB port is accessible from left side, it’s easy to add some new function.

  1. indra indra
    12.7.2018 - 21:08:25

    thank you for your matrix clock project.I have done the assembly according to your schmetic. Thn loaded the sktech into arduino. on matrix its is showing 45: c5 only.I am trying to set the clock, but after setting hour and minute through the buttons than brightness, strt is coming out on display. and if i push the button again then 45:c5 is displaying on matrix led. nothing else, please help

  2. Peťan: First send this sketch to your Arduino – maybe your RTC has different I2C address. I use 0x68.
    If you have good address, you should test only RTC clock with Arduino board. Use simple Arduino sketch for read time from RTC and send to serial port. I recomend this sketch. It’s simmilar to my sketch…but it send data directly to serial port. Or, there are lots of examples on the internet. You can try that. Is it working? Is time right?
    If not, maybe your RTC module is dead (did you try to change battery?) – at last, try to change RTC module.
  3. Indra Indra
    19.7.2018 - 22:13:19

    Thank You Very Much. Lots of Thank. Your guidance have helped me out to make this clock. Its working now. Keep it up. Keep posting on your blog/ web site.
    Indra from India.

  4. Peťan: I’m glad to hear your positive result. Where was the problem? Greatings to India 🙂
  5. Indra Indra
    30.7.2018 - 20:06:18

    My RTC was faulty. I have installed new one and after finding out right 12 c address as you have instructed everything is now going smooth. Thank You again. Greetings to your country also.

  6. Peťan: I have had the same problem in the past with the same module. It just always sent the same value. I replaced it and it works. It’s the same problem like here. But I did not solve the problem replacing the battery.
    You can download a new version (v1.1.) of firmware for this clock. It’s support more „fonts“ and you can hide colon betwen hours and minutes.
  7. DAVE B DAVE B
    31.12.2018 - 19:23:46

    [3] Indra: Excellent project Petean.

    Please let me know how to change the below:

    F: Font (show nr of font in select font style)

    :: Dot style (0 – hide, 1 – show, 2 – blinking)

    How to download and select these options and change through the Agnes tool?. I’m not able to understand from the video.

    Thanks in advance.

  8. Peťan: You have to download version 1.1. These features are not in firmware v1.0. Agnes tool is not avaliable. It’s my „internal“ application for Arduino attendance system. I just use the same setting system. I know, it could be more user friendly. Probably I will make some app for time setting.
  9. DAVE B DAVE B
    31.12.2018 - 20:08:59

    Hi Petean, It’s working fine. Able to change the font style and blinking with new version 1.1.

    Many thanks and Wish you a Happy Newyear 2019.

  10. Peťan: It’s good to hear it 🙂 Hapy New Year for you, too.
  11. KADİR KADİR
    13.1.2019 - 14:43:53

    Prejeyi gördüm ve çok beğendim kolaylıkla yaptım sıcaklık fonksiyonu olsa idi daha güzel olacaktı yinede emeği geçen preje sahiplerine çok teşekkür ederiz

  12. Peťan: I’m not sure if I understand you at all. Of course, it is possible to add temperature meter. You could add DS18B20 temperature sensor and some code for alternatig time and temperature. I do not need this function and that’s why I did not add that.
  13. Binod Binod
    23.1.2019 - 19:54:57

    My problem is I can’t rotate the display.Sir please help me to do your project.

  14. Peťan: Hi, how exactly do you want to rotate the display? Could you take a photo of your issue?
    If you need rotate only each numbers (not to change their possition) you have to change „byte ByteRevers(byte in) {„ function. Or omit this function.
    If you need change the possition of each numbers (ie. reverse) you have to change „DrawSymbol“ function. You have to change „adr“ value.
    Maybe this picture could help you.
  15. Binod Binod
    24.1.2019 - 05:45:08

    Sir i am getting error . Can you help me by sending the full code of your project after rotating it 90 degree.I am totally new sir please help me.

  16. Peťan: Try to change this function. Just delete old one and add this:

    ByteRevers(byte in) {
    byte out;
    out = 0;
    if (in & 0x01) out |= 0x80;
    if (in & 0x02) out |= 0x40;
    if (in & 0x04) out |= 0x20;
    if (in & 0x08) out |= 0x10;
    if (in & 0x10) out |= 0x08;
    if (in & 0x20) out |= 0x04;
    if (in & 0x40) out |= 0x02;
    if (in & 0x80) out |= 0x01;
    return(in);
    }

    Or send me a photo. I don’t know how the font rotated is.

  17. ManWithNoName ManWithNoName
    26.5.2019 - 20:06:37

    Hi
    Greetings and thanks for your wonderful Clock concept. Haven’t peek your code yet, but loaded it into AVR (Atmega328P) and built on a Breadboard. Snap attached.
    Cheers

    Peťan: I’m pleasure your clock works 🙂

  18. ManWithNoName ManWithNoName
    27.5.2019 - 14:01:39

    This is a request whether its possible for you to add a display option like the below picture. As I’m not a coder, can’t figure out how the plot is done. But, the first three Matrices were used for Hour, Minute and Colon display: and the last for counting Second.

    Thanks in advance.

    Petan: Yes, it is posible, but it could be little difficult to implement it. The function „DrawSymbol“ can draw only one symbol (from font library) into one display. This function requires draw more than one symbol into one LED matrix (some font are too width). And of course make a new font for second. It could be a good function for next version. You can try to make it 🙂

  19. Martin Žák Martin Žák
    10.6.2019 - 22:07:38

    Dobrý den, vaše hodiny se mi moc líbí, možná to bude znít hloupě, ale šlo by přidat rotaci o 90° vpravo nebo vlevo?
    Chtěl bych hodiny použít vertikálně. V knihovně LedControl jsem tuto možnost nenašel.
    Děkuji za jakoukoli adpověď

    Martin Žák

    Peťan: Asi by to nemusel být problém. Až budu mít čas zkusím na to mrknout a zakomponovat to tam. Ale než budu mít čas, tak můžete zkusit na řádku 1096 přepsat příkaz lc.setRow(adr, j, ByteRevers(row)); na lc.setColumn(adr, j, ByteRevers(row));. Ale nezkoušel jsem to.

    • Martin Žák Martin Žák
      11.6.2019 - 23:24:08

      Díky, ve verzi 1.3 to je řádek 1079, měl jsem to zrcadlově otočené, pomohlo R=01
      A dvojtečka má takové divné zákmity…
      Pokusím se udělat video…

      Peťan: Vycházím z číslování řádku na GitHubu. Na řádku 1079 je začátek funkce, samotné vykreslování probíhá na řádku 1096. Dvojtečka je vykreslována sólo. Tím že to je přetočené, bude potřeba asi upravit i tuto část kódu.

      • Martin Žák Martin Žák
        12.6.2019 - 15:17:23

        Video: https://youtu.be/9n4iv5Ukofk

        Peťan: Ty LEDky blikají, protože se vykreslují po řádcích a čísla po sloupcích. Takže se dvojtečka sice vykreslí, ale zase přemaže posledním řádkem. Od řádku 1101 se vykresluje dvojtečka. Nahraď (adr == 2 && dotStyle > 0) za (adr == 2 && i ==7 && dotStyle > 0). A pak pod tím odstraň podmínky, aby se jenom vykreslovalo. Stejně by se to muselo řešit u dvojtečky teploty.

        • Martin Žák Martin Žák
          14.6.2019 - 23:09:00

          Udělal jsem úpravy podle rady a nelíbilo se mi kde ty dvojtečky blikají,
          tak jsem je posunul na bok…
          Moc děkuji za pomoc.

          Video: https://www.youtube.com/watch?v=0ACb7JM9uO8

          Peťan: Jó, není za co. Hlavně, že hodiny makají 🙂 Kdyžtak jde to blikání přepnout na trvalé svícení nastavením parametru „:01“

  20. Martin Žák Martin Žák
    11.6.2019 - 23:27:50

    A kompilace mi hází chybu:
    avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x00
    avrdude: stk500_disable(): protocol error, expect=0x14, resp=0x00

    ale chodí to, asi chyba u mě…

    Peťan: Těžko říct, ale pokud to nahraje kód do procesoru, tak bych to neřešil.

  21. orduhan orduhan
    7.7.2019 - 21:52:22

    Hello
    1.4 installed it worked smoothly.
    thanks

    Peťan: Good to hear it 🙂

  22. Luděk Luděk
    16.7.2019 - 16:49:35

    Zdravím, super práce… vyzkoušeno 🙂
    Prosím, trápím se s programem, aby Arduino přečetlo 8 Byte z paměti
    a zobrazilo je na Matrix display a nedaří se…
    Luděk

    Peťan: Jde o to z jaké paměti a v jakém formátu vypsalo na displej? Doporučuji začít čtením z té paměti a výpisem na sériový port. Až to bude fungovat, tak zkusit něco vypsat na displej. A až bude fungovat i to, tak to „spojit dohromady“.

  23. Johnny Johnny
    27.7.2019 - 10:56:24

    Hey. Wonderful watch. Thank you! I am looking forward to the new version of the clock with the ability to display seconds on the display.

    Peťan: Now, I don’t want do add this function. It requires a big upgrade of code. But in future, I would like to add it.

  24. Shivakumar Shivakumar
    2.8.2019 - 10:41:47

    Thanks a lot for your such a nice project, after perfectly assembly my clock works well

    Peťan: Thanks for your feedback. Good to hear it 🙂

  25. Luděk Srb Luděk Srb
    20.8.2019 - 13:12:10

    Dobrý den,
    prosím, jak se tvoří kody pro ty znaky? Jedna matice má 8×8 bodů a
    v tabulce pro každý znak je 16 Byte…
    a co to je – const uint64_t ?
    díky Luděk

    Peťan: Na tvorbu znaků používám LED Matrix Editor. Jinak, pro každý znak není použito 16, ale 8 bajtů. Zápis je v šestnáctkové soustavě, takže každý bajt jsou dva znaky (00 až ff) + identifikátor 0x na začátku. 8*8 = 64 bitů – je tedy proměnná unit64_t, což je kladná celočíselná proměnná, která zabírá v paměti 64 bitů. Více najdeš, když si vyhledáš klíčová slova C++ jako třeba „const“ a „uint64_t“.

  26. Luděk Luděk
    20.8.2019 - 16:00:57

    Díky Peťane, pořád se člověk učí …
    Já toto použil jako „mustr“ pro display, kdy potřebuji po RS485 poslat čas a dvě teploty,
    a pak je zobrazovat úplně stejně, jako tady to datum a teplota.
    Takže nečtu RTC, ale EEPROM 24C32 kam se uloží tyto údaje a tento display to pěkně zobrazí
    a navíc čas jedním fontem a teploty druhým fontem, který chci maličko upravit…
    🙂 díky

Napsat komentář: ManWithNoName Zrušit odpověď na komentář

Vaše emailová adresa nebude zveřejněna.