Čas a synchronizácia času
Podpora RTC v mikrokontroléroch
Ak chceme v mikrokontroléri vedieť, koľko je hodín, potrebujeme na to modul hodín reálneho času (z angl. real time clock, skrátene RTC).
V prípade mikrokontroléra ESP32 nie je potrebné používať osobitný externý modul, pretože mikrokontrolér je takýmto modulom už vybavený. Aj napriek tomu však niektoré riešenia využívajúce tento mikrokontrolér majú osobitný RTC modul hlavne kvôli neustálemu externému napájaniu.
Podpora pre hodiny reálneho času sa nachádza priamo v jazyku MicroPython - v module
machine
sa priamo nachádza triedaRTC
. Takže ak chceme začať s modulom pracovať, tak importneme uvedenú triedu a vytvoríme objekt z triedyRTC
:>>> from machine import RTC >>> rtc = RTC()
Získanie aktuálneho dátumu a času
Aktuálny dátum a čas získame volaním metódy
.datetime()
:>>> rtc.datetime() 2000, 1, 1, 5, 0, 2, 32, 184) (
Výsledkom volania bude n-tica, ktorá obsahuje 8 prvkov. Ich význam je nasledovný (zľava doprava):
year
- rokmonth
- mesiacday
- deňweekday
- deň v týždni, pričom hodnota0
pripadá na pondelokhours
- hodinyminutes
- minútyseconds
- sekundysubseconds
- subsekundy, čiastkové sekundy
Upozornenie
Ak používate editor Thonny, tak si dajte pozor na jeho správanie. Tento editor totiž rovno na mikrokontroléri po jeho pripojení nastaví aktuálny čas bez toho, aby ste o tom vedeli. Takže ak budete rozmýšľať nad tým, že ako je možné, že mikrokontrolér má aktuálny čas aj napriek tomu, že nie je napájaný a nie je pripojený na internet, tak za to môže práve on.
Podobne sa však správa aj nástroj
rshell
, ktorý aktuálny čas nastaví z príkazového riadku.Bez uvedeného správania (zatiaľ) pracuje editor Mu alebo nástroj
mpremote
.
Manuálne nastavenie dátumu a času
Nastaviť aktuálny čas je možné manuálne zavolaním rovnakej metódy
.datetime()
s parametrom n-tice obsahujúcej aktuálny dátum a čas v tvare(year, month, day, weekday, hours, minutes, seconds, subseconds)
:>>> rtc.datetime((2020, 3, 13, 4, 22, 0, 0, 0)) >>> rtc.datetime() 2020, 3, 13, 4, 22, 0, 3, 964) (
Udržanie času po reštartovaní
Ak náhodou mikrokontrolér reštartnete, informácia o aktuálnom čase sa nestratí, pretože si ho modul hodín reálneho času bude pamätať:
>>> machine.reset() ...>>> rtc = machine.RTC() >>> rtc.datetime() 2020, 3, 13, 4, 22, 2, 36, 700) (
Ak však mikrokontrolér odpojíme od zdroja elektrickej energie (napr. vypojíme USB kábel), tak sa modul hodín reálneho času vynuluje:
>>> rtc = machine.RTC() >>> rtc.datetime() 2000, 1, 1, 5, 0, 0, 13, 980) (
Práca s časom v jazyku MicroPython
(slide) Na prácu s časom a dátumom v jazyku MicroPython máme k dispozícii modul
utime
. Tento modul je mikro implementáciou modulutime
zo štandardnej knižnice jazyka Python, ktorý má rovnakú funkcionalitu. Ak teda poznáte modultime
zo štandardnej knižnice jazyka, práca s modulomutime
bude pre vás úplne prirodzená.Modul
utime
poskytuje funkcie pre získanie aktuálneho času a dútumu, pre meranie časových intervalov a taktiež funkcie pre pozastavenie kódu.
Poznámka
Ak miesto modulu utime
budete importovať modul
time
, jazyk MicroPython vám to dovolí. Samozrejme,
že oba referujú na rovnaký modul.
Zistenie počiatku epochy v jazyku MicroPython
(slide) Ak chcete zisiť, aký počiatok epochy používa váš systém alebo zariadenie, môžete tak urobiť zavolaním funkcie
gmtime()
z moduluutime
s parametrom0
:>>> import utime >>> utime.gmtime(0) 2000, 1, 1, 0, 0, 0, 5, 1) (
Výsledkom volania je 8-ica, kde význam jednotlivých prvkov je nasledovný (zľava doprava):
year
- rokmonth
- mesiac (1
-12
)mday
- deň v mesiaci (1
-31
)hour
- hodina (0
-23
)minute
- minúta (0
-59
)second
- sekunda (0
-59
)weekday
- deň v týždni (0
-6
, pričom hodnota0
pripadá na pondelok)yearday
- deň v roku (1
-366
)
To, že 1. január 2000 naozaj pripadá na sobotu, si môžeme overiť napríklad príkazom
cal
v príkazovom riadku OS Linux:$ cal 1 1 2000 január 2000 Po Ut St Št Pi So Ne 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
Zistenie počtu sekúnd od počiatku epochy
(slide) Ak chceme na mikrokontroléri získať aktuálny čas v počte sekúnd od počiatku epochy, zavoláme funkciu
time()
, ktorá sa nachádzame v moduleutime
:>>> import utime >>> utime.time() 669375512
Konverzia na štruktúru reprezentujúcu čas
Spätne konvertovať čas z počtu sekúnd od počiatku epochy na 8 prvkovú nticu je možné pomocou funkcie
gmtime()
:>>> import utime >>> secs = utime.time() >>> utime.gmtime(secs) 2021, 3, 18, 9, 46, 33, 3, 77) (
Podpora protokolu NTP v jazyku Micropython
(slide) Na zariadeniach s jazykom Micropython môžeme pre synchronizáciu času cez protokol NTP použiť modul
ntptime
. Jeho funkcie sa automaticky postarajú aj o nastavenie aktuálneho času zariadenia priamo po synchronizácii času.Ak chceme modul
ntptime
začať používať, je potrebné ho najprv importovať:>>> import ntptime
Tento modul obsahuje niekoľko metód a vlastností. Ich kompletný zoznam si môžeme vypísať napríklad zavolaním:
>>> dir(ntptime) '__class__', '__name__', '__file__', 'socket', 'struct', 'time', ['NTP_DELTA', 'host', 'settime']
Ak si napr. necháme zobraziť obsah premennej
.host
, uvidíme adresu zariadenia, voči ktorému sa bude náš mikrokontrolér synchronizovať:>>> ntptime.host 'pool.ntp.org'
Samotnú synchronizáciu času zabezpečíme volaním funkcie
settime()
z tohto modulu:>>> ntptime.settime()
Upozornenie
Aby bola synchronizácia času úspešná, je potrebné, aby bolo zariadenie pripojené do internetu. V prípade, že to tak nie je, k synchronizácii nedôjde a bude len vyvolaná výnimka. Čas na zariadení zostane nezmenený!
Čas následne overíme zavolaním metódy
.datetime()
nad inštanciou triedyRTC
:>>> rtc = machine.RTC() >>> rtc.datetime() 2020, 3, 14, 5, 13, 4, 11, 807) (