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 besoin sont:
- “EasyNTPClient” qui, comme son 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èque Arduino “EasyNTPClient” by Harsha Alva. Pour plus d’informations sur la procédure d’installation d’une bibliothèque, 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ée 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 #if defined(ESP8266) #include <ESP8266WiFi.h> #elif defined(ESP32) #include <WiFi.h> #endif #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 #if defined(ESP8266) Afficheur_G.init(4,5); // Initialisation de l'afficheur, SDA=4, SCL=5 #elif defined(ESP32) Afficheur_G.init(32,33); // Initialisation de l'afficheur, SDA=32, SCL=33 #endif 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, " %lu 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); }
Test de la récupération du temps Unix avec l’ESP8285
Si vous compilez ce programme puis le transférez dans l’ESP8285, voici ce que vous obtenez:
Test de la récupération du temps Unix avec l’ESP32
Maintenant, il ne nous reste plus qu’à convertir cet “Unix Time” en une date et une heure compréhensibles par nous, pauvres 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.
Bonjour est-ce compatible avec une carte ESP8266 ?
merci d’avance
Bonjour Harlock73,
Oui ce programme est compatible avec une carte ESP8266. La différence entre les deux cartes est la mémoire de stockage qui est plus faible sur l’ESP8266. Je n’ai pas de carte sous la main pour tester mais il devrait y avoir assez de place dans l’ESP8266.
Je vous laisse me confirmer 😉
Bonjour et merci pour ce tuto. Peut on adapter ce projet avec un ESP32 à la place d’un ESP8285 SVP.
Par avance merci de votre réponse.
Lalouhu096.
Bonjour Lalou,
l’ESP32 étant également équipé d’une interface Wi-Fi, ce projet ESP8285 peut facilement être adapté à cet autre microcontrôleur du même fabricant.
Bonjour et un grand merci pour ce tuto clair et précis, notamment sur la gestion du passage en heure été/hiver. Tout fonctionne correctement sur la carte ESP-01 qui contient une puce ESP8266. Bravo à vous, beau travail.
merci bien pour ce tuto
Bonjour, je sais que ce tuto date de quelques années déjà. Je désire m’initier au monde Arduino et ce projet est justement ce qu’il me faut. D’abord très bien expliqué en partant de zéro, et en y allant pas à pas. En fait j’ai besoin d’une horloge qui ne dérive pas dans le temps (donc du type WiFi via NTP, ou DCF77), capable de générer une impulsion d’1 min à chaque heure pleine. Donc ma question est (avant de me lancer dans l’achat de tous les composants): est-il possible de sortir une commande du ESP8285 (il me semble qu’il y a des GPIO)? Par exemple lorsque la valeur “minute” = 00. Pour la modification du programme, je pense que je pourrai me débrouiller lorsque je serai un peu familiarisé. D’avance merci et encore bravo pour ce tuto!
Merci Jacques,
pour ce retour.
Oui il reste des broches de disponibles sur la carte ESP8285.
Je compléterai la description du produit en y précisant l’affectation des broches (pinout) à mon retour de vacance dans 1 semaine afin de vous aider dans les développements.
Il est également à noter que les achats sur la boutique seront réouvert à ce moment.
J’espère que cela repond à votre question.
Bonjour Nikko, un tout grand merci pour avoir pris le temps de me répondre.
Oui je patiente jusqu’à la réouverture de la boutique. Et j’ai déjà réponse à ma question, mais j’en aurai surement d’autres d’ici là 😉 .
Bonne fin de vacances et encore merci.
Bonjour Jacques,
la fiche produit de l’ESP8285 a été complétée avec le brochage détaillé (Pinout).
Bonjour,
Je souhaite réaliser ce projet avec un autre module wifi : l’ESP-32. Cela est possible puisqu’il est aussi compatible avec le wifi.
Ma question serait de savoir si le programme final que vous avez fourni peut s’adapter à l’ESP-32 ? Et est-ce que vous avez fait un tuto pour ce module ?
Merci d’avance, je vous souhaite une agréable journée.
Cordialement,
L.E.
Bonjour Elchardus,
Oui le programme est facilement adaptable à l’ESP32.
Je vais mettre à jour ce tuto dans les prochains jours pour couvrir les microcontrôleurs EPS8285 et ESP32.
Super !
Merci beaucoup !
Le tutoriel d’horloge connectée a été mis à jour pour être utilisable sur plateforme ESP32.
Incroyable, je vous remercie !!