IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Arduino Discussion :

Fonction dayOfTheWeek() de RTClib donne une erreur de jour.


Sujet :

Arduino

  1. #1
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut Fonction dayOfTheWeek() de RTClib donne une erreur de jour.
    Bonjour à tous,
    Lorsque je récupère le numéro du jour par la fonction dayOfTheWeek() de la librairie RTClib, j'ai erreur d'interprétation de 3 alors que si je lis une date sur Internet c'est bon.
    Voici le code qui donne une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    DateTime dtActuel = rtc.now();  //récupère date et heure courante
      if(dtActuel.year() < 2021){   //si le RTC n'a jamais été chargé
        connexionWiFi();
        if(ok) misaJour();    //si ok chargement de toutes les données (heure, environnement,..)
      }
      else chargeDt(dtActuel);      //si le RTC est chargé, chargement de DateTime
      lectureCapteur();
      afficheCapteur();
      chargeParamTemperature();
      chargeParamHumidite();
      chargeParamReveil();
      touch_pad_init();
      if(reveilActif) touchAttachInterrupt(T2,actionTouche2,NIVEAU);
      if(switchActif) touchAttachInterrupt(T3,actionTouche3,NIVEAU);
     }                   
            //*******lancement du programme principal******>
    //*****************************Affiche la date et l'heure****************************************
    void chargeDt(DateTime dt){
      annee = dt.year();
      nMois = dt.month();  
      dJour = dt.day();           //date du jour
      hr = dt.hour();
      mn = dt.minute();
      sc = dt.second();
      nJour = dt.dayOfTheWeek();   //n° du jour 
      ok=true;
    }
    Et le code qui récupère la date sur Internet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    //******************************mise à jour des paramètres date, heure******************************
    void misaJour(){
      timeClient.begin();
      timeClient.update();                        //mise à jour de dateheure
      epoch = timeClient.getEpochTime();          //récupére dateheure UNIX
      nJour = timeClient.getDay();                //récupére le n° de jour
      //heure = timeClient.getFormattedTime();      //récupère l'heure formatée hh:mm:ss
      time_t timestamp = epoch;                   //variable timestamp de type time_t = dateheure UNIX
      struct tm *pTime = localtime(&timestamp);   //pTime pointe sur l'adresse de timestamp
      nMois = pTime->tm_mon;                      //(*pTime).tm_mon    N° du mois
      dJour = pTime->tm_mday;                     //jour du mois
      annee = pTime->tm_year+1900;                //année
      sc = pTime->tm_sec;                         //secondes
      mn = pTime->tm_min;                         //minutes
      hr = pTime->tm_hour;                        //heures
      //strftime(buffer,80, "%d/%m/%Y", pTime);   //Extrait la date formatée jj/mm/aaaa
      rtc.adjust(DateTime(annee,nMois,dJour,hr,mn,sc));
    }
    Je dois préciser que tout le reste est correct (date et heure).
    Si quelqu'un pouvait m'aider à trouver l'anomalie.
    Merci

  2. #2
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Bonjour mormic

    Citation Envoyé par mormic Voir le message
    Lorsque je récupère le numéro du jour par la fonction dayOfTheWeek() de la librairie RTClib, j'ai erreur d'interprétation de 3 alors que si je lis une date sur Internet c'est bon.
    Que voulez vous dire par "j'ai erreur d'interprétation de 3"?

    (pourquoi garder les nMois, annee, dJour, etc comme variables indépendantes globales, conservez directement une DateTime)

  3. #3
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    je veux dire qu'au lieu de trouver 0 (dimanche) par exemple je trouve 4 (jeudi) donc 4+3=7 c'est à dire 0 en base 7.
    Je développe DateTime car j'affiche sur un écran.

    Merci pour votre aide

  4. #4
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    si vous chargez code code (ajustez si vous n'avez pas une DS3231), que voyez vous dans la console série à 115200 bauds?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #include <RTClib.h>
    RTC_DS3231 rtc;
     
    void setup () {
      Serial.begin(115200);
     
      if (! rtc.begin()) {
        Serial.println("pas de RTC");
        while (true) yield();
      }
     
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
     
      DateTime now = rtc.now();
      Serial.print(now.year());            Serial.write('/');
      Serial.print(now.month());           Serial.write('/');
      Serial.print(now.day());             Serial.write('(');
      Serial.print(now.dayOfTheWeek());    Serial.write(')');
      Serial.println();
     
      Serial.print(now.hour());            Serial.write(':');
      Serial.print(now.minute());          Serial.write(':');
      Serial.println(now.second());
    }
     
    void loop () {}
    ----
    Je développe DateTime car j'affiche sur un écran
    vous pourriez simplement accéder aux éléments du DateTime dans vos affichages.

  5. #5
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour normic

    Ça ressemble typiquement à une erreur d'année ou de mois.

    Cordialement
    jpbbricole

  6. #6
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    J'utilise un DS1307. Que faut-il faire pour ajuster dans ce cas?

    Mon code d'affichage est le suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    //******************************Affichage sur écran TFT****************************************
    void afficheCapteur(){
      String date1 = nomJour[nJour] + " " + String(dJour) + " " + nomMois[nMois] + " " + String(annee);
      tft.fillScreen(TFT_BLACK);
      tft.setTextColor(TFT_YELLOW, TFT_BLACK);
      tft.setTextSize(2);                     //multiplicateur caractère w=12 h=15  20 car de 9 lignes 
      tft.drawString(date1,0,8);
      tft.drawString(F("Temperature: "),0,68);
      tft.drawFloat(temperature,2,154,68);
      tft.drawString(F("dC"),218,68);
      tft.drawString(F("Pression: "),0,88);
      tft.drawFloat(pression,2,115,88);
      tft.drawString(F("hPa"),204,88); 
      tft.drawString(F("Humidite: "),0,108);
      tft.drawFloat(humidite,2,115,108);
      tft.drawChar('%',180,108); 
    }

  7. #7
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour normic

    Déconnectes ton module DS1307, sors la pile bouton 20m secondes, remets la pile bouton, reconnectes ton module et charges le sketch RTClib-master/ds1307

    C'est partie qui s'occupe de la mise à l'heure, (heure du PC)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
      if ( !rtc.isrunning()) {
        Serial.println("RTC is NOT running, let's set the time!");
        // When time needs to be set on a new device, or after a power loss, the
        // following line sets the RTC to the date & time this sketch was compiled
        rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
        // This line sets the RTC with an explicit date & time, for example to set
        // January 21, 2014 at 3am you would call:
        // rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));
      }
    Cordialement
    jpbbricole

  8. #8
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    En effet après avoir entré l'heure du PC, il n'y a plus d'erreur. Je devrai vérifier si cela fonctionne toujours demain.
    Je vous remercie pour votre aide.
    Cordialement

  9. #9
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    C'est une bonne habitude que de faire un "reset propre" avec les RTC (et vous faites bien d'avoir un code de synchro car les modules que l'on trouve à base de DS1307 dérivent assez vite)

  10. #10
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    Bonjour
    Me re-voilà avec mon problème qui n'est toujours pas résolu.
    J'ai écrit cette procédure pour le mettre en évidence:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    //******************************mise à jour des paramètres date, heure par WiFi******************************
    void misaJourWifi(){
      WiFiUDP ntpUDP;   //Création de l'objet Wifi UDP
      NTPClient timeClient(ntpUDP, site, 7200, 60000);    //7200 pour GMT+2
      timeClient.begin();
      timeClient.update();                        //mise à jour de dateheure
      epoch = timeClient.getEpochTime();          //récupére dateheure UNIX
      nJour = timeClient.getDay();                //récupére le n° de jour
      //heure = timeClient.getFormattedTime();      //récupère l'heure formatée hh:mm:ss
      time_t timestamp = epoch;                   //variable timestamp de type time_t = dateheure UNIX
      struct tm *pTime = localtime(&timestamp);   //pTime pointe sur l'adresse de timestamp
      nMois = pTime->tm_mon;                      //(*pTime).tm_mon    N° du mois
      dJour = pTime->tm_mday;                     //jour du mois
      annee = pTime->tm_year+1900;                //année
      sc = pTime->tm_sec;                         //secondes
      mn = pTime->tm_min;                         //minutes
      hr = pTime->tm_hour;                        //heures
      //strftime(buffer,80, "%d/%m/%Y", pTime);   //Extrait la date formatée jj/mm/aaaa
      Serial.println(nomJour[nJour]);             //Affiche le jour Internet
      rtc.adjust(DateTime(annee,nMois,dJour,hr,mn,sc));   //Chargement dans le module RTC 
      delai(5,'s');                                       //Délai 5s    
      dtActuel = rtc.now();                               //Lecture du module RTC
      chargeDt(&dtActuel);                                //Extraction des éléments
      Serial.println(nomJour[nJour]);             //Affiche le jour RTC
      }
    Routine d'extraction des éléments:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    //*****************************Affiche la date et l'heure****************************************
    void chargeDt(DateTime *dt){
      annee = dt->year();
      nMois = dt->month();  
      dJour = dt->day();           //date du jour
      hr = dt->hour();
      mn = dt->minute();
      sc = dt->second();
      nJour = dt->dayOfTheWeek();   //n° du jour 
      ok=true;
    }
    L'affichage de jour pris sur Internet donne bien Lundi.
    J'attends 5s puis je lis le RTC. l'affichage me donne Vendredi.

    Je ne comprends pas d'où vient ce décalage.
    Si vous avez une idée, merci
    Michel

  11. #11
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    vous pouvez rajouter des print un peu partout?

    vous avez une autre RTC juste pour vérifier que ce n'est pas un souci matériel?

  12. #12
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    Bonjour

    La fonction dayOfTheWeek est purement logiciel. La date extraite du module RTC étant bonne, c'est purement le calcul qui devrait déterminer le numéro du jour.
    Changer de module RTC1307 ne devrait rien changer.
    Je pense qu'il y a vraiment un bug dans la fonction. J'ai jeté un coup d'oeil dans RTClib.ccp, mais c'est un peu complexe car il n'y a pas de commentaires.
    Alors je vais essayé de me creuser les méninges et écrire ma propre fonction de calcul.
    Ce que je ne comprends pas, c'est que j'avais déjà utilisé une fonction dayOfWeek dans une autre librairie qui fonctionnait bien.

    Merci de votre aide
    Michel

  13. #13
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    la fonction de calcul dépend du jour etc. Si votre RTC perd les pédales ça pourrait jouer.
    Quel type d'arduino utilisez vous?

    Pourriez vous faire un code minimal démontrant le souci avec dans le setup appel à la fonction misaJourWifi et chargeDt et le partager?

  14. #14
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour Michel

    Citation Envoyé par mormic Voir le message
    L'affichage de jour pris sur Internet donne bien Lundi.
    J'attends 5s puis je lis le RTC. l'affichage me donne Vendredi.
    Si tu affiches la date et l'heure pris sur internet (annee,nMois,dJour,hr,mn)

    tu attends 5 secondes
    puis affiche la date et l'heure de la RTC (( YY MM DD HH MM SS de rtc.now())
    est-ce qu'ils sont identiques?

    Cordialement
    jpbbricole

  15. #15
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    Je viens de changer de RTC1307 -> même pb
    j'ai écrit une procédure spécifique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //****************************Extraction des données de RTC**************************************
    void chargeDt(DateTime *dt){
      uint8_t A;
      uint8_t M[12] = {0,3,3,6,1,4,6,2,5,0,3,5};
      annee = dt->year();
      nMois = dt->month();  
      dJour = dt->day();                          //date du jour
      A = annee - 1900;                           //nombre d'années depuis 1900 qui était un lundi
      nJour = (dJour + A + A/4 + M[nMois-1])%7;   //n° du jour - 0 dimanche 1 lundi etc
      hr = dt->hour();
      mn = dt->minute();
      sc = dt->second();
      ok = true;
    }
    -> même pb
    J'utlise un ESP32 TTGO

    tu attends 5 secondes
    puis affiche la date et l'heure de la RTC (( YY MM DD HH MM SS de rtc.now())
    est-ce qu'ils sont identiques?
    Non les deux jours sont différents. Par exemple aujourd'hui j'ai bien mardi sur Internet mais samedi avec le RTC.

    Je dois avouer que j'y perds mon C parce que je parle pas le Latin!

    Je vais essayer de faire une maquette avec un Arduino Uno; je vous tiendrai au courant des résultats.
    Merci encore

  16. #16
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    pouvez vous poster un code minimal sur ESP32 avec le setup() et la loop() vide? vous avez les fonctions ça ne devrait pas être compliqué à extraire de votre code

    (sur UNO ça va être plus difficile d'accéder le wifi)

  17. #17
    Membre éclairé
    Homme Profil pro
    bricoleur
    Inscrit en
    Octobre 2014
    Messages
    406
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : bricoleur
    Secteur : Alimentation

    Informations forums :
    Inscription : Octobre 2014
    Messages : 406
    Par défaut
    j'ai fait la maquette avec ce petit prog:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    #include <Wire.h>
    #include <RTClib.h>
     
    uint8_t sc, mn, hr, nJour, dJour, nMois;
    uint16_t annee;
    const String nomJour[] = {"Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"};   
    const String nomMois[] = {"janvier", "fevrier", "mars", "avril", "mai", "juin", "juillet", "aout",
                              "septembre", "octobre", "novembre", "decembre"}; 
    RTC_DS1307 rtc;
    DateTime dtActuel;
     
    void setup() {
      Serial.begin(115200);
      Wire.begin();
      rtc.begin();
      rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      delay(500);
      dtActuel = rtc.now();
      chargeDt(&dtActuel);
      Serial.print("Start"); 
      Serial.print(" " + String(ARDUINO)+ " le ");
      Serial.println(nomJour[nJour] + " " + String(dJour) + " " + nomMois[nMois]);
    }
    //****************************Extraction des données de RTC**************************************
    void chargeDt(DateTime *dt){
      annee = dt->year();
      nMois = dt->month();  
      dJour = dt->day();                          //date du jour
      nJour = dt->dayOfTheWeek();                //n° du jour - 0 dimanche 1 lundi etc
      hr = dt->hour();
      mn = dt->minute();
      sc = dt->second();
    }
     
     
    void loop() {
      delay(5000);
      dtActuel=rtc.now();
      chargeDt(&dtActuel);
      Serial.println(nomJour[nJour] + " " + String(dJour) + " " + nomMois[nMois]);
    }
    Cela fonctionne parfaitement aussi bien avec Arduino Uno qu'avec ESP32 TTGO:

    Start 10813 le Mar 29 juillet
    Mar 29 juillet
    Mar 29 juillet
    Mar 29 juillet
    Mar 29 juillet
    Mon problème est ailleurs. Je vais me replonger dans le cambouis !

    Merci pour votre aide et désolé de vous avoir dérangé.

    Cordialement
    Michel

  18. #18
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Ce qui serait intéressant c’est la mise à jour par obtention de la date en WiFi

  19. #19
    Membre Expert
    Avatar de jpbbricole
    Homme Profil pro
    Retraité des réseaux informatiques
    Inscrit en
    Février 2013
    Messages
    1 017
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Retraité des réseaux informatiques
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Février 2013
    Messages : 1 017
    Par défaut
    Bonjour mormic
    Citation Envoyé par mormic Voir le message
    JNon les deux jours sont différents. Par exemple aujourd'hui j'ai bien mardi sur Internet mais samedi avec le RTC.
    Donc c'est le passage de l'heure de NTP à RTC qui pose problème

    Cordialement
    jpbbricole

  20. #20
    Expert confirmé

    Homme Profil pro
    mad scientist :)
    Inscrit en
    Septembre 2019
    Messages
    2 899
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : mad scientist :)

    Informations forums :
    Inscription : Septembre 2019
    Messages : 2 899
    Par défaut
    Bon j'ai fait un bout de code de test, je n'ai pas de DS1307 mais que des DS3231

    Voici le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    #include <WiFi.h>
    #include <NTPClient.h>    // https://github.com/taranais/NTPClient
    #include <WiFiUdp.h>
     
    const char* ssid = "*********";
    const char* password = "*********";
     
    WiFiUDP ntpUDP;
    NTPClient timeClient(ntpUDP);
     
    #include <RTClib.h>
    RTC_DS3231 rtc;
    const char* jours[] = {"Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"};
    const char* mois[]  = {"Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"};
     
    void imprimerDateRTC(DateTime& d) {
      Serial.print("---\nHeure RTC: Nous sommes le ");
      Serial.print(jours[d.dayOfTheWeek()]); Serial.write(' ');
      Serial.print(d.day());  Serial.write(' ');
      Serial.print(mois[d.month() - 1]); Serial.write(' ');
      Serial.print(d.year()); Serial.print(", il est ");
     
      Serial.print(d.hour());
      Serial.print('h');
      if (d.minute() < 10) Serial.write('0');
      Serial.print(d.minute());
      Serial.print(" et ");
      Serial.print(d.second());
      Serial.println(" secondes.");
     
      Serial.print("Jour de semaine : ");
      Serial.println(d.dayOfTheWeek());
    }
     
    void imprimerDateNTP(struct tm *pTime) {
      Serial.print("---\nHeure NTP: Nous sommes le ");
      Serial.print(jours[pTime->tm_wday]); Serial.write(' ');
      Serial.print(pTime->tm_mday);  Serial.write(' ');
      Serial.print(mois[pTime->tm_mon]); Serial.write(' ');
      Serial.print(pTime->tm_year + 1900); Serial.print(", il est ");
     
      Serial.print(pTime->tm_hour);
      Serial.print('h');
      if (pTime->tm_min < 10) Serial.write('0');
      Serial.print(pTime->tm_min);
      Serial.print(" et ");
      Serial.print(pTime->tm_sec);
      Serial.println(" secondes.");
     
      Serial.print("Jour de semaine : ");
      Serial.println(pTime->tm_wday);
    }
     
     
    void setup() {
      Serial.begin(115200);
      while (!Serial);
     
      WiFi.begin(ssid, password);
      if (WiFi.waitForConnectResult() != WL_CONNECTED) {
        Serial.println("Erreur connexion WiFi");
        while (true) yield();
      }
      Serial.println("WiFi OK");
      Serial.print("Adresse IP: ");
      Serial.println(WiFi.localIP());
     
      if (! rtc.begin()) {
        Serial.println("Couldn't find RTC");
        while (true) yield();
      }
      Serial.println("RTC trouvée");
     
      if (rtc.lostPower()) {
        Serial.println("Force l'heure de la RTC");
        rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
      }
     
      DateTime maintenant = rtc.now();
      imprimerDateRTC(maintenant);
     
      timeClient.begin();
      timeClient.setTimeOffset(7200);
      while (!timeClient.update()) timeClient.forceUpdate();
      time_t timestamp = timeClient.getEpochTime();         // heure UNIX
      struct tm *tmPtr = localtime(&timestamp);
      imprimerDateNTP(tmPtr);
     
      // changement de l'heure de la RTC
      rtc.adjust(DateTime(tmPtr->tm_year + 1900, tmPtr->tm_mon + 1, tmPtr->tm_mday, tmPtr->tm_hour, tmPtr->tm_min, tmPtr->tm_sec));
      maintenant = rtc.now();
      imprimerDateRTC(maintenant);
     
      // sinon on peut directement utiliser les fonctions de l'ESP32
      configTime(0, 0, "pool.ntp.org");
      setenv("TZ", "CET-1CEST,M3.5.0/2,M10.5.0/3", 1); // France
    }
     
    void loop() {
      delay(5000);
      DateTime maintenantDT = rtc.now();
      imprimerDateRTC(maintenantDT);
     
      struct tm timeinfo;
      getLocalTime(&timeinfo);
      imprimerDateNTP(&timeinfo);
    }
    bien sûr il faut ajuster votre SSID/MOT DE PASSE dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const char* ssid = "*********";
    const char* password = "*********";
    le setup() fait 3 choses:
    - je vais regarder si la RTC est configurée correctement sinon je mets l'heure de compilation du sketch et je l'affiche
    - je vais demander l'heure en utilisant comme vous NTPClient et je l'affiche
    - je change l'heure de la RTC en forçant l'heure obtenue par NTPClient et je raffiche l'heure

    Voici ce que je vois dans le moniteur série (à 115200 bauds):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    WiFi OK
    Adresse IP: 10.0.0.33
    RTC trouvée
    ---
    Heure RTC: Nous sommes le Mardi 29 Juin 2021, il est 15h43 et 34 secondes.
    Jour de semaine : 2
    ---
    Heure NTP: Nous sommes le Mardi 29 Juin 2021, il est 15h43 et 34 secondes.
    Jour de semaine : 2
    ---
    Heure RTC: Nous sommes le Mardi 29 Juin 2021, il est 15h43 et 34 secondes.
    Jour de semaine : 2
    il n'y a aucune incohérence sur le jour de la semaine après avoir effectué la mise à jour.


    ————

    Sinon ensuite dans le code j'utilise les fonction standard de l'ESP32, comme ça pas besoin de passer par NTPClient.

    On configure comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      configTime(0, 0, "pool.ntp.org");
      setenv("TZ", "CET-1CEST,M3.5.0/2,M10.5.0/3", 1); // France
    en disant que le serveur NTP que l'on veut accéder est pool.ntp.org et on donne la chaîne de la timezone pour Paris ensuite dans la loop pour aller lire l'heure sur internet il suffit de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      struct tm timeinfo;
      getLocalTime(&timeinfo);
    ce que je fais toutes les 5 secondes dans la loop.


    je vous laisse tester avec votre RTC et peut-être que ce code vous donnera des idées

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. HashMap<int, String> m ; Donne une erreur.
    Par Pierre8r dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 18/09/2009, 17h21
  2. Appel de fonction par SYS qui retourne une erreur
    Par tibal dans le forum PL/SQL
    Réponses: 3
    Dernier message: 15/12/2008, 23h32
  3. mon .htaccess me donne une erreur 500
    Par Dougui_bzh dans le forum OVH
    Réponses: 1
    Dernier message: 20/08/2008, 16h19
  4. Réponses: 12
    Dernier message: 25/11/2007, 12h29
  5. [C#] download en boucle donne une erreur
    Par iamloco dans le forum Windows Forms
    Réponses: 2
    Dernier message: 23/10/2006, 04h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo