ESP32 NTP Time – Configuration des fuseaux horaires et de l’heure d’été

ESP32 NTP Time - Configuration des fuseaux horaires et de l'heure d'été

Dans ce tutoriel, vous apprendrez comment obtenir correctement l’heure avec l’ESP32 pour votre fuseau horaire et prendre en compte l’heure d’été (si c’est le cas). L’ESP32 demandera l’heure à un serveur NTP et l’heure sera automatiquement ajustée pour votre fuseau horaire avec ou sans heure d’été.

Fuseaux horaires ESP32 et heure d'été

Réponse rapide: appeler setenv(« TZ », fuseau horaire, 1), où fuseau horaire est l’un des fuseaux horaires répertoriés ici. Ensuite, appelez tzet() pour mettre à jour ce fuseau horaire.


Si vous commencez, nous vous recommandons de jeter d’abord un coup d’œil au didacticiel suivant pour savoir comment obtenir la date et l’heure d’un serveur NTP :

Dans ce tutoriel précédent, nous avons montré une option pour configurer votre fuseau horaire. Cependant, cet exemple ne prend pas en compte l’heure d’été. Continuez à lire ce didacticiel pour apprendre à configurer correctement le fuseau horaire et l’heure d’été.

Merci à l’un de nos lecteurs (Hardy Maxa) qui a partagé cette information avec nous.

Réglage du fuseau horaire de l’ESP32 avec l’heure d’été

Selon Documentation:

« Pour définir le fuseau horaire local, utilisez setenv et tzset fonctions POSIX. Premier appel setenv mettre en place TZ variable d’environnement à la valeur correcte en fonction de l’emplacement de l’appareil. Le format de la chaîne d’heure est décrit dans documentation de la libc. Ensuite, appelez tzset pour mettre à jour les données d’exécution de la bibliothèque C pour le nouveau fuseau horaire. Une fois ces étapes terminées, la fonction d’heure locale renverra l’heure locale correcte, en tenant compte du décalage horaire et de l’heure d’été.

Vous pouvez vérifier un liste des variables de chaîne de fuseau horaire ici.

Par exemple, j’habite à Porto. Le fuseau horaire est Europe/Lisbonne. Dans la liste des variables de chaîne de fuseau horaire, je vois que la variable de chaîne de fuseau horaire pour mon emplacement est WET0WEST,M3.5.0/1,M10.5.0, donc après la connexion au serveur NTP, pour obtenir l’heure de mon emplacement, je dois appeler :

setenv("TZ","WET0WEST,M3.5.0/1,M10.5.0",1);

Suivie par:

tzet();

Regardons un croquis de démonstration pour comprendre comment cela fonctionne et comment l’utiliser dans votre projet ESP32.

Esquisse d’exemple de fuseau horaire et d’heure d’été ESP32

L’exemple suivant a été fourni par l’un de nos followers (Hardy Maxa), nous venons d’apporter quelques modifications.

Copiez le code suivant dans votre IDE Arduino.

// RTC demo for ESP32, that includes TZ and DST adjustments
// Get the POSIX style TZ format string from  https://github.com/nayarsystems/posix_tz_db/blob/master/zones.csv
// Created by Hardy Maxa
// Complete project details at: https://Raspberryme.com/esp32-ntp-timezones-daylight-saving/

#include <WiFi.h>
#include "time.h"

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

void setTimezone(String timezone){
  Serial.printf("  Setting Timezone to %sn",timezone.c_str());
  setenv("TZ",timezone.c_str(),1);  //  Now adjust the TZ.  Clock settings are adjusted to show the new local time
  tzset();
}

void initTime(String timezone){
  struct tm timeinfo;

  Serial.println("Setting up time");
  configTime(0, 0, "pool.ntp.org");    // First connect to NTP server, with 0 TZ offset
  if(!getLocalTime(&timeinfo)){
    Serial.println("  Failed to obtain time");
    return;
  }
  Serial.println("  Got the time from NTP");
  // Now we can set the real timezone
  setTimezone(timezone);
}

void printLocalTime(){
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time 1");
    return;
  }
  Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S zone %Z %z ");
}

void  startWifi(){
  WiFi.begin(ssid, wifipw);
  Serial.println("Connecting Wifi");
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }
  Serial.print("Wifi RSSI=");
  Serial.println(WiFi.RSSI());
}

void setTime(int yr, int month, int mday, int hr, int minute, int sec, int isDst){
  struct tm tm;

  tm.tm_year = yr - 1900;   // Set date
  tm.tm_mon = month-1;
  tm.tm_mday = mday;
  tm.tm_hour = hr;      // Set time
  tm.tm_min = minute;
  tm.tm_sec = sec;
  tm.tm_isdst = isDst;  // 1 or 0
  time_t t = mktime(&tm);
  Serial.printf("Setting time: %s", asctime(&tm));
  struct timeval now = { .tv_sec = t };
  settimeofday(&now, NULL);
}

void setup(){
  Serial.begin(115200);
  Serial.setDebugOutput(true);
  startWifi();

  initTime("WET0WEST,M3.5.0/1,M10.5.0");   // Set for Melbourne/AU
  printLocalTime();
}

void loop() {
  int i;
  
  // put your main code here, to run repeatedly:
  Serial.println("Lets show the time for a bit.  Starting with TZ set for Melbourne/Australia");
  for(i=0; i<10; i++){
    delay(1000);
    printLocalTime();
  }
  Serial.println();
  Serial.println("Now - change timezones to Berlin");
  setTimezone("CET-1CEST,M3.5.0,M10.5.0/3");
  for(i=0; i<10; i++){
    delay(1000);
    printLocalTime();
  }

  Serial.println();
  Serial.println("Now - Lets change back to Lisbon and watch Daylight savings take effect");
  setTimezone("WET0WEST,M3.5.0/1,M10.5.0");
  printLocalTime();

  Serial.println();
  Serial.println("Now change the time.  1 min before DST takes effect. (1st Sunday of Oct)");
  Serial.println("AEST = Australian Eastern Standard Time. = UTC+10");
  Serial.println("AEDT = Australian Eastern Daylight Time. = UTC+11");
  setTime(2021,10,31,0,59,50,0);    // Set it to 1 minute before daylight savings comes in.
  
  for(i=0; i<20; i++){
    delay(1000);
    printLocalTime();
  }

  Serial.println("Now change the time.  1 min before DST should finish. (1st Sunday of April)");
  setTime(2021,3,28,1,59,50,1);    // Set it to 1 minute before daylight savings comes in.  Note. isDst=1 to indicate that the time we set is in DST.
  
  for(i=0; i<20; i++){
    delay(1000);
    printLocalTime();
  }

  // Now lets watch the time and see how long it takes for NTP to fix the clock
  Serial.println("Waiting for NTP update (expect in about 1 hour)");
  while(1) {
    delay(1000);
    printLocalTime();
  }
}

Afficher le code brut

Comment fonctionne le code

Tout d’abord, vous devez inclure le Wifi bibliothèque pour connecter l’ESP32 à internet (serveur NTP) et le temps bibliothèque pour gérer le temps.

#include <WiFi.h>
#include "time.h"

Pour définir le fuseau horaire, nous avons créé une fonction appelée setTimezone() qui accepte comme argument un chaîne de fuseau horaire.

void setTimezone(String timezone){

A l’intérieur de cette fonction, nous appelons le setenv() fonction pour le TZ (timezone) pour définir le fuseau horaire avec le fuseau horaire que vous passez en argument au setTimezone() une fonction.

setenv("TZ",timezone.c_str(),1);  //  Now adjust the TZ.  Clock settings are adjusted to show the new local time

Après cela, appelez le tzset() fonction pour que les modifications prennent effet.

tzset();

Nous n’entrerons pas dans le détail des autres fonctions déclarées dans le code car celles-ci ont déjà été expliquées dans un précédent tutoriel :

mettre en place()

Dans le mettre en place(), nous initialisons le Wi-Fi pour que l’ESP32 puisse se connecter à Internet pour se connecter au serveur NTP.

initWifi();

Ensuite, appelez le initTime() fonction et passer en argument le chaîne de fuseau horaire. Dans notre cas, pour le fuseau horaire Lisbonne/PT.

initTime("WET0WEST,M3.5.0/1,M10.5.0");   // Set for Lisbon/PT

Après cela, imprimez l’heure locale actuelle.

printLocalTime();

boucler()

Dans le boucler() afficher l’heure locale pendant dix secondes.

Serial.println("Lets show the time for a bit.  Starting with TZ set for Lisbon/Portugal");
for(i=0; i<10; i++){
  delay(1000);
  printLocalTime();
}

Si à tout moment dans votre code vous devez changer le fuseau horaire, vous pouvez le faire en appelant le setTimezone() fonction et en passant en argument la chaîne de fuseau horaire. Par exemple, les lignes suivantes modifient le fuseau horaire en Berlin et affichent l’heure pendant dix secondes.

Serial.println();
Serial.println("Now - change timezones to Berlin");
setTimezone("CET-1CEST,M3.5.0,M10.5.0/3");
for(i=0; i<10; i++){
  delay(1000);
  printLocalTime();
}

Ensuite, nous retournons à notre heure locale en appelant le setTimezone() fonctionner à nouveau avec la variable de chaîne de fuseau horaire Lisbon/PT.

Serial.println();
Serial.println("Now - Lets change back to Lisbon and watch Daylight savings take effect");
setTimezone("WET0WEST,M3.5.0/1,M10.5.0");
printLocalTime();

Pour vérifier si l’heure d’été est en vigueur, nous allons changer l’heure à 10 secondes avant que l’heure d’hiver ne prenne effet. Dans notre cas, c’est le dernier dimanche d’octobre (cela peut être différent pour votre emplacement).

Serial.println();
Serial.println("Now change the time.  1 min before DST takes effect. (Last Sunday of Oct)");
setTime(2021,10,31,0,59,50,0);    // Set it to 1 minute before daylight savings comes in.

Ensuite, affichez l’heure pendant un moment pour vérifier qu’il ajuste l’heure en tenant compte de l’heure d’été.

for(i=0; i<20; i++){
  delay(1000);
  printLocalTime();
}

Après cela, modifions à nouveau l’heure pour vérifier si elle passe à l’heure d’été le moment venu. Dans notre cas, c’est le dernier dimanche de mars.

Serial.println("Now change the time.  1 min before DST should finish. (Last Sunday of March)");
setTime(2021,3,28,1,59,50,1);    // Set it to 1 minute before daylight savings comes in.  Note. isDst=1 to indicate that the time we set is in DST.

Affichez l’heure pendant un moment pour vérifier qu’elle s’ajuste à l’heure d’été.

for(i=0; i<20; i++){
  delay(1000);
  printLocalTime();
}

Manifestation

Maintenant, testons le code. Après avoir inséré vos informations d’identification réseau, téléchargez le code sur votre ESP32.

Après cela, ouvrez le moniteur série à un débit en bauds de 115200 et appuyez sur le bouton ESP32 RST pour commencer à exécuter le code.

Tout d’abord, il affiche votre heure locale avec le fuseau horaire que vous avez défini sur le code.

ESP32 NTP Time Set Fuseau horaire

Après cela, il passera à l’autre fuseau horaire que vous avez défini sur le code. Dans notre cas, nous nous sommes installés à Berlin.

ESP32 NTP Changement d'heure entre les fuseaux horaires

Après cela, vous devriez voir le passage à l’heure d’hiver. Dans notre cas, quand il est 2 heures du matin, l’horloge recule d’une heure.

L'heure ESP32 NTP s'ajuste automatiquement à l'heure d'hiver

Nous vérifions également s’il s’ajuste à l’heure d’été le moment venu. Dans l’exemple ci-dessous, vous pouvez voir que l’horloge avance d’une heure pour régler l’heure d’été.

L'heure ESP32 NTP s'ajuste automatiquement à l'heure d'été

Conclusion

Ce didacticiel rapide vous a appris à définir le fuseau horaire avec l’heure d’été à l’aide de la setenv() et tzset() les fonctions.

Nous espérons que vous avez trouvé ce tutoriel utile. Nous avons d’autres tutoriels liés au temps qui pourraient vous plaire :

En savoir plus sur l’ESP32 avec nos ressources :

Merci pour la lecture.