Programmateur Multi voies = pas de mise à jour de date et heure

Bonsoir ,
Cela fait quatre fois que j'essaie d'envoyer un post , sur un sujet qui concerne une évolution d'un code
Ce post s'adresse à Lesept qui m'a aidé dans la mise en place d'un nombre magic , mais qui depuis ne m'autorise plus à parametrer la date et l'heure dans l'horloge
Cette fois ci je ne joins pas la totalité des codes des deux versions ( c'est peut-être cela qui bloque l'envoi du post ?)
En esperant que cela fonctionne.......

Les codes sont trop volumineux, je les mets en pièces jointe
La version 4 fonctionne
la Version 6 bloque

J'ai bien essayé de comparer, mais mes yeux ne sont pas assez experts pour déceler l'erreur
Merci de votre aide

ProgrammateurHoraireV6essai.ino (11.7 KB)

version 4

ProgrammateurHoraireV4essai.ino (15.4 KB)

@Paul : il vaut mieux créer un nouveau sujet plutôt que venir sur un thread en cours. Tu auras plus de chance d'avoir une réponse. Pour savoir comment faire, lis les messages épinglés au haut du forum.

@Bob : désolé, je n'avais pas vu ce message. Pour paramétrer la date et l'heure d'une RTC, il est possible d'utiliser l'heure de la compilation. La syntaxe peut dépendre de la bibliothèque utilisée. Un exemple ci-dessous, à mettre dans le setup :

RTC.begin(DateTime(__DATE__, __TIME__));

Je vais vérifier si ça convient à ton code.

Pour la bibli RTCLib, voici la syntaxe tirée d'un exemple :

RTC.adjust(DateTime(F(__DATE__), F(__TIME__)));

A mettre après RTC.begin()...

Bonsoir Lesept
Merci, j'ai essayé ceci

void setup() {
  Wire.begin();
  RTC.begin();
  RTC.adjust(DateTime(F(__DATE__), F(__TIME__))); // NOUVELLE MODIF 13_3_21
  lcd.begin(16, 2);
  // RTC.adjust(DateTime(2021,01,18,21,01,01));
  // Initialisation A2,A3,2,3,11,12 en sorties
  byte i; for ( i = 0; i < 6; i++ ) {
    pinMode(PinSorties[i], OUTPUT);
    digitalWrite (PinSorties[i], HIGH);
  }

Mais cela bug
Par contre mon problème est que je ne peux pas ajuster la date et l'heure à partir des boutons du Shield et cela depuis que l'on sauvegarde les données sur l'eeprom
cela concernerait cette partie du code (je pense)

// Saisie MaJ Date,Heure ?
  lcd.setCursor(0, 0); lcd.print("Maj Date,Heure ?");
  lcd.setCursor(0, 1); lcd.print("Sel: O Right: N");
  MaH = 1;
  // Mise à jour Date Heure
  while (MaH == 1) {
    BpH = analogRead (0); delay(100); lcd.setCursor(0, 0);

    //Sortie  mise à jour
    if (BpH < 50) {
      if (DrapH == 2)
        {RTC.adjust(DateTime(TabMaH[0], TabMaH[1], TabMaH[2], TabMaH[3], TabMaH[4], TabMaH[5]));}
      lcd.clear(); lcd.setCursor(0, 0); lcd.print("Fin saisie"); delay(2000); lcd.clear();
      MaH = 0;
    }// Fin mise à jour

    // Incrémentation
    else if (BpH < 200) {
      if (DrapH == 2 && TabMaH[ColH] < MaxH) {
        TabMaH[ColH] ++;
        lcd.setCursor (CurH, CurligH);
        if (TabMaH[ColH] < 10) lcd.print (0);
        lcd.print(TabMaH[ColH]);
      }
      delay(200);
    }// Fin incrémentation

    // Décrémentation
    else if (BpH < 380) {
      if (DrapH == 2 && TabMaH[ColH] > MinH) {
        TabMaH[ColH] --;
        lcd.setCursor (CurH, CurligH);
        if (TabMaH[ColH] < 10) lcd.print (0);
        lcd.print(TabMaH[ColH]);
      }
      delay(200);
    }// Fin décrémentation

    //Choix valeur à mettre à jour
    else if (BpH < 600) {
      if (DrapH > 0) DrapH = 2;
      if (SelH < 6) {
        SelH++ ;
        delay(200);
        ColH = SelH - 1;
      }
      if (SelH == 6) SelH =  0;

      if (ColH == 0) {
        lcd.setCursor(7, 0);
        lcd.print ("**");
        MaxH = 50;
        MinH = 10;
        CurH = 7;
        CurligH = 0;
      } else {
        lcd.setCursor(7, 0);
        if (TabMaH[0] < 10) lcd.print (0);
        lcd.print (TabMaH[0]);
      }

      if (ColH == 1) {
        lcd.setCursor(10, 0);
        lcd.print ("**");
        MaxH = 12;
        MinH = 1;
        CurH = 10;
        CurligH = 0;
      } else {
        lcd.setCursor(10, 0);
        if (TabMaH[1] < 10) lcd.print (0);
        lcd.print (TabMaH[1]);
      }

      if (ColH == 2) {
        lcd.setCursor(13, 0);
        lcd.print ("**");
        MaxH = 31;
        MinH = 1;
        CurH = 13;
        CurligH = 0;
      } else {
        lcd.setCursor(13, 0);
        if (TabMaH[2] < 10) lcd.print (0);
        lcd.print (TabMaH[2]);
      }

      if (ColH == 3) {
        lcd.setCursor(7, 1);
        lcd.print ("**");
        MaxH = 23;
        MinH = 0;
        CurH = 7;
        CurligH = 1;
      } else {
        lcd.setCursor(7, 1);
        if (TabMaH[3] < 10)  lcd.print (0);
        lcd.print (TabMaH[3]);
      }

      if (ColH == 4) {
        lcd.setCursor(10, 1);
        lcd.print ("**");
        MaxH = 59;
        MinH = 0;
        CurH = 10;
        CurligH = 1;
      } else {
        lcd.setCursor(10, 1);
        if (TabMaH[4] < 10) lcd.print (0);
        lcd.print (TabMaH[4]);
      }

      if (ColH == 5) {
        lcd.setCursor(13, 1);
        lcd.print ("**");
        MaxH = 59;
        MinH = 0;
        CurH = 13;
        CurligH = 1;
      } else {
        lcd.setCursor(13, 1);
        if (TabMaH[5] < 10) lcd.print (0);
        lcd.print (TabMaH[5]);
      }
    }//Fin choix valeur

    //Affichage ecran saisie
    else if (BpH < 800) {
      lcd.clear();
      lcd.setCursor(0, 0); lcd.print (" Date:   /  /  ");
      lcd.setCursor(0, 1); lcd.print ("Heure:   :  :  ");

      lcd.setCursor (7, 0); if (TabMaH[0] < 10) lcd.print (0);
      lcd.print(TabMaH[0]);
      lcd.setCursor (10, 0); if (TabMaH[1] < 10) lcd.print (0);
      lcd.print(TabMaH[1]);
      lcd.setCursor (13, 0); if (TabMaH[2] < 10) lcd.print (0);
      lcd.print(TabMaH[2]);
      lcd.setCursor (7, 1); if (TabMaH[3] < 10) lcd.print (0);
      lcd.print(TabMaH[3]);
      lcd.setCursor (10, 1); if (TabMaH[4] < 10) lcd.print (0);
      lcd.print(TabMaH[4]);
      lcd.setCursor (13, 1); if (TabMaH[6] < 10) lcd.print (0);
      lcd.print(TabMaH[5]);
      DrapH = 1;
    }// Fin Affichage
  }//Fin While Maj Heure

"cela bug" : il faut m'en dire plus. Est-ce que c'est un problème de téléversement ou d'exécution? Dans les deux cas, copie dans ta réponse le contenu soit de la fenêtre de compilation, soit de la console si elle affiche quelque chose.

Je vais regarder ce problème de mise à jour de l'heure. À plus !

Bonsoir
le téléversement se réalise bien, mais l'afficheur LCD reste bloqué à l'éclairage de la première ligne sans aucun affichage
si je retire cette ligne, cela refonctionne avec la date et l'heure (sans être à jour)

Bizarre, c'est pourtant extrait des exemples de la bibliothèque. C'est bien la bibli RTCLib d'Adafruit ?
Essaye avec :

RTC.adjust(DateTime(2014, 1, 21, 3, 0, 0));

Ca va mettre la date au 21/01/2014 à 3h. Dis-moi ce que ça donne...

Pour être sûr, tu peux entourer cette ligne avec des Serial.println :

Serial.println("Avant");
RTC.adjust(DateTime(2014, 1, 21, 3, 0, 0));
Serial.println("Apres !");

Ensuite, dis-moi ce que tu vois dans la console

Cela ne bug plus, l'écran affiche bien la date et l'heure de ton code
Cette ligne de code était déjà présente, mais désactivée par les //, après que tu ai fait la simplification du code suite à la sauvegarde sur Eeprom

void setup() {
  Wire.begin();
  RTC.begin();
  RTC.adjust(DateTime(2014, 1, 21, 3, 0, 0));
  lcd.begin(16, 2);
  // RTC.adjust(DateTime(2021,01,18,21,01,01));
  // Initialisation A2,A3,2,3,11,12 en sorties
  byte i; for ( i = 0; i < 6; i++ ) {
    pinMode(PinSorties[i], OUTPUT);
    digitalWrite (PinSorties[i], HIGH);

Aussi pour ton info, je suis avec un LCD, donc l'Adafruit ne concerne pas que les Oled ?

Par contre bien qu'ayant la date et l'heure, je ne peux pas la modifier avec les boutons du shield....?

Les instructions de mise à jour sont ici :

    BpH = analogRead (0); delay(100); lcd.setCursor(0, 0);

    //Sortie  mise à jour
    if (BpH < 50) {
      if (DrapH == 2)
        {RTC.adjust(DateTime(TabMaH[0], TabMaH[1], TabMaH[2], TabMaH[3], TabMaH[4], TabMaH[5]));}
      lcd.clear(); lcd.setCursor(0, 0); lcd.print("Fin saisie"); delay(2000); lcd.clear();
      MaH = 0;
    }// Fin mise à jour

Si la mise à jour ne se fait pas c'est probablement qu'elles ne sont pas exécutées ou pas comme on s'y attend.

Le code étant assez compliqué (euphémisme), il n'est pas facile de savoir pourquoi...

Qu'est-ce qui est branché sur la pin 0 (pour analogRead (0)) ?

Bonsoir
Sur la pin 0 il n'y a rien de branché
Je te joins le code suivant sur lequel la touche SEL fonctionne et on peut mettre à jour la date et heure sauf que aucune sauvegarde est opérationnelle en cas de coupure de courant, c'est pour cela que tu m'avais effectué les modifs pour faire fonctionner sur l'eeprom
J'ai beau comparer les deux codes, je ne trouve pas la différence qui peut expliquer la non fonction du bouton SEL du shield

#include <LiquidCrystal.h>
#include <Wire.h>
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
DS3231 RTC;
// Init Shield LCD
    LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
//Variables mise à jour Horloge
    byte TabMaH[6] = {21, 1, 18, 21, 3, 0};
    byte MaH; int BpH; byte DrapH; byte SelH; byte ColH; byte MaxH; byte MinH; byte CurH; byte CurligH;

// Variables mise à jour de la plage horaire
      int Bp; int MaJ; int Flag; int Vo; int Lig; int Sel; ; int Col; int Val; int Max; int Cur; int CurLig;
      // Table Evénerments chaque ligne correspond à une voie. Sur la ligne, on trouve H départ, M Départ, H Arrêt, M Arrêt..
            int TabEvt [6][4] =
            {
              {23, 8, 23, 11},
              {23, 06, 23, 42},
              {23, 12, 23, 43},
              {21, 23, 21, 44},
              {21, 12, 22, 40},
              {22, 50, 23, 05}
            };      
        byte PinSorties[6] = {17,16,11,12,2,3};
void setup() {
  Wire.begin();
  RTC.begin();
  lcd.begin(16, 2);
  // RTC.adjust(DateTime(2021,01,18,21,01,01));
  // Initialisation A2,A3,2,3,11,12 en sorties
      byte i; for ( i = 0; i < 6; i++ ) {pinMode(PinSorties[i], OUTPUT); digitalWrite (PinSorties[i], HIGH);}
  Serial.begin(9600);
    // Saisie MaJ Date,Heure ?
        lcd.setCursor(0, 0); lcd.print("Maj Date,Heure ?");
        lcd.setCursor(0, 1); lcd.print("Sel: O Right: N");
        MaH = 1;
      // Mise à jour Datye Heure
          while (MaH == 1) {
            BpH = analogRead (0); delay(100); lcd.setCursor(0, 0);
            
            //Sortie  mise à jour
                if (BpH < 50) {
                  if (DrapH == 2) { RTC.adjust(DateTime(TabMaH[0],TabMaH[1],TabMaH[2],TabMaH[3],TabMaH[4],TabMaH[5]));}
                  lcd.clear(); lcd.setCursor(0, 0); lcd.print("Fin saisie"); delay(2000); lcd.clear();
                    MaH = 0;
                 }// Fin muise à jour
                 
              // Incrémentation
                  else if (BpH < 200) {
                    if (DrapH == 2 && TabMaH[ColH] < MaxH) { TabMaH[ColH] ++;
                         lcd.setCursor (CurH,CurligH); if (TabMaH[ColH] < 10) {lcd.print (0);} lcd.print(TabMaH[ColH]);}
                     delay(200);                    
                  }// Fin incrémentation
                  
               // Décrémentation
                   else if (BpH < 380) {
                     if (DrapH == 2 && TabMaH[ColH] > MinH) { TabMaH[ColH] --;
                         lcd.setCursor (CurH,CurligH); if (TabMaH[ColH] < 10) {lcd.print (0);} lcd.print(TabMaH[ColH]);}
                     delay(200);                    
                    }// Fin décrémentatiuon
         
                //Choix valeur à mettre à jour
                    else if (BpH < 600) {
                      if (DrapH > 0) {DrapH = 2; }
                      if (SelH < 6) { SelH++ ; delay(200); ColH = SelH - 1;}
                      if (SelH == 6) {SelH =  0;}
          
                      if (ColH == 0) { lcd.setCursor(7, 0); lcd.print ("**"); MaxH = 50; MinH = 10; CurH = 7; CurligH = 0; }
                      else if (ColH != 0) {lcd.setCursor(7, 0); if (TabMaH[0] < 10) {lcd.print (0);} lcd.print (TabMaH[0]);}
                
                      if (ColH == 1) {lcd.setCursor(10, 0); lcd.print ("**"); MaxH = 12; MinH = 1; CurH = 10; CurligH = 0; }
                      else if (ColH != 1) {lcd.setCursor(10, 0); if (TabMaH[1] < 10) {lcd.print (0);} lcd.print (TabMaH[1]);}
                
                      if (ColH == 2) {lcd.setCursor(13, 0); lcd.print ("**"); MaxH = 31; MinH = 1; CurH = 13; CurligH = 0; }
                      else if (ColH != 2) {lcd.setCursor(13, 0); if (TabMaH[2] < 10) {lcd.print (0);} lcd.print (TabMaH[2]);}
                
                      if (ColH == 3) {lcd.setCursor(7, 1); lcd.print ("**"); MaxH = 23; MinH = 0; CurH = 7; CurligH = 1; }
                      else if (ColH != 3) {lcd.setCursor(7, 1); if (TabMaH[3] < 10) {lcd.print (0);} lcd.print (TabMaH[3]);}
                
                      if (ColH == 4) {lcd.setCursor(10, 1);lcd.print ("**"); MaxH = 59; MinH = 0; CurH = 10; CurligH = 1; }
                      else if (ColH != 4) {lcd.setCursor(10, 1); if (TabMaH[4] < 10) {lcd.print (0);} lcd.print (TabMaH[4]);}
                
                      if (ColH == 5) {lcd.setCursor(13, 1); lcd.print ("**"); MaxH = 59; MinH = 0; CurH = 13; CurligH = 1; }
                      else if (ColH != 5) {lcd.setCursor(13, 1);if (TabMaH[5] < 10) {lcd.print (0);} lcd.print (TabMaH[5]);}
                     }//Fin chouix valeuyr  
      
                //Affichage ecran saisie
                    else if (BpH < 800) {
                      lcd.clear(); lcd.setCursor(0, 0); lcd.print (" Date:   /  /  ");lcd.setCursor(0, 1); lcd.print ("Heure:   :  :  ");
                      
                      lcd.setCursor (7, 0); if (TabMaH[0] < 10) {lcd.print (0);} lcd.print(TabMaH[0]);
                      lcd.setCursor (10, 0); if (TabMaH[1] < 10) {lcd.print (0);} lcd.print(TabMaH[1]);
                      lcd.setCursor (13, 0); if (TabMaH[2] < 10) {lcd.print (0);} lcd.print(TabMaH[2]);
                      lcd.setCursor (7, 1); if (TabMaH[3] < 10) {lcd.print (0);} lcd.print(TabMaH[3]);
                      lcd.setCursor (10, 1); if (TabMaH[4] < 10) {lcd.print (0);} lcd.print(TabMaH[4]);
                      lcd.setCursor (13, 1); if (TabMaH[6] < 10) {lcd.print (0);} lcd.print(TabMaH[5]);
                      DrapH = 1;
                    }// Fin Affichage
          }//Fin While Maj Heure

Le code contient

 BpH = analogRead (0);

Donc il y a forcément quelque chose branché sur la pin A0. Est-ce un bouton du shield ?
BpH est testé et l'heure est mise à jour si sa valeur est < 50

            //Sortie  mise à jour
                if (BpH < 50) {
                  if (DrapH == 2) { RTC.adjust(DateTime(TabMaH[0],TabMaH[1],TabMaH[2],TabMaH[3],TabMaH[4],TabMaH[5]));}
                  lcd.clear(); lcd.setCursor(0, 0); lcd.print("Fin saisie"); delay(2000); lcd.clear();
                    MaH = 0;
                 }// Fin mise à jour

Il faut donc chercher à savoir comment exécuter ces lignes.

Bonsoir
Oups, je t'ai répondu sur la pin D0 et non sur la A0. Cette dernière est l'information des boutons du shield.
Quand j'ai constaté que je ne pouvais plus mettre à jour la date et l'heure à partir des boutons du shield, j'ai pensé à un mauvais contact des broches. Mais j'arrivais à changer les paramètres des plages horaires, donc les connexions étaient correctes. C'est en réinstallant les différentes versions que je me suis aperçu que cela ne fonctionne plus depuis le paramétrage de l'eeprom. On a l'impression que cette dernière n'autorise plus la mise à jour de la date
on a le même code sur les deux versions, donc le problème doit être ailleurs

    //Sortie  mise à jour
    if (BpH < 50) {
      if (DrapH == 2)
        {RTC.adjust(DateTime(TabMaH[0], TabMaH[1], TabMaH[2], TabMaH[3], TabMaH[4], TabMaH[5]));}
      lcd.clear(); lcd.setCursor(0, 0); lcd.print("Fin saisie"); delay(2000); lcd.clear();
      MaH = 0;
    }// Fin mise à jour

Peux-tu poster la version courante du code ?

Bonsoir
Je te joins les deux fichiers ino
Celui de la version 2 est sans Eeprom et fonctionne pour la mise à jour de la date et heure
Celui de la version 6 ne permets pas la mise à jour

ProgrammateurHoraireV2_lcd20.ino (13.8 KB)

ProgrammateurHoraireV6essai.ino (11.8 KB)

Je ne vois pas de problème dans le code version 6.
As-tu testé l'exemple que je t'avais indiqué, pour voir si la mise à jour de le RTC avec l'heure de compilation fonctionne ? Tu le trouveras dans les exemples de la bibliothèque RTCLib.

Quand tu dis :

On a l'impression que cette dernière n'autorise plus la mise à jour de la date

que veut dire "n'autorise pas" ?

Peux-tu ajouter le Serial.println suivant dans la version 6 et essayer une mise à jour ;

    //Sortie  mise à jour
    if (BpH < 50) {
      if (DrapH == 2)
        { Serial.println("Mise à jour heure date");
          RTC.adjust(DateTime(TabMaH[0], TabMaH[1], TabMaH[2], TabMaH[3], TabMaH[4], TabMaH[5]));}
      lcd.clear(); lcd.setCursor(0, 0); lcd.print("Fin saisie"); delay(2000); lcd.clear();
      MaH = 0;
    }// Fin mise à jour

Est-ce que le message s'affiche dans la console ? Est-ce que tu vois 'Fin saisie' sur le LCD ?

Bonsoir

As-tu testé l'exemple que je t'avais indiqué, pour voir si la mise à jour de le RTC avec l'heure de compilation fonctionne

Oui, j'ai testé celui-ci dessous mais cela plantait l'afficheur

rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));

Puis celui-là qui a fonctionner sans apporter une amélioration

rtc.adjust(DateTime(2014, 1, 21, 3, 0, 0));

Quand tu dis :
que veut dire "n'autorise pas" ?

C'est que l'action sur le bouton " SELECT " ne donne aucun résultat
Explication du fonctionnement du programme :
A la mise sous tension l'écran affiche " Maj Date, Heure ? " sur la première ligne et " Sel : O Right : N " sur la deuxième. Donc pour mettre à jour j'appui sur " SELECT " du shield, puis sur "LEFT " pour faire le choix du pavé à modifier , puis sur " UP " ou " DOWN "pour choisir la valeur et enfin sur " RIGHT " pour valider la saisie . Après avoir appuyé sur " RIGHT " , l'écran affiche " Fin de Saisie " . Ainsi la première étape de mise à jour de la date et de l'heure validée, un deuxième processus similaire est en action pour modifier les plages horaires.
Dans les deux cas, si je ne veux rien modifier, je n'ai qu'à appuyer sur le bouton " RIGHT ' pour valider la première étape ( date et heure ) puis réappuyer sur " RIGHT " pour valider les plages horaires.
Dans la version 2 tout fonctionne correctement ( modification date et heure, et modification plages horaires ), tandis que dans la version 6 , je ne peux modifier que les plages horaires car l'action sur le bouton " SELECT " n'a aucun effet sur le programme.
Espérant avoir été assez clair pour t'aider à la recherche de la différence entre les deux versions

Non, je demandais si tu avais testé l'exemple, pas les instructions de mise à jour.

Toute bibliothèque, y compris RTCLib, est accompagnée d'un certain nombre d'exemples. Ce sont des codes faits par l'auteur pour mettre en œuvre les fonctions de la bibli. Ca permet de la tester sur du code "sûr" et d'apprendre à s'en servir. On trouve les exemples via le menu "fichier' de l'IDE Arduino.

Trouve cet exemple, teste-le et dis moi s'il affiche des choses dans le console. Au besoin débranche le LCD.

Cherche la ligne suivante (vers le numéro 100) :

  BpH = analogRead (0); delay(100); lcd.setCursor(0, 0);

et ajoute à la suite :

Serial.println(BpH);

Peux-tu me dire ce qui s'affiche dans le processus de mise à jour de l'heure lorsque tu appuies sur les différents boutons, et lorsque tu n'appuies sur aucun bouton ?
Même chose pour le choix de plages.