Bonjour !
J'ai créé un sketch pour afficher l'heure et les éphémérides sur un petit écran LCD.
Pour cela je me connecte au Wifi et à un serveur NTP durant le setup.
J'utilise pour ça la bibliothèque native "time.h" du ESP32, avec les possibilités de changement d'heure d'été et d'hiver automatiques associées, ainsi que la bibliothèque "esp_sntp.h" qui me permet de contrôler la synchronisation effective avec un serveur NTP.
Le code en relation avec tout ça (je ne mets que ce qui sert à la connexion) :
En début de sketch :
#include <WiFi.h> // Gestion de la connexion au WiFi
#include <esp_sntp.h> // Permet le contrôle de la synchro avec l'heure NTP
// ******** Valeurs pour l'horloge internet
const char* ntpServer = "pool.ntp.org"; // Serveur NTP
bool timeSync = false; // mis sur true quand synchro avec heure NTP OK (librairie "esp_sntp.h" nécessaire)
Dans le setup :
const char* ssid = "xxxxxx";
const char* mdp = "yyyyyy";
const int TimeOut_connexion = 50; // Time-out connexion Wifi après 50 essais
int timeOut_counter = 0; // Compteur de nombre d'essais de connexion au Wifi
tft.loadFont(Gadugi_Smooth_24);
tft.setTextDatum(TC_DATUM);
tft.drawString("Connexion au réseau ",160,55);
lgChain = ((tft.drawString(ssid,160,100)/2)+160); // Affichage du SSID et calcul de la position de la fin de la chaîne
tft.setTextDatum(TL_DATUM);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, mdp);
while (WiFi.status() != WL_CONNECTED) // Boucle de vérification si la connexion est OK
{
delay(250);
lgChain += tft.drawString(" .",lgChain,100); // Affiche un point de plus après chaque itération à la suite du SSID
++timeOut_counter; // redémarrage de l'ESP si pas de connexion pendant 10 sec
if (timeOut_counter > 40) ESP.restart(); // 40 x 250 ms = 10 s
}
delay(1000);
tft.fillScreen(TFT_BLACK);
tft.setTextColor(TFT_YELLOW, TFT_BLACK);
tft.setTextDatum(TC_DATUM);
tft.drawString("Connecté au réseau WiFi !",160,20);
tft.drawString("Adresse IP: "+(WiFi.localIP().toString()),160,50);
delay(1500);
// Prise en compte du décalage horaire et des dates de début et de fin d'heure d'été par rapport au temps UTC
// Fonction propre à la librairie "time.h" (CET = Central european time, CEST = Central European Summer Time)
configTzTime("CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00", ntpServer);
// renvoie vers la fonction "void time_sync_notification()" quand la synchro de l'heure avec un serveur NTP est OK
// Nécessite la librairie "esp_sntp.h"
sntp_set_time_sync_notification_cb(time_sync_notification);
// Vérification de la synchronisation effective de l'heure au démarrage
timeOut_counter = 0;
tft.setTextColor(TFT_GREEN, TFT_BLACK);
tft.drawString("Synchronisation de l'heure",160,100); // Affiche un message avec la police définie pour la connexion WiFi
lgChain = ((tft.drawString("en cours",160,130)/2)+160); // Affichage message et calcul de la position de fin de la chaîne
tft.setTextDatum(TL_DATUM);
while (timeSync == false) // mis à "true" par la fonction time_sync_notification()
{
delay(250);
lgChain += tft.drawString(" .",lgChain,130); // Affiche un point de plus après chaque itération à la suite de "en cours"
++timeOut_counter; // redémarrage de l'ESP si pas de connexion pendant 10 sec
if (timeOut_counter > 40) ESP.restart(); // 40 x 250 ms = 10 s
}
tft.unloadFont();
Tout ça fonctionne sans le moindre problème (quel plaisir le passage automatique de l'heure d'été à l'heure d'hiver !), mais je me pose une question :
Mon sketch n'a besoin du WiFi que pour la synchro au serveur de temps.
Je crois que celle-ci se fait ensuite par défaut une fois par heure.
Alors je me pose la question suivante :
Si à la fin de ma connexion je mets un WiFi.disconnect(); (pour l'instant je reste connecté au WiFi tout le temps) que va-t-il se passer quand l'ESP32 voudra refaire une synchro avec le serveur de temps ?
Est-il assez "intelligent" pour se reconnecter au Wifi tout seul pour l'occasion et se déconnecter ensuite ?
Ou vu autrement si je me connecte au Wifi tous les xxx minutes ou heures, la synchro avec le serveur de temps se fera-t-elle automatiquement ?
Si quelqu'un avait une réponse à ces questions, grand merci !
Roland