Rad s ESP32 ili bilo kojim drugim vremenom mikrokontrolera vrlo je važan jer ugrađeni mjerač vremena nije tako precizan pa možemo koristiti NTP poslužitelj za dohvaćanje stvarnog vremena i može ga pohraniti unutar varijable koja se kasnije može koristiti unutar ESP32 koda.
Network Time Protocol (NTP) koristi koordinirano univerzalno vrijeme (UTC) koje sinkronizira sistemski sat s velikom preciznošću i točnošću. Na manjim mrežama NTP nam može pružiti satove točne do 1 ms, dok veće mreže kao što je LAN (Local Area Network) NTP može dati točnost s desecima milisekundi preko interneta. Korištenjem ovog preciznog sata ESP32 može izvršavati upute u određeno vrijeme.
Ovaj vodič sadrži sljedeće sadržaje:
- Uvod u NTP (Network Time Protocol)
- NTP poslužitelj i postavke vremena
- Ispis u stvarnom vremenu pomoću funkcije printLocalTime().
1: Uvod u NTP (Network Time Protocol)
NTP je akronim od N mreža T napraviti P rotocol je standard koji se koristi za sinkronizaciju vremena uređaja s njihovom vremenskom zonom. Mrežni vremenski protokol sinkronizira vrijeme svih mrežnih uređaja s UTC-om također poznatim kao koordinirano univerzalno vrijeme.
UTC je kao GMT (srednje vrijeme po Greenwichu), ali se ne mijenja i ostaje isti u cijelom svijetu. Glavna ideja iza korištenja UTC-a je čitanje vremena iz NTP poslužitelja i primjenom UTC offseta možemo dobiti lokalno vrijeme prema našoj vremenskoj zoni.
2: NTP poslužitelj i postavke vremena
Za čitanje vremena s NTP poslužitelja moramo deklarirati sljedeće varijable unutar koda pomoću ovih varijabli možemo dobiti vrijeme s NTP poslužitelja.
- NTP poslužitelj
- GMT pomak
- Odmak dnevnog svjetla
2.1: NTP poslužitelj
Zatražit ćemo vrijeme od pool.ntp.org koji sadrži podatke o svjetskom vremenu na poslužitelju i svatko može zatražiti svoje lokalno vrijeme koristeći ovaj skup. Slijede neki drugi poslužitelji kojima možemo pristupiti:
Površina | Naziv hosta |
---|---|
Širom svijeta | pool.ntp.org |
Azija | asia.pool.ntp.org |
Europa | europe.pool.ntp.org |
Sjeverna Amerika | sjeverna amerika.pool.ntp.org |
Oceanija | oceania.pool.ntp.org |
Južna Amerika | južna amerika.pool.ntp.org |
2.2: GMT pomak
GMT pomak opisuje vremensku razliku u satima između vremenske zone u kojoj živite i GMT-a. Na primjer, ako koristimo vremensku zonu SAD-a, možemo je postaviti na UTC = -11:00 .
2.3: Pomak dnevnog svjetla
Ovdje je pomak ljetnog svjetla ljetno računanje vremena koje se obično uzima kao 1 sat. Ljetno računanje vremena znači pomicanje sata 1 sat unaprijed tijekom ljeta i vraćanje unazad zimi. Ova se naredba obično koristi kada se koristi prilagođena vremenska zona i kada se primjenjuje pravilo ljetnog računanja vremena.
Kako smo pokrili osnove NTP poslužitelja sada ćemo provjeriti kako možemo poslati zahtjev NTP poslužitelju i očitati lokalno vrijeme koristeći ESP32 s Arduino IDE kodom.
3: Ispis u stvarnom vremenu pomoću funkcije printLocalTime().
The printLocalTime() funkcija će pozvati getLocalTime() funkcija koja šalje zahtjev NTP poslužitelju i pohranjuje primljeni datum i vrijeme unutar timeinfo varijabla.
3.1: Kod za ispis u stvarnom vremenu
Zalijepite navedeni kod za NTP klijentski poslužitelj u Arduino IDE editor. Povežite ESP32 s računalom, odaberite COM port i prenesite kod.
#include#uključi 'vrijeme.h'
const char * ssid = “ZAMIJENI_VAŠIM_SSID-om”;
const char * lozinka = “ZAMIJENI_VAŠOM_LOZINKOM”;
const char * ntpServer = 'pool.ntp.org' ;
const long gmtOffset_sec = 18000 ; /* GMT OFFSET + 5 SATI ( 18000 SEK ) */
const int daylightOffset_sec = 3600 ; /* 1 sat dnevnog svjetla offset */
void printLocalTime ( )
{
struct tm timeinfo;
ako ( ! getLocalTime ( i informacija o vremenu ) ) {
Serijski.println ( 'Nije uspjelo dobivanje vremena' ) ;
povratak ;
}
Serijski.println ( i informacija o vremenu, '%A, %B %d %Y %H:%M:%S' ) ;
}
void setup ( )
{
Serijski.početi ( 115200 ) ;
// spojiti na WiFi
Serijski.printf ( 'Povezivanje na %s' , ssid ) ;
WiFi.početak ( ssid, lozinka ) ;
dok ( WiFi.status ( ) ! = WL_POVEZAN ) {
odgoditi ( 500 ) ;
Serijski.ispis ( '.' ) ;
}
Serijski.println ( 'POVEZAN' ) ;
// pokrenuti i dobiti vrijeme
configTime ( gmtOffset_sec, daylightOffset_sec, ntpServer ) ;
printLocalTime ( ) ;
// odspojite WiFi kao to više nije potrebno
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
}
void petlja()
{
kašnjenje (1000);
printLocalTime();
}
Kôd je započeo uključivanjem WiFi-a i knjižnice vremena. WiFi knjižnica pomoći će povezati ESP32 s mrežom dok vrijeme biblioteka će upravljati sinkronizacijom NTP poslužitelja.
Nakon toga definira se SSID i lozinka mreže na koju će se ESP32 spojiti. Ovdje zamijenite svoju mrežnu vjerodajnicu. Nakon toga smo definirali GMT pomak kao 18000 sekundi što je (UTC+5 sati). Ovdje možete zamijeniti svoju vremensku zonu UTC. Prati veza dobiti GMT pomak za vašu vremensku zonu.
Dodatno se adresa NTP poslužitelja navodi pomoću naredbe:
const char * ntpServer = 'pool.ntp.org' ;Ova naredba automatski odabire vremenski poslužitelj koji će vas pretraživati. Međutim, također možemo postaviti vremensku zonu pomoću NTP poslužitelja objašnjenih u NTP poslužitelj odjeljak.
Na kraju konfiguriramo ESP32 kao NTP klijent i dobivamo datum i vrijeme. Za to smo koristili configTime() funkcija.
Na kraju, korištenjem printLocalTime() funkciju, trenutni datum i vrijeme ispisuju se na serijskom monitoru. Ova funkcija sadrži vremensku strukturu tm koji pohranjuje sve informacije u informacija o vremenu varijabla.
Sljedeće naredbe predstavljaju informacija o vremenu struktura.
Serijski.println ( i informacija o vremenu, '%A, %B %d %Y %H:%M:%S' ) ;Svako slovo vremenske strukture odnosi se na određenu informaciju:
Specifikatori | Informacija |
---|---|
%A | Dan povratka u tjednu |
%B | Mjesec povrata |
%d | Povratni dan u mjesecu |
%Y | Povratak tekuće godine |
%H | Vrati trenutni sat |
%M | Vrati trenutne minute |
%S | Vrati trenutne sekunde |
3.2: Izlaz
Nakon učitavanja koda ESP32 će se povezati s WiFi mrežom i poslati zahtjev NTP poslužitelju za primanje trenutnog datuma i vremena. Sljedeći izlaz može se vidjeti na Arduino serijskom monitoru.
Trenutno vrijeme na mom PC-u i ESP32 su usklađeni.
Uspješno smo očitali vrijeme s NTP poslužitelja koristeći ESP32 kao klijenta.
Zaključak
Vrijeme je vrlo važno za aplikacije kao što su vremensko žigosanje i izvršavanje instrukcija u određeno vrijeme za generiranje izlaza. Ugrađeni mjerači vremena nisu toliko precizni, pa možemo koristiti NTP poslužitelj za očitavanje trenutnog vremena i datuma. Ovo vrijeme može biti pohranjeno unutar varijable za korištenje unutar našeg koda. Ova lekcija pomaže u dobivanju točnog vremena u bilo kojoj vremenskoj zoni diljem svijeta pomoću ESP32.