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

Arduino hodiny s maticovým displejem

8

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.

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.

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.

Jednotlivé komponenty
Základová barva
Matná černá. Vzadu jsou otvory pro zavěšení, nahoře pro nastavení

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.

Úspora místa je znatelná

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.

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.

Schéma zapojení

Zapojení pinů Arduina:

  • D2 – tlačítko 1 (připojuje GND, nastaven internal_pullup)
  • D3 – tlačítko 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
  • 5V – společné přes všechny moduly, přívod přes 1N4148 (na fotce není)

Program si můžete stáhnout zde, na mém GitHubu: https://github.com/…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í).

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.

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 hodiny nastavit čas pomocí sériového portu.

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 ®, otočení displeje ®. 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 se znaky v menu. Odesláním znaku otazníku „?“ do hodin se vypíše aktuální čas a nastavení.

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.

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

Různé fonty čísel

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.

  1. indra indra

    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

    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

    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

    [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

    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

    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

    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

    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.

Napsat komentář

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