Č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 trieda RTC. Takže ak chceme začať s modulom pracovať, tak importneme uvedenú triedu a vytvoríme objekt z triedy RTC:

    >>> 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 - rok
    • month - mesiac
    • day - deň
    • weekday - deň v týždni, pričom hodnota 0 pripadá na pondelok
    • hours - hodiny
    • minutes - minúty
    • seconds - sekundy
    • subseconds - subsekundy, čiastkové sekundy

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 modulu time zo štandardnej knižnice jazyka Python, ktorý má rovnakú funkcionalitu. Ak teda poznáte modul time zo štandardnej knižnice jazyka, práca s modulom utime 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.

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 modulu utime s parametrom 0:

    >>> 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 - rok
    • month - 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 hodnota 0 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 module utime:

    >>> 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()
  • Čas následne overíme zavolaním metódy .datetime() nad inštanciou triedy RTC:

    >>> rtc = machine.RTC()
    >>> rtc.datetime()
    (2020, 3, 14, 5, 13, 4, 11, 807)