Afficher la date et l'heure exacte en français par internet

Portrait de Louis.D

Désolé je n'avais pas copier ici le bon code la traduction des jours n'était pas terminée !

Voilà un petit programme qui vous pernettra de récuperer la date et le jour en temps réel et de l'afficher sur la console série ou tout autre affichage.

On peut ainsi s'affranchir d'un module RTC qui monopolise des entrées et nécessite une mise à l'heure périodique ! Attention c'est l'heure GMT !

Matériel nécessaire un ESP32, n'importe quel modèle ou un ESP8266 , n'importe quel modèle aussi !

Le programme utilise le serveur "" mais le retour est en anglais, donc le codel comporte un système de traduction qui d'ailleurs peut être remplacer par n'importe quelle langue il suffit de remplacer mois et les jours dans la langue voulue.

Le code s'adapte automatiquement à l'ESP32 ou ESP8266.

Comme le code est assez simple je pense pas avoir besoin de plus d'explication

Il est nécessaire de créer une fichier MaWifi.h dans les même répertoire que ce code, voir les instruction dans le code lui même :

#if(ESP32)
#include <WiFi.h>
  #else
#include <ESP8266WiFi.h>
  #endif
#include "MaWifi.h"
#include "time.h"
/* Créer un fichier MaWifi.h dans le même répertoire que ce code avec :
   char* ssid     = ".....";
   char* password = ".....";
   ceci pour ne pas divulguer ces informations
*/

unsigned long Delai = millis();
const char* ntpServer = "fr.pool.ntp.org";
const long  gmtOffset_sec = 0;
const int   daylightOffset_sec = 3600;

void setup() {
  Serial.begin(115200);
  delay(10);
  // Connexion à la  WiFi

  WiFi.begin(ssid, password);
  Serial.println("Connexion ");
  while (WiFi.status() != WL_CONNECTED) {
    delay(300);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connectée");

  // Initialisation du transfert de la date
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  HeureLocale();
}

void loop() {
  if (millis() > Delai) {
    Delai = millis() + 1000;
    HeureLocale();
  }
}

void HeureLocale() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("Impossible de télécharger les informations");
    return;
  }

  //Récupérartion de la date et heure en Anglais
  char Date[70];
  strftime(Date, 70, "Nous sommes le %A %d %B %Y et il est %H:%M:%S", &timeinfo);

  //Traduction en Français
  String maDate = String(Date);
  maDate.replace("January", "Janvier");
  maDate.replace("February", "Février");
  maDate.replace("March", "Mars");
  maDate.replace("April", "Avril");
  maDate.replace("May", "Mai");
  maDate.replace("June", "Juin");
  maDate.replace("July", "Juillet");
  maDate.replace("August", "Aout");
  maDate.replace("September", "Septembre");
  maDate.replace("October", "Octobre");
  maDate.replace("November", "Novembre");
  maDate.replace("December", "Décembre");

  maDate.replace("Monday", "Lundi");
  maDate.replace("Tuesday", "Mardi");
  maDate.replace("Wednesday", "Mercredi");
  maDate.replace("Thursday", "Jeudi");
  maDate.replace("Friday", "Vendredi");
  maDate.replace("Saturday", "Samedi");
  maDate.replace("Sunday", "Dimanche");

  // Affichage sur la console série à 115200 bauds
  Serial.println(maDate );
  Serial.println();
}

Portrait de Louis.D

Grâce à l'intervention de Walter que je remercie voici le code qui règle complètement le problème de l'affichage non plus en GMT mais en heure française.

Il suffit de paramètrer le retour du serveur par la ligne :

configTzTime("CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00", ntpServer); ce qui est fait dans le code qui suit.

Pour connaître les paramètres de configtzTime() en fonction des fuseaux horaire, vous pouvez consulter ce site :

Je n'ai pour le moment trouvé aucune explication sur ces paramètres mais si je trouve je ne manquerais pas de les renseigner ici.

Encore merci à Walter !

/* Créer un fichier MaWifi.h dans le même répertoire que ce code avec :
   char* ssid     = ".....";
   char* password = ".....";
   ceci pour ne pas divulguer ces informations
*/

#include <WiFi.h>

#if(ESP32)
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
#include "MaWifi.h"
unsigned long Delai = millis();
const char* ntpServer = "fr.pool.ntp.org";

const long  gmtOffset_sec = 0;
const int   daylightOffset_sec = 3600;
String maDate;
void setup() {
  Serial.begin(115200);
  delay(10);
  // Connexion à la  WiFi

  WiFi.begin(ssid, password);
  Serial.println("Connexion ");
  while (WiFi.status() != WL_CONNECTED) {
    delay(300);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connectée");

  // Initialisation du transfert de la date
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  configTzTime("CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00", ntpServer);
  HeureLocale();
}

void loop() {
  if (millis() > Delai) {
    Delai = millis() + 1000;
    HeureLocale();
  }
}

void HeureLocale() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("Impossible de télécharger les informations");
    return;
  }

  //Récupérartion de la date et heure en Anglais
  char Date[70];
  strftime(Date, 70, "Nous sommes le %A %d %B %Y et il est %H:%M:%S", &timeinfo);

  //Traduction en Français
  maDate = String(Date);

  //HeureFr();

  maDate.replace("January", "Janvier");
  maDate.replace("February", "Février");
  maDate.replace("March", "Mars");
  maDate.replace("April", "Avril");
  maDate.replace("May", "Mai");
  maDate.replace("June", "Juin");
  maDate.replace("July", "Juillet");
  maDate.replace("August", "Aout");
  maDate.replace("September", "Septembre");
  maDate.replace("October", "Octobre");
  maDate.replace("November", "Novembre");
  maDate.replace("December", "Décembre");

  maDate.replace("Monday", "Lundi");
  maDate.replace("Tuesday", "Mardi");
  maDate.replace("Wednesday", "Mercredi");
  maDate.replace("Thursday", "Jeudi");
  maDate.replace("Friday", "Vendredi");
  maDate.replace("Saturday", "Samedi");
  maDate.replace("Sunday", "Dimanche");
  // Affichage sur la console série à 115200 bauds
  Serial.println(maDate );
 
}

Portrait de Walter

Pour l'heure local, tu peux te simplifier la vie en fixant ton fuseau horaire:
configTzTime("CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00", ntpServer);

De mémoire cela gère du même coup l'heure d'été et d'hiver.

De même pourquoi tu n’utilise pas directement la struct tm

char Annee[10];
  strftime(Annee, 10, "%Y", &timeinfo);
  //Serial.print(" ");
  FrAnnee = String(Annee).toInt();
  Serial.print(" ");

L'année peut être directement obtenue par 1900+timeinfo.tm_year 

 // Calcul du Numéro du jour
  char nJour[2];
  strftime(nJour, 10, "%d", &timeinfo);
  NJ = String(nJour).toInt();
  Serial.print(NJ);

le numéro du jour dans le moi par  timeinfo.tm_mday
Ci-dessous la définition que j'ai dans time.h

struct tm
{
  int tm_sec;
  int tm_min;
  int tm_hour;
  int tm_mday;
  int tm_mon;
  int tm_year;
  int tm_wday;
  int tm_yday;
  int tm_isdst;
#ifdef __TM_GMTOFF
  long  __TM_GMTOFF;
#endif
#ifdef __TM_ZONE
  const char *__TM_ZONE;
  #endif
};

Je n'ai pas testé pour les mois en français, mais je pense que tu peux directement utiliser  FrMois[timeinfo.tm_mon]

Portrait de Louis.D

Merci Walter si je n'ai pas utilisé ces informations c'est tout simplement que je ne les connaissais pas !

J'ai modifié mon code grâce à ton aide !

Pour ce qui est d'associer :

String FrMois[12] = {"Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Décembre"};

à l'affichage de :

Serial.println (FrMois[timeinfo.tm_mon]);

Tous comme :

String FrJour[8] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"};

avec

Serial.println (FrJour[timeinfo.tm_wday]);

Cela fonctionne mais c'est plus lourd que le code que j'utilise, il faut décomposer tous les élements de la structure et afficher les valeurs une à une, mais c'est réalisable effectivement !

Par contre l'utilisation de la structure de tm peut être intéressante si on a une mauvaise réception WIFI qui ne fonctionne que par intermittence pour mettre à jour périodiquement run module RTC du genre "DS1307" ou équivalent !

J'ai quand même utiliser ton idée avec ce code :

/* Créer un fichier MaWifi.h dans le même répertoire que ce code avec :
   char* ssid     = ".....";
   char* password = ".....";
   ceci pour ne pas divulguer ces informations
*/
#include <WiFi.h>
#if(ESP32)
#include <WiFi.h>
#else
#include <ESP8266WiFi.h>
#endif
#include "MaWifi.h"
unsigned long Delai = millis();
const char* ntpServer = "fr.pool.ntp.org";

const long  gmtOffset_sec = 0;
const int   daylightOffset_sec = 3600;
String FrJour[8] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi", "Dimanche"};
String FrMois[12] = {"Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aout", "Septembre", "Octobre", "Novembre", "Décembre"};
String maDate;
void setup() {
  Serial.begin(115200);
  delay(10);
 
  // Connexion à la  WiFi
  WiFi.begin(ssid, password);
  Serial.println("Connexion ");
  while (WiFi.status() != WL_CONNECTED) {
    delay(300);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connectée");

  // Initialisation du transfert de la date
  configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
  configTzTime("CET-1CEST-2,M3.5.0/02:00:00,M10.5.0/03:00:00", ntpServer);
  HeureLocale();
}

void loop() {
  if (millis() > Delai) {
    Delai = millis() + 1000;
    HeureLocale();
  }
}

void HeureLocale() {
  struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("Impossible de télécharger les informations");
    return;
  }
  char Heure[24];
  strftime(Heure, 24, "%Y et il est %H:%M:%S", &timeinfo);
  Serial.print("Nous sommes le ");
  Serial.println(String(FrJour[timeinfo.tm_wday]) + " " +(timeinfo.tm_mday) + " " + FrMois[timeinfo.tm_mon] + " " + Heure);
}

Portrait de Walter

Oui, pour le nom du mois, c'était pour éviter de faire un replace.
normalement il faudrait utilser setlocale(LC_ALL, "fr_FR"); mais je ne suis pas sûre que cela fonctionne sur un ESP32.

Si tu as des risques que internet ne soit pa présent assez longtemps ou que tu veux désactiver le wIFI pour consommer moins, mieux vaut prendre un DS3231.

Pour le TZ, il y a ça dans les sources du ESP32, ça explique vite fait le format.

Content que ca puisse t'aider :)

Portrait de Louis.D

Re Merci Walter mais ma part, ma Freebox Delta S recoit 8.5 Gb / seconde, j'ai une mais assez grande avec 4 repeteurs WIFI 6 donc pas besoin de DS3231 ou autre. Et pour le moment pas de déconnexion de plus de quelques secondes.

Pour les applications que j'ai, entre autre l'arrosage automatique 12 points ( dont trois futurs pour les légumes ) alimentés depuis un puits par une pompe 2 KW. Donc même si l'arrosage ne se fait pas un jour ou deux ce n'est pas la fin de la pelouse lol.

Mais toute information est bonne à prendre !

Portrait de Walter

Oui, je comprends, c'était plus dans l'idée, si quelqu'un voulait réutiliser ton code.

Portrait de Louis.D

Tu as tout compris ! Quand je poste un tuto ici c'est uniquement pour le partage puisque je sais le faire... Mais cela permet d'avoir une autre façon de faire comme ici !

De plus cela peut donner des idées à quelqu'un d'autre pour un tout autre projet le fait de voir comment on peut utiliser certaines fonctions Arduino !