Apprenez à demander la date et l’heure à un serveur NTP à l’aide de l’ESP32 avec Arduino IDE. L’obtention de la date et de l’heure est utile dans les projets d’enregistrement de données pour horodater les lectures. Pour obtenir l’heure d’un serveur NTP, le ESP32 doit disposer d’une connexion Internet et vous n’avez pas besoin de matériel supplémentaire (comme une horloge RTC).
Avant de poursuivre ce tutoriel, vous devez avoir installé le module complémentaire ESP32 dans votre IDE Arduino :
Conseillé: Obtenez la date et l’heure avec le client-serveur ESP8266 NodeMCU NTP
NTP (protocole de temps réseau)
NTP signifie Network Time Protocol et c’est un protocole de mise en réseau pour la synchronisation d’horloge entre les systèmes informatiques. En d’autres termes, il est utilisé pour synchroniser les heures d’horloge des ordinateurs dans un réseau.
Il existe des serveurs NTP comme piscine.ntp.org que n’importe qui peut utiliser pour demander du temps en tant que client. Dans ce cas, l’ESP32 est un client NTP qui demande l’heure à un serveur NTP (piscine.ntp.org).
Obtenir la date et l’heure du serveur NTP
Pour obtenir la date et l’heure avec l’ESP32, vous n’avez pas besoin d’installer de bibliothèques. Il vous suffit d’inclure le heure.h bibliothèque dans votre code.
Le code suivant obtient la date et l’heure du serveur NTP et imprime les résultats sur le moniteur série. Il était basé sur l’exemple fourni par le heure.h bibliothèque.
/*
Rui Santos
Complete project details at https://Raspberryme.com/esp32-date-time-ntp-client-server-arduino/
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
*/
#include <WiFi.h>
#include "time.h"
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
const char* ntpServer = "pool.ntp.org";
const long gmtOffset_sec = 0;
const int daylightOffset_sec = 3600;
void setup(){
Serial.begin(115200);
// Connect to Wi-Fi
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
// Init and get the time
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime();
//disconnect WiFi as it's no longer needed
WiFi.disconnect(true);
WiFi.mode(WIFI_OFF);
}
void loop(){
delay(1000);
printLocalTime();
}
void printLocalTime(){
struct tm timeinfo;
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
Serial.print("Day of week: ");
Serial.println(&timeinfo, "%A");
Serial.print("Month: ");
Serial.println(&timeinfo, "%B");
Serial.print("Day of Month: ");
Serial.println(&timeinfo, "%d");
Serial.print("Year: ");
Serial.println(&timeinfo, "%Y");
Serial.print("Hour: ");
Serial.println(&timeinfo, "%H");
Serial.print("Hour (12 hour format): ");
Serial.println(&timeinfo, "%I");
Serial.print("Minute: ");
Serial.println(&timeinfo, "%M");
Serial.print("Second: ");
Serial.println(&timeinfo, "%S");
Serial.println("Time variables");
char timeHour[3];
strftime(timeHour,3, "%H", &timeinfo);
Serial.println(timeHour);
char timeWeekDay[10];
strftime(timeWeekDay,10, "%A", &timeinfo);
Serial.println(timeWeekDay);
Serial.println();
}
Comment fonctionne le code
Examinons rapidement le code pour voir comment cela fonctionne. Tout d’abord, incluez les bibliothèques pour vous connecter au Wi-Fi et obtenir du temps.
#include <WiFi.h>
#include "time.h"
Définition du SSID et du mot de passe
Tapez vos informations d’identification réseau dans les variables suivantes, afin que l’ESP32 puisse établir une connexion Internet et obtenir la date et l’heure du serveur NTP.
// Replace with your network credentials
const char* ssid = "REPLACE_WITH_YOUR_SSID";
const char* password = "REPLACE_WITH_YOUR_PASSWORD";
Serveur NTP et paramètres d’heure
Ensuite, vous devez définir les variables suivantes pour configurer et obtenir l’heure d’un serveur NTP : serveur ntp, gmtOffset_sec et daylightOffset_sec.
Serveur NTP
Nous demanderons l’heure de piscine.ntp.orgqui est un cluster de serveurs de temps que n’importe qui peut utiliser pour demander l’heure.
const char* ntpServer = "pool.ntp.org";
Décalage GMT
le gmtOffset_sec La variable définit le décalage en secondes entre votre fuseau horaire et GMT. Nous vivons au Portugal, donc le décalage horaire est de 0. Changer l’heure gmtOffset_sec variable pour correspondre à votre fuseau horaire.
const long gmtOffset_sec = 0;
Décalage lumière du jour
le daylightOffset_sec définit le décalage en secondes pour l’heure d’été. Elle est généralement d’une heure, cela correspond à 3600 secondes
const int daylightOffset_sec = 3600;
mettre en place()
Dans le mettre en place() vous initialisez la communication série au débit en bauds 115200 pour imprimer les résultats :
Serial.begin(115200);
Ces lignes suivantes connectent l’ESP32 à votre routeur.
// Connect to Wi-Fi
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected.");
Configurez l’heure avec les paramètres que vous avez définis précédemment :
configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
printLocalTime()
Après avoir configuré l’heure, appelez le printLocalTime() fonction pour imprimer l’heure dans le moniteur série.
Dans cette fonction, créez une structure temporelle (structure tm) appelé infos horaires qui contient tous les détails sur le temps (min, sec, heure, etc…).
struct tm timeinfo;
le tm structure contient une date et une heure calendaires décomposées en ses composants :
- tm_sec: secondes après la minute ;
- tm_min: minutes après l’heure ;
- tm_heure: heures depuis minuit ;
- tm_mday: jour du mois;
- tm_année: années depuis 1900;
- tm_wday: jours depuis dimanche ;
- tm_yday: jours depuis le 1er janvier ;
- tm_isdst: indicateur d’heure d’été ;
- documentation sur la structure de la TM.
Obtenez tous les détails sur la date et l’heure et enregistrez-les sur le infos horaires structure.
if(!getLocalTime(&timeinfo)){
Serial.println("Failed to obtain time");
return;
}
Ensuite, imprimez tous les détails sur l’heure dans le moniteur série.
Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");
Serial.print("Day of week: ");
Serial.println(&timeinfo, "%A");
Serial.print("Month: ");
Serial.println(&timeinfo, "%B");
Serial.print("Day of Month: ");
Serial.println(&timeinfo, "%d");
Serial.print("Year: ");
Serial.println(&timeinfo, "%Y");
Serial.print("Hour: ");
Serial.println(&timeinfo, "%H");
Serial.print("Hour (12 hour format): ");
Serial.println(&timeinfo, "%I");
Serial.print("Minute: ");
Serial.println(&timeinfo, "%M");
Serial.print("Second: ");
Serial.println(&timeinfo, "%S");
Pour accéder aux membres de la structure date et heure, vous pouvez utiliser les spécificateurs suivants :
%UNE | Nom complet du jour de la semaine |
%B | Nom complet du mois |
%ré | Jour du mois |
%Y | An |
%H | Heure au format 24h |
%JE | Heure au format 12h |
%M | Minute |
%S | Seconde |
Il existe d’autres spécificateurs que vous pouvez utiliser pour obtenir des informations dans un autre format, par exemple : nom de mois abrégé (%b), nom abrégé du jour de la semaine (%une), numéro de semaine avec le premier dimanche comme premier jour de la première semaine (%U), et d’autres (Lire la suite).
Nous vous montrons également un exemple, si vous souhaitez enregistrer des informations sur le temps dans des variables. Par exemple, si vous souhaitez enregistrer l’heure dans une variable appelée heureHeure, créez une variable char d’une longueur de 3 caractères (elle doit enregistrer les caractères de l’heure plus le caractère de fin). Ensuite, copiez les informations sur l’heure qui se trouve sur le infos horaires structure dans le heureHeure variables à l’aide de la strftime() une fonction.
Serial.println("Time variables");
char timeHour[3];
strftime(timeHour,3, "%H", &timeinfo);
Serial.println(timeHour);
Pour obtenir d’autres variables, utilisez un processus similaire. Par exemple, pour le jour de la semaine, nous devons créer une variable char d’une longueur de 10 caractères car le jour le plus long de la semaine contient 9 caractères (samedi).
char timeWeekDay[10];
strftime(timeWeekDay,10, "%A", &timeinfo);
Serial.println(timeWeekDay);
Serial.println();
Manifestation
Après avoir inséré vos informations d’identification réseau et modifié les variables pour modifier votre fuseau horaire et l’heure d’été, vous pouvez tester l’exemple.
Téléchargez le code de votre carte ESP32. Assurez-vous d’avoir sélectionné la bonne carte et le bon port COM. Après avoir téléchargé le code, appuyez sur le bouton ESP32 « Activer », et vous devriez obtenir la date et l’heure toutes les secondes, comme indiqué dans la figure suivante.
Conclusion
Dans ce didacticiel, vous avez appris à obtenir la date et l’heure d’un serveur NTP à l’aide de l’ESP32 programmé avec Arduino IDE. Maintenant, vous pouvez utiliser ce que vous avez appris ici pour horodater les lectures des capteurs dans vos propres projets.
Cette méthode ne fonctionne que si l’ESP32 est connecté à Internet. Si votre projet n’a pas accès à Internet, vous devez utiliser une autre méthode. Vous pouvez utiliser un Module RTC comme le DS1307.
Si vous voulez en savoir plus sur l’ESP32, consultez nos ressources :
Merci d’avoir lu.