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

Louis.D
mar, 01/31/2023 - 11:36
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 WiFiWiFi.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();
}
Louis.D
jeu, 02/02/2023 - 08:34
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 !
Walter
jeu, 02/02/2023 - 00:56
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
L'année peut être directement obtenue par 1900+timeinfo.tm_year
le numéro du jour dans le moi par timeinfo.tm_mday
Ci-dessous la définition que j'ai dans time.h
Je n'ai pas testé pour les mois en français, mais je pense que tu peux directement utiliser FrMois[timeinfo.tm_mon]
Louis.D
ven, 02/17/2023 - 14:32
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 :
Walter
jeu, 02/02/2023 - 11:21
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 :)
Louis.D
jeu, 02/02/2023 - 12:45
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 !
Walter
jeu, 02/02/2023 - 14:22
Oui, je comprends, c'était plus dans l'idée, si quelqu'un voulait réutiliser ton code.
Louis.D
jeu, 02/02/2023 - 17:36
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 !