Hodiny reálneho času (RTC) sú žiadúce v systémoch, ktoré vyžadujú synchronizáciu pre vlastné ovládanie, alebo použitie v aplikácii. Dnes si ukážeme rôzne metódy získavania reálneho času, ktorý môže byť použitý pre RTC, hodiny reálneho času. Najviac zastúpenou časťou systémov pracujúcich s RTC sú samozrejme počítače. Najčstejšie získavajú reálny čas z NTP služby. NTP služba poskytuje reálny čas v UTC pásme. Následne je to už vec softvéru, aby čas používal v časovej zóne, ktorú klient používa. Softvér sa môže v pravidelnom intervale dotazovať na NTP server pre aktualizáciu času, čím môže aktívne komponzovať nepresnosť interného RTC počítača.

S inými, alternatívnymi metódami získavania času pre RTC sa stretávame u mikroelektroniky a mikrokontrolérov. Mnoho z nich nemá ani vlastné RTC. Ak v takomto prípade chceme používať RTC, musíme využiť externý modul, ktorý najčastejšie komunikuje cez I2C zbernicu s rýchlosťami od 100 kHz (Standar dspeed IIC) do 400 kHz (Fast-speed IIC). Pre príklad Arduino Uno s IC ATmega328P. ATmega nemá RTC a tak je používateľ nútený využiť sekundárny modul, ak túto funkcionalitu vzhľadom pre aplikáciu požaduje.

Medzi najpoužívanejšie patria DS1307 a DS3231 od Maxim Instruments. Líšia sa v presnosti, ale aj spotrebe. DS3231 je presnejší voči DS1307, nakoľko má teplotnú kompenzáciu oscilátora, čo zmenšuje chybovosť, ktorá sa tu pohybuje niekde na úrovni +-3,5 ppm, respektíve +-2 ppm v závislosti na prevádzke v určitých teplotných rozsahoch. Spotreba DS1307, ktorý má externý kryštál v aktívnom stave je 1,5 mA, u DS3231 je to 200 uA. Aktívny stav predstavuje komunikáciu s mikrokontrolérom po IIC zbernici. Druhým parametrom je spotreba v tzv. stand-by stave, ktorý predstavuje napájaný senzor, ktorý nekomunikuje. Poznáme aj iné, napr. DS1302, čo je predchodca DS1307, prípadne zaujímavým RTC modulom je aj PCF8563 od NXP, ktorý je vhodný pre 1,8V napájaciu a operačnú logiku. Štandardne DS moduly sú komplatibilné pre 3V3 i 5V napájanie, resp. má 3V3 TTL logiku.

Oba spomenuté moduly sú obsiahnuté batériou, ktorá udržuje ich nastavený čas, ktorý sa prirodzene počíta aj v prípade, ak sa vypne host procesor s ktorým komunikuje. Batéria je najčastejšie CR2032, alebo akumulátor LIR2032. Tieto batérie majú štandardne do 240 mAh. Nakoľko takýto systém tvorený RC modulom a Arduinom nemá sám o sebe žiadnu konektivitu, je ho možné nastavovať alternatívnymi spôsobmi. Manuálnym zadaním času napríklad skrz sériovú linku, kde môže používateľa sám systém vyzvať na zadanie dátumu a času v požadovanom formáte, alebo jednotlivo pre každú položku.
Rovnako tak aj tu je možné napísať C# app, ktorá by dokázala mikrokontróler nastaviť na lokálny čas v počítači obdobným spôsobom skrz sériovú linku, prípadne by táto aplikácia mohla mať aj GUI pre manuálne zadanie týchto dát používateľom do príslušných input polí, ktoré sa potom odošlú do mikrokontroléra v preddefinovanom formát, napr. XML, JSON. Spôsoby pre manuálne nastavenie času môžu zahŕňať displeje a ďalšie spôsoby aj v závislosti od podporovaných zberníc mikrokontroléra a periférii, aj jeho dostupnej konektivity.
Pre automatizované získavanie času je možné využiť služby mobilných sietí, napr. GSM, pozičných sietí GPS. Sú tu ale aj iné metódy špecifické pre región. V Európe môžeme použiť dlhovlnný signál 77.5 kHz (frankfurtský časový signál), ktorý vysiela veža vo Frankfurte DCF77. Na strane Arduina pre príjem tohto signálu môžeme použiť modul MAS6180B1 s obvodom EB6180B1COB77K5A1, ktorý je prispôsobený pre frekvenciu 77,5 kHz. V iných svetových regiónoch je možné tiež použiť rovnaký prijímač s iným obdovom, ktorý je prispôsobený na lokálnu frekvenciu. Napríklad EB6180B1COB60K0A2 pre 60 kHz WWVB v USA, či pre JJY60 v Japonsku. Tento spôsob nastavenia času je veľmi populárny pre meteostanice.

Oplatia sa externé RTC moduly pred internými, ak ich MCU má?
To je dobrá otázka. Vzhľadom nato, že RTC moduly už majú vyriešenú batériu, dokážu uchovať čas aj po odpojení napájania host procesora. Ak má procesor integrované RTC hodiny, sú aktívne a použiteľné len do doby aktívneho napájania.
V otázke presnosti si ukážeme nasledujúci príklad pre mikrokontroléry ESP32 a ESP8266 od Espressif Systems. ESP8266 má RTC obvod, ktorý je založený na oscilátore a nie na kryštále. Tento oscilátor je jednoduchým RC obvodom a má značnú nepresnosť. RTC u ESP8266 môžeme používať pre aplikácie, kde chceme vypísať aktuálny čas a zároveň ho môžeme použivať aj na časové akcie spojené s prebúdzaním mikrokontroléra z režimu spánku. Toto som experiemntálne overil a pri nastavenom čase spánku na 300 sekúnd sa ESP8266 prebudilo o 15 sekúnd skôr, ako to bolo plánované, čo odpovedá chybe 5%, čo je v prepočte 50000 ppm. Inými slovami, za každú minútu sa čas oproti reálnemu rozíde o 3 sekundy.
To je za deň 1,2 hodiny, t.j. hodina a 12 minút. Teda o reálnej polnoci môžeme prepokladať čas 22:48, ak RTC bežalo po dobu 24 hodín. Na nepresnosť vplýva zmena teplôt, ale napríklad aj napájacie napätie. Z toho dôvodu by ESP8266 vyžadovalo kompenzáciu z NTP servera pre pravidelné nastavenie času. Nie je to iba o tomto prípade, ale čas môže používať aj aplikácia, ktorú ESP8266 obsluhuje. Napríklad môže v určitom čase počas dňa spúšťať zavlažovanie, spínať svetlá a podobne. S touto odchýlkou by razom bol čas úplne mimo.

ESP32 má kryštál, ktorý je presnejší a to dramaticky. Kmitá na frekvencii 40 MHz. Tento kryštál nie je teplotne kompenzovaný, ale aj tak má pomerne dobrú presnosť niekde na úrovni +-20 ppm. Pre použitie v bežných aplikách je určite postačujúci, rovnako tak aj pre veci súvisiace s ULP a pravidelnými rutinami, aj keď je to v trvaní niekoľko hodín, je to zanedbateľná odchýlka. Synchronizácia NTP mikrokontrolérom ESP trvá len niekoľko milisekúnd, nie je tak problém pravidelne volať rutinu. U ESP8266 by som odporúčil častejšie. Aj plánujete čisto offline aplikáciu, určite bude výhodnejšie zvoliť DS3231 RTC modul, ktorý je zo všetkých spomínaných entít najpresnejší a má ako jediný aj teplotnú kompenzáciu oscilátora priamo z výroby.