ESP8266 NodeMCU NTP Client-Serveur : Obtenir la date et l’heure (IDE Arduino)

ESP8266 NodeMCU NTP Client-Serveur : Obtenir la date et l'heure (IDE Arduino)

Dans ce didacticiel, vous apprendrez à obtenir la date et l’heure d’un serveur NTP à l’aide du NodeMCU ESP8266 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 ESP8266 doit disposer d’une connexion Internet et vous n’avez pas besoin de matériel supplémentaire (comme une horloge RTC).

ESP8266 NodeMCU NTP Client-Serveur : Obtenir la date et l'heure de l'IDE Arduino

Avant de continuer, assurez-vous que la carte ESP8266 est installée dans l’IDE Arduino :

Conseillé: Obtenez la date et l’heure avec le client-serveur ESP32 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’ESP8266 est un client NTP qui demande l’heure à un serveur NTP (piscine.ntp.org).

NTP Network Time Protocol ESP8266 NodeMCU Requête heure et date

Installation de la bibliothèque NTPClient

Nous utiliserons la bibliothèque NTPClient pour obtenir le temps. Dans votre IDE Arduino, accédez à Esquisser > Bibliothèque > Gérer les bibliothèques. Le gestionnaire de bibliothèque devrait s’ouvrir.

Rechercher NTPClient et installez la bibliothèque par Fabrice Weinber comme indiqué dans l’image suivante.

Installer la bibliothèque NTPClient ESP8266 NodeMCU

Fonctions temporelles de la bibliothèque NTPClient

La bibliothèque NTPClient est livrée avec les fonctions suivantes pour renvoyer l’heure :

obtenirJour() – renvoie un nombre entier qui correspond au jour de la semaine (0 à 6) commençant le dimanche ;

getHeures() – renvoie un nombre int avec l’heure courante (0 à 23) au format 24 heures ;

getMinutes() – retourne un nombre entier avec les minutes courantes (0 à 59) ;

getSeconds() – renvoie un nombre int avec la seconde courante ;

getEpochTime() – renvoie un long non signé avec l’heure d’époque (nombre de secondes écoulées depuis le 1er janvier 1970 (minuit GMT);

getFormattedTime() – renvoie une chaîne avec l’heure formatée comme HH:MM:SS ;

Cette bibliothèque ne contient pas de fonctions pour renvoyer la date, mais nous vous montrerons dans le code comment obtenir la date (jour, mois et année).

ESP8266 NodeMCU Code

Le code suivant connecte l’ESP8266 à un serveur NTP (piscine.ntp.org) pour demander la date et l’heure. Il affiche la date et l’heure actuelles dans plusieurs formats dans le moniteur série.

/*
  Rui Santos
  Complete project details at https://Raspberryme.com/esp8266-nodemcu-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 <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>

// Replace with your network credentials
const char *ssid     = "REPLACE_WITH_YOUR_SSID";
const char *password = "REPLACE_WITH_YOUR_PASSWORD";

// Define NTP Client to get time
WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");

//Week Days
String weekDays[7]={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

//Month names
String months[12]={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};

void setup() {
  // Initialize Serial Monitor
  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(".");
  }

// Initialize a NTPClient to get time
  timeClient.begin();
  // Set offset time in seconds to adjust for your timezone, for example:
  // GMT +1 = 3600
  // GMT +8 = 28800
  // GMT -1 = -3600
  // GMT 0 = 0
  timeClient.setTimeOffset(0);
}

void loop() {
  timeClient.update();

  unsigned long epochTime = timeClient.getEpochTime();
  Serial.print("Epoch Time: ");
  Serial.println(epochTime);
  
  String formattedTime = timeClient.getFormattedTime();
  Serial.print("Formatted Time: ");
  Serial.println(formattedTime);  

  int currentHour = timeClient.getHours();
  Serial.print("Hour: ");
  Serial.println(currentHour);  

  int currentMinute = timeClient.getMinutes();
  Serial.print("Minutes: ");
  Serial.println(currentMinute); 
   
  int currentSecond = timeClient.getSeconds();
  Serial.print("Seconds: ");
  Serial.println(currentSecond);  

  String weekDay = weekDays[timeClient.getDay()];
  Serial.print("Week Day: ");
  Serial.println(weekDay);    

  //Get a time structure
  struct tm *ptm = gmtime ((time_t *)&epochTime); 

  int monthDay = ptm->tm_mday;
  Serial.print("Month day: ");
  Serial.println(monthDay);

  int currentMonth = ptm->tm_mon+1;
  Serial.print("Month: ");
  Serial.println(currentMonth);

  String currentMonthName = months[currentMonth-1];
  Serial.print("Month name: ");
  Serial.println(currentMonthName);

  int currentYear = ptm->tm_year+1900;
  Serial.print("Year: ");
  Serial.println(currentYear);

  //Print complete date:
  String currentDate = String(currentYear) + "-" + String(currentMonth) + "-" + String(monthDay);
  Serial.print("Current date: ");
  Serial.println(currentDate);

  Serial.println("");

  delay(2000);
}

Afficher le code brut

Comment fonctionne le code

Tout d’abord, incluez les bibliothèques nécessaires.

#include <ESP8266WiFi.h>
#include <NTPClient.h>
#include <WiFiUdp.h>

Insérez vos informations d’identification réseau dans les variables suivantes afin que l’ESP8266 puisse se connecter à votre routeur pour avoir accès à Internet pour demander la date et l’heure au serveur NTP.

const char *ssid     = "REPLACE_WITH_YOUR_SSID";
const char *password = "REPLACE_WITH_YOUR_PASSWORD";

Définissez un client NTP pour obtenir la date et l’heure.

WiFiUDP ntpUDP;
NTPClient timeClient(ntpUDP, "pool.ntp.org");

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.

Ensuite, nous créons deux tableaux pour contenir les jours de la semaine et les noms des mois.

//Week Days
String weekDays[7]={"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};

//Month names
String months[12]={"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};

mettre en place()

Dans le mettre en place()initialisez le moniteur série pour afficher les informations.

Serial.begin(115200);

Ensuite, connectez l’ESP8266 à Internet.

// Connect to Wi-Fi
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
}

Initialisez le NTPClient.

timeClient.begin();

Définir le fuseau horaire

Vous pouvez utiliser le setTimeOffset() méthode pour régler l’heure de votre fuseau horaire en secondes.

timeClient.setTimeOffset(3600);

Voici quelques exemples pour différents fuseaux horaires :

  • GMT +1 = 3600
  • GMT +8 = 28800
  • GMT -1 = -3600
  • GMT 0 = 0

Nous vivons au Portugal, nous n’avons donc pas besoin d’ajuster l’heure.

timeClient.setTimeOffset(0);

boucler()

Dans le boucler()appeler le mettre à jour() pour obtenir la date et l’heure actuelles du serveur NTP.

timeClient.update();

Obtenir du temps

Ensuite, nous pouvons utiliser les fonctions fournies par la bibliothèque pour obtenir le temps. Par exemple, pour obtenir l’heure d’époque :

unsigned long epochTime = timeClient.getEpochTime();
Serial.print("Epoch Time: ");
Serial.println(epochTime);

le getFormattedTime() renvoie l’heure au format HH:MM:SS.

String formattedTime = timeClient.getFormattedTime();
Serial.print("Formatted Time: ");
Serial.println(formattedTime);  

Vous pouvez obtenir les heures, les minutes ou les secondes séparément en utilisant le getHeures(), getMinutes() et getSeconds() fonctionne comme suit :

int currentHour = timeClient.getHours();
Serial.print("Hour: ");
Serial.println(currentHour);  

int currentMinute = timeClient.getMinutes();
Serial.print("Minutes: ");
Serial.println(currentMinute); 
   
int currentSecond = timeClient.getSeconds();
Serial.print("Seconds: ");
Serial.println(currentSecond);  

Avoir un rendez-vous

le obtenirJour() renvoie un nombre compris entre 0 et 6, où 0 correspond à dimanche et 6 à samedi. Ainsi, nous pouvons accéder au nom du jour de la semaine à partir du tableau que nous avons créé précédemment comme suit

String weekDay = weekDays[timeClient.getDay()];
Serial.print("Week Day: ");
Serial.println(weekDay);  

Le client NTP n’est pas livré avec des fonctions pour obtenir la date. Donc, nous devons créer une structure temporelle (structure tm) puis accéder à ses éléments pour obtenir des informations sur la date.

struct tm *ptm = gmtime ((time_t *)&epochTime);

La structure temporelle contient les éléments suivants :

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

Les lignes suivantes obtiennent le jour du mois comme suit :

int monthDay = ptm->tm_mday;
Serial.print("Month day: ");
Serial.println(monthDay);

Pour obtenir les autres éléments, vous utilisez une approche similaire. Par exemple, pour le mois :

int currentMonth = ptm->tm_mon+1;
Serial.print("Month: ");
Serial.println(currentMonth);

Comme le tm_mday commence à 0, nous ajoutons 1 au mois pour que janvier corresponde au 1, février au 2, etc.

Ensuite, nous pouvons obtenir le nom du mois en utilisant le mois tableau que nous avons créé précédemment. La numérotation des tableaux commence à 0, c’est pourquoi nous soustrayons 1.

String currentMonthName = months[currentMonth-1];
Serial.print("Month name: ");
Serial.println(currentMonthName);

Pour obtenir l’année, nous devons ajouter 1900 car le tm_année enregistre le nombre d’années après 1900.

int currentYear = ptm->tm_year+1900;
Serial.print("Year: ");
Serial.println(currentYear);

Enfin, nous créons une chaîne appelée date actuelle qui contient la date actuelle au format AAAA-MM-JJ.

 String currentDate = String(currentYear) + "-" + String(currentMonth) + "-" + String(monthDay);
 Serial.print("Current date: ");
 Serial.println(currentDate);

Manifestation

Après avoir inséré vos informations d’identification réseau et modifié les variables pour ajuster l’heure à votre fuseau horaire, testez l’exemple.

Téléchargez le code de votre carte ESP8266. Assurez-vous d’avoir sélectionné la bonne carte et le bon port COM.

Ouvrez le moniteur série à un débit en bauds de 115200. La date et l’heure doivent être affichées dans plusieurs formats, comme indiqué ci-dessous.

ESP8266 NodeMCU 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’ESP8266. Ceci est particulièrement utile pour les projets d’enregistrement de données qui ont accès à Internet.

Si vous n’avez pas accès à Internet, vous pouvez utiliser un Module RTC comme le DS1307.

Si vous souhaitez en savoir plus sur l’ESP8266, consultez nos ressources :

Merci d’avoir lu.