stránky radioamatérské stanice
OK2PPK » Texty » Technika a provoz » Hodiny ClockOneDigit | ---
Hodiny s jednou 7-segmentovou číslicovkou a NTP synchronizací času
Tyto hodiny nejsou vlastně až tak přímo mým projektem, ale spíše mého známého. Zhlédl se ve dvou věcech. Jednak si koupil čínské ručičkové hodiny, které si uměly synchronizovat čas s NTP servrem přes Wi-Fi. A pak zase někde na internetu našel hodiny postavené nad Arduino Nano, které měly velký jednomístný displej v podobě 7-segmentové číslicovky, vyrobený z LED pásků a z krabičky vytištěné na 3D tiskárně. A jeho snem se stalo mít hodiny s takovouto velkou jednou 7-segmentovkou, které by si čas načítaly přes Wi-Fi z NTP serveru.
Známý je sice vynikající bastlíř a i desku osázenou SMD opraví tak, že skoro nepoznáte rozdíl oproti tomu, co bylo původně osázeno na lince ve fabrice, ale programování obvodů ho tak nějak minulo. Takže s naprogramováním této jeho vize se obrátil na mě. A ke své vizi měl i konkrétní požadavek na hardware hodin, kde chtěl použít dva čínské moduly - jeden s obvodem ESP8266EX a druhý s RTC DS3231. A já ho s tou jeho vizí delší dobu posílal někam.
Nakonec mě do toho namočil v okamžiku, když si zkusil postavit alespoň ty jednomístné hodiny bez Wi-Fi na Arduinu podle podkladů stažených z internetu, jiný známý mu na to navrhnul a na 3D tiskárně vytisknul díly na displej, a ono mu to po spuštění nejelo. Nezbylo mi, než si od něho hodiny, zatím v podobě vývojového prototypu, odnést, podívat se na zdrojový kód programu, co si do toho nahrál, zjistit z toho, co je blbě, a po HW opravě k tomu napsat i svůj vlastní řídicí program, protože ten původní byl takový nějaký nedokončený, vpodstatě nic moc neuměl, a že by šel do budoucna rozšířit o synchronizaci času s NTP serverem se mi jevilo jako nemožné. Bylo potřeba předělat celou filozofii zobrazování času a nastavování hodin tak, aby veškeré časování zobrazení na displeji bylo vůči hlavní programové smyčce Loop() neblokující, a bylo možné snadno přidávat další režimy činnosti a přepínat mezi nimi. Z původního softu zůstal vlastně zachován jen samotný princip sekvenčního zobrazení hodin a minut, jehož myšlenka si myslím není vůbec špatná. Původní projekt jednomístných hodin, který známého tak zaujal, najdete na stránce DIY 3D Printed Single Digit Arduino Clock.
Známý v hodinách ve své 7-segmentovce složené z LED pásků nepoužíval desetinnou tečku, takže jako spínače segmentů použil obvod ULN2003 se 7-mi výstupy. Já naopak použil při vývoji programu v testovací verzi hodin postavené na kontaktním bastlpoli klasickou 7-segmentovku LED včetně desetinné tečky. Hodiny se nejprve testovaly na Arduino Nano, a pak si známý postavil už finální verzi plně zabudovanou do krabičky displeje včetně malého AC 220V zdroje, kde se kvůli rozměrům použilo Arduino Pro Mini. To byl zásadní rozdíl oproti původnímu vzezření hodin, protože tyto už neměly žádný podstavec, vše i se zdrojem se vešlo přímo do 7-segmentového displeje. V této verzi jsme také oproti původnímu zapojení přesunuli dva segmenty na jiné porty Arduina, tak aby nebyly na vývodech používaných pro TxD a RxD, což znamenalo i upravit řízení displeje v programu.
Pak jsem připravil návrh, jak budou hodiny zapojeny s modulem ESP8266EX včetně použití seriového registru 74HC595 pro řízení displeje, upravil jsem pro tento modul program napsaný původně pro ATmegy v modulech Arduino, a po vyzkoušení se známý pustil do realizace dalších hodin, kde narozdíl ode mnou použité poměrně veliké vývojovou desky s ESP8266EX, chtěl kvůli rozměrům použít ESP8266EX na modulu ESP12F. Jeho konstrukce měla být v podobě prostorového slepence součástek, kde chtěl k sobě zády napasovat SMD obvody ULN2003 a 74HC595 tak, aby jejich vstupy a výstupy šly po jedné straně pouzder spojit 1:1, a chtěl posunout řízení segmentů displeje na jiné bity, než používal můj testovací prototyp hodin. Abych nemusel souběžně udržovat samostatný kód pro různé hardwarově odlišně verze hodin, tak jsem nakonec vše sloučil do jednoho zdrojového kódu, kde se veškeré hardwarové varianty řešily pouhou změnou konfigurace programu.
Už na modulech Arduino jsem do programu hodin oproti původnímu kódu hodin z internetu, který zobrazoval pouze čas, doplnil i zobrazování a nastavování kalendářního data a automatickou obsluhu letního času. To bylo nutné kvůli budoucí podpoře načítání času z NTP servru, který poskytuje pouze čas UTC, a na lokální si ho musíte přepočítat. Po rozchození základu hodin na ESP8266EX jsem pak doplnil do jejich programu nastavování hodin přes Wi-Fi přes v nich spuštěný http server a i samotnou synchronizaci času s NTP servrem. Jako poslední jsem pak přidal možnost ovládat hodiny přes sériový port. Protože se modul ESP8266EX nedokázal v místě, kde jsem ho potřeboval testovat, připojit na lokální Wi-Fi síť kvůli složitosti jejího zabezpečení, tak jsem si musel napsat i vlastní testovací NTP server a spustit si ho na jiném modulu ESP8285 a hodiny zkoušet vůči němu.
Hodiny umožňují zobrazovat na jednomístném displeji sekvenčně čas v hodinách a minutách v režimu 24 nebo 12 hodin, nebo sekundy. Jednorázově umožňují zobrazit kaledářní datum včetně dne v týdnu a další údaje související s jejich nastavením. Umí automaticky přepínat na letní čas. U provedení s modulem ESP8266EX (ESP8285) podporují nastavení pomocí zabudovaného konfiguračního serveru přes Wi-Fi a získání času z NTP servru přes Wi-Fi. Hardwarově jsou postaveny nad moduly Arduino nebo ESP8266 a s použitím RTC modulu s DS3231. Lze je ale provozovat i bez externího obvodu RTC, pokud se konfigurace programu přepne do režimu emulace RTC obvodu (přesnost hodin je pak dána přesností oscilátoru procesoru a zapomenou čas při každém restartu CPU). S výjimkou modulu Arduino Pro Mini, který má na to příliš malou paměť, umožňují i ovládání přes sériový port.
Podrobný popis hodin najdete v návodu PDF (nebo TXT bez obrázků) níže a ve zdrojovém kódu taktéž níže. Hodiny vznikly v několika hardwarových variantách - pro Arduino Nano, Arduino Pro Mini a ESP8266EX (resp. ESP8285). Hodiny nelze přeložit pro moduly postavené nad ESP32, jejich kód by se musel pro tento obvod přepsat, jsou zde totiž trochu určité rozdíly oproti ESP8266EX, např. ve způsobu ukládání dat do EEPROM simulované v SPI Flash. Ve zdrojovém kódu je několik předpřipravených konfigurací (označení A1..., A2..., E1..., atd.) a níže jsou k nim na odkazech schémata zapojení, kterým tyto konfigurace odpovídají. Pro jiné zapojení je nutné si upravit svoji vlastní konfiguraci. Známý si vyráběl i jedno provedení, které přepínalo barvu LED pásku v displeji podle osvětlení fototranzistoru, najdete ho také mezi schématy níže.
Nenajdete zde nějaké další podklady k fyzickému provedení hodin, jako třeba 3D model krabičky displeje hodin apod., protože já sám jsem tyto věci neřešil a známý si je zařizoval jinými cestičkami. A schémata ukazují pouze principiální zapojení jádra hodin, bez zdroje a bez detailů ke skutečnému zapojení displeje z LED pásků.
Funkcionalitu ovládání přes sériový port nedoporučuji používat v kombinaci s připojením přes Wi-Fi pro normální nasazení jako hodiny, ale spíše jen pro účely testování, protože jsem během vývoje programu narazil na problémy se stabilitou Wi-Fi u této kombinace, které jsem sice vyřešil explicitním přesunutím části kódu do RAM, ale nemám pro toto divné chování žádné vysvětlení.