ESP32 NTP Client-Server: datum en tijd ophalen - Arduino IDE

Esp32 Ntp Client Server Datum En Tijd Ophalen Arduino Ide



ESP32 is een op een microcontroller gebaseerd Internet of Things (IoT)-bord dat kan worden gekoppeld aan een breed scala aan apparaten. ESP32 wordt veel gebruikt in op IoT gebaseerde projecten.

Werken met ESP32 of een andere microcontroller-tijd is erg belangrijk omdat de ingebouwde timer niet zo nauwkeurig is, dus we kunnen een NTP server om realtime op te halen en kan deze opslaan in een variabele die later in ESP32-code kan worden gebruikt.

Network Time Protocol (NTP) maakt gebruik van de Coordinated Universal Time (UTC) die de systeemklok met grote precisie en nauwkeurigheid synchroniseert. Op kleinere netwerken kan NTP ons klokken leveren die zo nauwkeurig zijn als 1 ms, terwijl grotere netwerken zoals LAN (Local Area Network) NTP via internet een nauwkeurigheid kunnen geven van tientallen milliseconden. Met behulp van deze nauwkeurige klok kan ESP32 instructies op een bepaald tijdstip uitvoeren.







Deze handleiding bevat de volgende inhoud:



  1. Inleiding tot NTP (Network Time Protocol)
  2. NTP-server en tijdinstellingen



  3. Realtime afdrukken met de functie printLocalTime()





1: Inleiding tot NTP (Network Time Protocol)

NTP is een acroniem van N werk T Te doen P rotocol is een standaard die wordt gebruikt om de tijd van apparaten te synchroniseren met hun tijdzone. Het netwerktijdprotocol synchroniseert de tijd van alle netwerkapparaten met de UTC, ook wel Coordinated Universal Time genoemd.

UTC is als GMT (Greenwich Mean Time), maar het verandert niet en blijft overal ter wereld hetzelfde. Het belangrijkste idee achter het gebruik van de UTC is om de tijd af te lezen van de NTP server en door de UTC-offset toe te passen, kunnen we lokale tijd krijgen volgens onze tijdzone.



2: NTP-server en tijdinstellingen

Om de tijd van de NTP-server te lezen, moeten we de volgende variabelen in de code declareren. Met behulp van deze variabelen kunnen we de tijd van de NTP-server krijgen.

  • NTP-server
  • GMT-offset
  • Daglicht offset

2.1: NTP-server

We zullen tijd opvragen vanaf zwembad.ntp.org die wereldwijde tijdgegevens op de server bevat en iedereen kan zijn lokale tijd opvragen met behulp van deze pool. Hieronder volgen enkele andere servers waartoe we toegang hebben:

Gebied Hostnaam
Wereldwijd zwembad.ntp.org
Azië Azië.pool.ntp.org
Europa europa.pool.ntp.org
Noord Amerika noord-amerika.pool.ntp.org
Oceanië oceanië.pool.ntp.org
Zuid-Amerika zuid-amerika.pool.ntp.org

2.2: GMT-offset

De GMT-offset beschrijft het tijdsverschil in uren tussen de tijdzone waarin u leeft en de GMT. Als we bijvoorbeeld de tijdzone van de VS gebruiken, kunnen we deze instellen op UTC = -11:00 .

2.3: Daglichtverschuiving

Hier is de daglichtverschuiving de zomertijd die gewoonlijk als 1 uur wordt beschouwd. Zomertijd betekent dat de klok in de zomer 1 uur vooruit wordt gezet en in de winter weer terug wordt gezet. Deze opdracht wordt meestal gebruikt wanneer een aangepaste tijdzone wordt gebruikt en de zomertijdregel wordt toegepast.

Aangezien we nu de basisprincipes van de NTP-server hebben behandeld, zullen we controleren hoe we een verzoek naar de NTP-server kunnen sturen en de lokale tijd kunnen lezen met behulp van ESP32 met Arduino IDE-code.

3: Realtime afdrukken met behulp van de printLocalTime()-functie

De printLokaleTijd() functie roept de haalLokaleTijd() functie die het verzoek naar de NTP-server stuurt en de ontvangen datum en tijd opslaat in de tijd informatie variabel.

3.1: Code om in realtime af te drukken

Plak de gegeven code voor de NTP-clientserver in de Arduino IDE-editor. Verbind ESP32 met pc, selecteer de COM-poort en upload code.

#include
#include 'tijd.u'
const char * ssid     = 'REPLACE_WITH_YOUR_SSID';
const char * wachtwoord = 'REPLACE_WITH_YOUR_PASSWORD';
const char * ntpServer = 'pool.ntp.org' ;
const lang  gmtOffset_sec = 18000 ; /* GMT-OFFSET + 5 UREN ( 18000 SEC ) */
const int   daglichtOffset_sec = 3600 ; /* 1 uur daglicht offset */
annuleer printLocalTime ( )
{
struct tm tijdinfo;
als ( ! haal Lokale Tijd ( & tijd informatie ) ) {
Serial.println ( 'Kon geen tijd verkrijgen' ) ;
opbrengst ;
}
Serial.println ( & tijd info, '%A, %B %d %Y %H:%M:%S' ) ;
}
ongeldige opstelling ( )
{
Serieel.begin ( 115200 ) ;
// verbinding maken met wifi
Serieel.printf ( 'Verbinden met %s ' , ssid ) ;
WiFi.beginnen ( ssid, wachtwoord ) ;
terwijl ( WiFi.status ( ) ! = WL_VERBONDEN ) {
vertraging ( 500 ) ;
Serieel.afdrukken ( '.' ) ;
}
Serial.println ( ' VERBONDEN' ) ;
// init en krijg de tijd
configuratietijd ( gmtOffset_sec, daglichtOffset_sec, ntpServer ) ;
lokale tijd afdrukken ( ) ;
// wifi loskoppelen net zo het is niet meer nodig
WiFi.verbinding verbreken (waar);
WiFi.modus (WIFI_OFF);
}
ongeldige lus()
{
vertraging(1000);
printLokaleTijd();
}

Code begon met het opnemen van de wifi- en tijdbibliotheek. Wifi bibliotheek zal helpen om ESP32 te verbinden met een netwerk terwijl tijd bibliotheek zal de synchronisatie van de NTP-server afhandelen.

Daarna wordt de SSID en het wachtwoord van het netwerk waarmee ESP32 verbinding zal maken gedefinieerd. Vervang hier uw netwerkreferentie. Daarna hebben we gedefinieerd GMT-offset als 18000 sec, dat is (UTC+5 uur). U kunt hier uw eigen tijdzone UTC vervangen. Volg de koppeling om de GMT-offset voor uw tijdzone.

Bovendien wordt het NTP-serveradres gespecificeerd met behulp van de opdracht:

const char * ntpServer = 'pool.ntp.org' ;

Deze opdracht selecteert automatisch de tijdserver die u zal zoeken. We kunnen echter ook een tijdzone instellen met behulp van de NTP-servers die worden uitgelegd in de NTP-server sectie.

Aan het einde configureren we de ESP32 als NTP-client en om datum en tijd te verkrijgen. Daarvoor gebruikten we de configTime() functie.

Als laatste gebruik je de printLokaleTijd() functie, wordt de huidige datum en tijd afgedrukt op de seriële monitor. Deze functie bevat een tijdstructuur tm die alle informatie opslaat in de tijd informatie variabel.

De volgende opdrachten vertegenwoordigen de tijd informatie structuur.

Serial.println ( & tijd info, '%A, %B %d %Y %H:%M:%S' ) ;

Elke letter van de tijdstructuur heeft betrekking op een specifieke informatie:

Specificatie Informatie
%EEN Terugkeerdag van een week
%B Retour maand
%d Terugkeerdag van de maand
%J Retour huidige jaar
%H Retourneer het huidige uur
%M Retourneer huidige minuten
%S Retourneer huidige seconden

3.2: Uitvoer

Na het uploaden van code zal ESP32 verbinding maken met een wifi-netwerk en een verzoek naar de NTP-server sturen om de huidige datum en tijd te ontvangen. De volgende uitvoer is te zien op de Arduino seriële monitor.

De huidige tijd op mijn pc en ESP32 komen overeen.

We hebben met succes de tijd gelezen van de NTP-server met ESP32 als client.

Conclusie

Tijd is erg belangrijk voor toepassingen zoals tijdstempels en het uitvoeren van instructies op specifieke tijden om uitvoer te genereren. Ingebouwde timers zijn niet zo nauwkeurig, dus we kunnen een NTP-server gebruiken om de huidige tijd en datum te lezen. Deze tijd kan worden opgeslagen in een variabele om in onze code te gebruiken. Deze les helpt bij het verkrijgen van de juiste tijd van elke tijdzone over de hele wereld met behulp van ESP32.