Ajout de code logiciel pour récupérer l’heure de référence

Je vous propose d’utiliser le protocole NTP (Network Time Protocol) pour récupérer l’heure de références universelle en synchronisant votre ESP8285 à un serveur de temps disponible sur internet.
Bibliothèques nécessaires
Les nouvelles bibliothèques dont nous avons besoins sont:
- « EasyNTPClient » qui, comme sont nom l’indique, gère de manière simple le protocol NTP.
- « WiFiUdp » car le protocol NTP repose sur le protocol UDP (User Datagram Protocol).
Je vous invite à installer la bibliothèques Arduino « EasyNTPClient » by Harsha Alva. Pour plus d’information sur la procédure d’installation d’une bibliothèquee, reportez-vous à l’article « Température et humidité avec Arduino« .
Une fois cette installation réalisée, complétez le programme précédent en ajoutant la déclaration des 2 bibliothèques :
#include <EasyNTPClient.h> #include <WiFiUdp.h>
Dans les déclarations globales au croquis, déclarez l’objet « Udp_G » pour piloter les trames Wi-Fi émises et reçues au format UDP:
WiFiUDP Udp_G; // Objet UDP permettant d'envoyer et recevoir des trames Wi-Fi selon le protocole UDP
Le projet NTP Pool liste un très grand nombre de serveurs de temps pour la communauté qu’il rend disponible via l’adresse « pool.ntp.org ».
Pour créer un client NTP « ClientNtp_G » et lui demander de se synchroniser à cette communauté NTP Pool, saisissez l’instruction suivante:
EasyNTPClient ClientNtp_G(Udp_G, "pool.ntp.org"); // Objet NTP synchronisé avec "pool.ntp.org"
La réception du temps Unix et son affichage
Afin de pouvoir continuer à surveiller l’état de la connexion après le démarrage, nous allons commencer par déplacer l’affichage des erreurs de connexion depuis la fonction « setup » vers la fonction « loop » .
Après avoir supprimé les lignes inutiles de la fonction « setup » , voici les premières lignes de la fonction « loop« :
void loop() { if(WiFi.status()==WL_CONNECTED) { // Internet est disponible } else { // Pas de connexion internet Afficheur_G.setCursor(0,0); Afficheur_G.print("Erreur de "); Afficheur_G.setCursor(0,1); Afficheur_G.print(" Connexion"); } }
La méthode « getUnixTime » de l’objet « ClientNtp_G » permet de récupérer le temps de référence sur internet au format « Unix Time »:
TempsUnix_L = ClientNtp_G.getUnixTime();
« Unix Time » est un système de représentation de la date et l’heure basé sur le décompte des secondes qui se sont écoulées depuis le 1er janvier 1970. Cette valeur est stockée dans un entier non signé de 32 bits:
unsigned long TempsUnix_L;
Maintenant que vous avez récupéré cet « Unix Time », je vous invite à l’afficher sur l’écran LCD, avec par exemple le titre en première ligne et la valeur en seconde ligne.
Suite à ces différentes évolutions, vous devez obtenir un code logiciel assez proche de celui-ci:
// Déclaration des librairies utilisées #include <ESP8266WiFi.h> #include <LiquidCrystal_I2C.h> #include <EasyNTPClient.h> #include <WiFiUdp.h> // Déclaration globales LiquidCrystal_I2C Afficheur_G(0x27, 16, 2); // Afficheur LCD1206 d'addresse 0x27 avec écran de 2 lignes de 16 caractères WiFiUDP Udp_G; // Objet UDP permettant d'envoyer et recevoir des trames Wi-Fi selon le protocole UDP EasyNTPClient ClientNtp_G(Udp_G, "pool.ntp.org"); // Objet NTP synchronisé avec "pool.ntp.org" // Fonction de démarrage, s'exécute une seule fois: void setup() { // Constantes de la fonction const char* SSID_L = "LiveBox_1324"; // Nom du réseau Wi-Fi const char* MOT_DE_PASSE_L = "12345?ABCDE"; // Mot De Passe du réseau // Variables de la fonction wl_status_t StatutConnexion_L; // Pour mémoriser l'état de la connexion Afficheur_G.init(5,4); // Initialisation de l'afficheur, SDA=5, SCL=4 Afficheur_G.backlight(); // Allumage du rétroéclairage WiFi.begin(SSID_L, MOT_DE_PASSE_L); // Tentative de connexion au point d'accès Wi-Fi StatutConnexion_L = WiFi.status(); // Lecture de l'état de la connexion et mémorisation dans la variable "StatutConnexion_L" while ((StatutConnexion_L != WL_NO_SSID_AVAIL)&&(StatutConnexion_L != WL_CONNECTED)&&(StatutConnexion_L != WL_CONNECT_FAILED)) { delay(500); Afficheur_G.print("."); // Pour visualiser la tentative de connexion et faire patienter StatutConnexion_L = WiFi.status(); // Lecture de l'état de la connexion et mémorisation dans la variable "StatutConnexion_L" } Afficheur_G.clear(); // On efface l'écran avant l'affichage de l'heure } // Fonction principale du programme, s'exécute en boucle: void loop() { // Variables de la fonction unsigned long TempsUnix_L; char Buffer_L[50]; if(WiFi.status()==WL_CONNECTED) { // Internet est disponible Afficheur_G.setCursor(0,0); Afficheur_G.print("Temps Unix: "); TempsUnix_L = ClientNtp_G.getUnixTime(); sprintf(Buffer_L, " %d s", TempsUnix_L); Afficheur_G.setCursor(0,1); Afficheur_G.print(Buffer_L); } else { // Pas de connexion internet Afficheur_G.setCursor(0,0); Afficheur_G.print("Erreur de "); Afficheur_G.setCursor(0,1); Afficheur_G.print(" Connexion"); } delay(300); }
Si vous compilez ce programme puis le transférez dans l’ESP8285, voici ce que vous obtenez:
Maintenant, il ne nous reste plus qu’à convertir cet « Unix Time » en une date et une heure compréhensibles par nous, pauvre humains. Pour cela, rendez-vous page 3.
bonjour ,
à partir de ce programme il serais possible de mettre à jour une rtc du type DS3231 pour la remettre a l’heure .
d’avance merci .
Bonjour Hohm,
Oui tout à fait. Il est possible d’utiliser ce programme pour mettre à jour l’heure d’un RTC (DS3231, DS1307 ou autre). Cela a un intérêt pour un projet nécessitant une horloge précise avec une couverture Wi-Fi intermittente.