Client-serveur NTP ESP32 : Obtenir la date et l’heure (IDE Arduino)

Client-serveur NTP ESP32 : Obtenir la date et l'heure (IDE Arduino)

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).

ESP32 NTP Client-Server Obtenir la date et l'heure Arduino IDE

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).

NTP Network Time Protocol ESP32 Demander l'heure et la date

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();
}

Afficher le code brut

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.

ESP32 Get Date and Time NTP Client-Server Arduino IDE Serial Monitor démonstration

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.