Práce s ESP32 nebo jakýmkoli jiným mikrokontrolérem je velmi důležitá, protože vestavěný časovač není tak přesný, takže můžeme použít NTP server pro načtení reálného času a může jej uložit do proměnné, kterou lze později použít v kódu ESP32.
Network Time Protocol (NTP) používá koordinovaný světový čas (UTC), který synchronizuje systémové hodiny s velkou přesností a přesností. Na menších sítích nám NTP může poskytnout hodiny s přesností 1 ms, zatímco větší sítě, jako je LAN (Local Area Network), NTP může poskytovat přesnost s desítkami milisekund přes internet. Pomocí těchto přesných hodin může ESP32 provádět instrukce v konkrétním čase.
Tato příručka obsahuje následující obsah:
- Úvod do NTP (Network Time Protocol)
- Nastavení NTP serveru a času
- Tisk v reálném čase pomocí funkce printLocalTime().
1: Úvod do NTP (Network Time Protocol)
NTP je zkratka pro N síť T dělat P rotocol je standard používaný pro synchronizaci času zařízení s jejich časovou zónou. Síťový časový protokol synchronizuje čas všech síťových zařízení s UTC známým také jako koordinovaný světový čas.
UTC je jako GMT (Greenwich Mean Time), ale nemění se a zůstává stejné po celém světě. Hlavní myšlenkou používání UTC je čtení času z NTP server a použitím offsetu UTC můžeme získat místní čas podle našeho časového pásma.
2: Nastavení serveru NTP a času
Abychom mohli číst čas z NTP serveru, musíme v kódu deklarovat následující proměnné, pomocí kterých můžeme získat čas z NTP serveru.
- NTP server
- GMT Offset
- Posun denního světla
2.1: Server NTP
Požádáme o čas od pool.ntp.org který obsahuje celosvětová časová data na serveru a kdokoli může pomocí tohoto fondu požádat o svůj místní čas. Níže jsou uvedeny některé další servery, ke kterým máme přístup:
Plocha | Název hostitele |
---|---|
Celosvětově | pool.ntp.org |
Asie | asie.pool.ntp.org |
Evropa | europe.pool.ntp.org |
Severní Amerika | north-america.pool.ntp.org |
Oceánie | oceania.pool.ntp.org |
Jižní Amerika | south-america.pool.ntp.org |
2.2: GMT Offset
Posun GMT popisuje časový rozdíl v hodinách mezi časovým pásmem, ve kterém žijete, a GMT. Pokud například používáme časové pásmo USA, můžeme jej nastavit na UTC = -11:00 .
2.3: Posun denního světla
Zde je posunem denního světla letní čas, který se obvykle bere jako 1 hodina. Letní čas znamená posunutí hodin o 1 hodinu dopředu v létě a jejich změnu zpět v zimě. Tento příkaz se obvykle používá tam, kde se používá vlastní časové pásmo a platí pravidlo pro letní čas.
Protože jsme nyní probrali základy NTP serveru, zkontrolujeme, jak můžeme odeslat požadavek na NTP server a číst místní čas pomocí ESP32 s kódem Arduino IDE.
3: Tisk v reálném čase pomocí funkce printLocalTime().
The printLocalTime() funkce zavolá getLocalTime() funkce, která odešle požadavek na NTP server a uloží přijaté datum a čas uvnitř časová informace variabilní.
3.1: Kód pro tisk v reálném čase
Vložte daný kód pro klientský server NTP do editoru Arduino IDE. Připojte ESP32 k PC, vyberte COM port a nahrajte kód.
#include#include 'time.h'
konst char * ssid = „NAHRADIT_VAŠÍ_SSID“;
konst char * heslo = “NAHRAĎTE_VAŠÍM_HESLEM”;
konst char * ntpServer = 'pool.ntp.org' ;
const long gmtOffset_sec = 18 000 ; /* GMT OFFSET + 5 HODIN ( 18 000 SEC ) */
const int daylightOffset_sec = 3600 ; /* 1 hodinový posun denního světla */
void printLocalTime ( )
{
struct tm timeinfo;
-li ( ! getLocalTime ( & informace o čase ) ) {
Serial.println ( 'Nepodařilo se získat čas' ) ;
vrátit se ;
}
Serial.println ( & informace o čase, '%A, %B %d %Y %H:%M:%S' ) ;
}
neplatné nastavení ( )
{
Serial.begin ( 115200 ) ;
// připojit k WiFi
Serial.printf ( 'Připojování k %s' , ssid ) ;
WiFi.začátek ( ssid, heslo ) ;
zatímco ( Stav WiFi ( ) ! = WL_CONNECTED ) {
zpoždění ( 500 ) ;
Sériový.tisk ( '.' ) ;
}
Serial.println ( 'PŘIPOJENO' ) ;
// init a získat čas
configTime ( gmtOffset_sec, daylightOffset_sec, ntpServer ) ;
printLocalTime ( ) ;
// odpojit WiFi tak jako to již není potřeba
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
}
void loop()
{
zpoždění(1000);
printLocalTime();
}
Kód začal zahrnutím WiFi a časové knihovny. WiFi knihovna pomůže připojit ESP32 se sítí čas Knihovna se postará o synchronizaci NTP serveru.
Poté je definováno SSID a heslo sítě, ke které se ESP32 připojí. Zde nahraďte své přihlašovací údaje k síti. Poté jsme definovali GMT posun jako 18 000 sekund, což je (UTC + 5 hodin). Zde můžete nahradit své vlastní časové pásmo UTC. Následuj odkaz získat GMT posun pro vaše časové pásmo.
Kromě toho se adresa NTP serveru specifikuje pomocí příkazu:
konst char * ntpServer = 'pool.ntp.org' ;Tento příkaz automaticky vybere časový server, který vás bude hledat. Můžeme však také nastavit časové pásmo pomocí serverů NTP vysvětlených v NTP server sekce.
Nakonec nakonfigurujeme ESP32 jako NTP klienta a získáme datum a čas. K tomu jsme použili configTime() funkce.
Nakonec pomocí printLocalTime() funkce se na sériovém monitoru vytiskne aktuální datum a čas. Tato funkce obsahuje časovou strukturu tm který ukládá všechny informace do informace o čase variabilní.
Následující příkazy představují informace o čase struktura.
Serial.println ( & informace o čase, '%A, %B %d %Y %H:%M:%S' ) ;Každé písmeno časové struktury se vztahuje ke konkrétní informaci:
Specifikátory | Informace |
---|---|
%A | Den návratu v týdnu |
%B | Měsíc návratu |
%d | Den návratu v měsíci |
%Y | Návrat aktuální rok |
%H | Vrátit aktuální hodinu |
%M | Vrátit aktuální minuty |
%S | Vrátit aktuální sekundy |
3.2: Výstup
Po nahrání kódu se ESP32 připojí k WiFi síti a odešle požadavek na NTP server, aby obdržel aktuální datum a čas. Následující výstup lze vidět na sériovém monitoru Arduino.
Aktuální čas na mém PC a ESP32 je shodný.
Úspěšně jsme načetli čas z NTP serveru pomocí ESP32 jako klienta.
Závěr
Čas je velmi důležitý pro aplikace, jako je časové razítko a provádění instrukcí v určitých časech pro generování výstupu. Vestavěné časovače nejsou tak přesné, takže můžeme použít NTP server ke čtení aktuálního času a data. Tento čas lze uložit do proměnné a použít jej v našem kódu. Tato lekce pomáhá získat přesný čas v jakémkoli časovém pásmu po celém světě pomocí ESP32.