Date erronée récupérée sur un serveur NTP avec un arduino Uno et un shield W5500 ou W5100

Bonjour

C’est mon 1er post…

Je voudrais récupérer la date sur un serveur NTP avec un arduino Uno et un shield W5500 ou W5100.

Pour ça j’ai copié un programme qui fonctionne sur ESP8266 en remplaçant la bibliothèque Wifi par la bibliothèque Ethernet.

A première vue, tout fonctionne sauf que je me retrouve en 2054. Pour le reste, tout est bon, j’ai le bon jour et le bon mois.

Si je coupe la connexion, la date affichée est le 1/1/2000, alors que je devrais avoir le 1/1/1970, là encore j’ai 30 ans de décalage.

#include <SPI.h>
#include <Ethernet.h>
#include <NTPClient.h>
#include <EthernetUdp.h>
#include <time.h>

//Week Days
String weekDays[7]={"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};

//Month names
String months[12]={"janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"};

// L'adresse MAC du shield
byte mac[] = { 0x90, 0xA2, 0xDA, 0x0E, 0xA5, 0x55 };
// L'adresse IP que prendra le shield
IPAddress ip(192,168,1,115);

// connection au serveur NTP
EthernetUDP ntpUDP;
NTPClient timeClient(ntpUDP, "europe.pool.ntp.org", 3600, 600000); // ntpUDP : protocole 
 
void setup() {
  // configuration de la liaison Serie
  Serial.begin(9600);
  Serial.println(" ");

  // On démarre le shield Ethernet avec IP fixe
  Ethernet.begin(mac, ip); // IP fixe locale
  delay(1000); // donne le temps à la carte Ethernet de s'initialiser
  
  // Démarrage du client NTP - Start NTP client
  timeClient.begin();
  delay(1000);
}

void loop() {
  timeClient.update();
  
  Serial.print("Format Time: ");
  Serial.println(timeClient.getFormattedTime());  

  Serial.print("Jour avec timeClient.getDay(): ");
  Serial.println(weekDays[timeClient.getDay()]);  // ici le jour est bon

  
  time_t epochTime = timeClient.getEpochTime(); // fonction epochTime de type time_t
  Serial.print("Epoch Time: ");
  Serial.println(epochTime);

  // La structure temporelle contient les éléments suivants : https://cplusplus.com/reference/ctime/tm/
  struct tm *ptm = gmtime ((time_t *)&epochTime); // Structure temporelle de date et heure

  Serial.print("Date avec La structure tm: ");
  Serial.println((weekDays[ptm->tm_wday]) + "-" + String(ptm->tm_mday) + "-" + (months[ptm->tm_mon]) + "-" + String(ptm->tm_year +1900));
  Serial.println("");

  delay(2000);
}

J’ai comparé l’ EpochTime entre l’ESP et le Uno, il est identique à l’instant T.

J’ai récupéré je jour de la semaine avec timeClient.getDay(). Le jour de la semaine est bon.

Puis avec la structure tm qui dépend de l’ EpochTime, Le jour de la semaine correspond à l’année 2054.

Pouvez-vous m’aider, SVP ? Merci d’avance.
Cordialement,

Je n'ai pas lu les détails du code (suis sur mon iPhone) mais si vous voyez 30 ans pile d'écart ça peut être dû à une bibliothèque où une fonction que vous utilisez qui n'a pas la bonne référence pour l'EPOCH

L'Epoch Unix commence le 1er janvier 1970 à 00:00:00 UTC mais certaines bibliothèques peuvent commencer au 1er janvier 2000 - ce qui fait vos 30 ans

par exemple la classe DateTime de la RTCLib utilise un delta par rapport à 1970

➜ Essayez de vérifier si la bibliothèque NTPClient que vous utilisez ne fait pas déjà la conversion correcte de l'année

Bonjour
Et merci d’avoir pris du temps pour moi.
La bibliothèque NTPClient que j’utilise retourne bien les secondes depuis le 1/1/1970

* @return time in seconds since Jan. 1, 1970
     */
    unsigned long getEpochTime() const;

J’ai le même programme sur un ESP8266 avec la même bibliothèque NTPClient.h.
Les seules différences dans le programme sont les bibliothèques liées à l’ESP8266
ESP826Wifi.h remplacé par Ethernet.h
Et WifiUdp.h remplacé par EthernetUdp.h
Et dans la structure temporelle, il y a le Tm_year qui enregistre le nombre d’années après 1900

Sur l’ESP Tm_year = 124 (124 années depuis 1900) => 2024
Sur le Uno Tm_year = 154 (154 années depuis 1900) => 2054

Ça ne doit pas être exactement la même
Vous avez le lien sur celle que vous utilisez sur UNO?

Par Fabrice Weinber, j’utilise la version 3.2.1(la dernière)

J’ai essayé sur PlatformIO déclaration dans platformio.ini :

arduino-libraries/NTPClient @ ^3.2.1 ; bibliothèque par Fabrice Weinber

Et sur IDE Arduino, où j’ai téléchargé la même version.

Sur un uno les int ont 16 bits, il se pourrait que la bibliothèque ait des erreurs de types

Je ne sais pas. Ça dépasse mes compétences en Arduino.

Mais pour moi un int c’est 16 bits que ce soit UNO ou ESP, et là j’utilise time_t que j’ai essayé de remplacer par un long pour le même résultat.

Mais c’est la structure tm qui ne renvoie pas la bonne valeur, or la structure tm dépend de la bibliothèque time.h qui elle est une bibliothèque standard, je la déclare mais je ne l’installe pas. Du coup je ne sais pas comment trouver sa version, mais j’utilise le même logiciel donc en principe la même bibliothèque que je sois avec l’ESP ou le Uno.

Non le type int c’est 16 but sur uno et 32 bits sur esp

Le souci n’est pas dans time_t mais peut être dans la bibliothèque - je suis sur mon smart phone en ce moment donc pas simple de E plonger dans le code

Regardez sur GitHub les bugs ouverts, il y a un peut être une mention de ce que vous voyez

J'ai trouvé un post sur GitHub,

Malheureusement il n y a pas de réponse. C'est pourtant exactement le même problème.

Dans NTPClient version 3.1.0
GitHub - taranais/NTPClient: Connect to a NTP server
il y a un getFormattedDate qui fonctionne. Je ne sais pas pourquoi il a été supprimé

ça vaut peut être la peine de faire votre propre bibliothèque :wink:

C'est en cours :slightly_smiling_face:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.