Partage
  • Partager sur Facebook
  • Partager sur Twitter

RTC 1302 + LCD keypad

mise à l'heure

Sujet résolu
    2 septembre 2018 à 11:49:56

    Bonjour,

    bonjour,
    avec ma carte arduino méga équipée d'un lcd keypad et d'1 rtc 1302, je voudrais mettre à l'heure le rtc a l'aide des bouton left et right à savoir
    appui sur left = -1 minute, appui sur right = +1 minute

    j'utilise les bibliothèques

    #include <LiquidCrystal.h>
    #include <virtuabotixRTC.h>



    j'ai testé le code suivant:

    case btnRIGHT: {
        myrtc.updateTime();
        myrtc.setDS1302Time (myrtc.seconds, myrtc.minutes+1, myrtc.hours, myrtc.dayofweek, myrtc.dayofmonth, myrtc.month, myrtc.year);
    break;
    }


    mais cela ne fonctionne pas correctement


    quelqu'un peut-il m'aider?
    s'il vous plaît

    • Partager sur Facebook
    • Partager sur Twitter
      2 septembre 2018 à 13:06:48

      Et ça ne fonctionne pas de quelle façon ? La valeur ne change pas, ou elle change de plus d'une minute.

      • Partager sur Facebook
      • Partager sur Twitter
        2 septembre 2018 à 13:09:46

        bonjour alexisdm

        désolé je n'ai pas vu ta question

        lorsque j'appui sur le bouton le nombre de minutes est modifié mais pas d'une seule minute mais de beaucoup plus

        je constate qu'il existe différentes bibliothèques de gestion du RTC 1302

        si vous aviez un exemple de mise à l'heure d'une RTC 1302 via un LCI keyPad je suis très intéressé

        merci

        -
        Edité par OcinBzh 2 septembre 2018 à 13:39:06

        • Partager sur Facebook
        • Partager sur Twitter
          2 septembre 2018 à 16:04:15

          OcinBzh a écrit:

          lorsque j'appui sur le bouton le nombre de minutes est modifié mais pas d'une seule minute mais de beaucoup plus

          Donc, il ne devrait pas y avoir beaucoup à modifier pour que ça fonctionne. 

          Le code de loop, comme le nom de la fonction l'implique, tourne en boucle, et si tu appuies sur le bouton, même pendant un court instant, ça laisse le temps de l'exécuter plusieurs fois d'affilé. Pour éviter ça, tu dois attendre que le bouton soit relâché avant de re-modifier le temps, et/ou ajouter un delay (ou utiliser millis() pour éviter les appels à delay) pour qu'il n'incrémente que d'un, par exemple, toutes les secondes tant que le bouton reste appuyé, ou que l'incrémentation accélère en fonction du temps qu'on reste appuyé.

          Pour faire la première solution, avec un relâchement obligatoire entre 2 incrémentations, donc la solution la plus simple, on peut ajouter une variable globale qui va indiquer si le bouton a été relâché entre 2 tours de boucle pour n'exécuter le code du switch qu'une seule fois jusqu'au prochain relâchement du bouton.

          bool buttonReleased = false;
          
          void setup() {
            // ...
          }
          
          void loop()
          {
            //...
            lcd_key = read_LCD_buttons();  // read the buttons
          
            if (lcd_key == btnNone) { // Aucun bouton n'est appuyé
              buttonReleased = true;  // Ce qui indique que le bouton a été relâché
            } else if (buttonReleased) { // n'exécute le switch que si le bouton vient d'être appuyé
              buttonReleased = false;    // réinitialise la variable pour attendre le relâchement suivant
              switch (lcd_key)
              {
                case btnRIGHT:
                  {
                    myrtc.updateTime();
                    myrtc.setDS1302Time (myrtc.seconds, myrtc.minutes + 1, myrtc.hours, myrtc.dayofweek, myrtc.dayofmonth, myrtc.month, myrtc.year);
                    break;
                  }
              }
            }
          }



          • Partager sur Facebook
          • Partager sur Twitter
            2 septembre 2018 à 18:43:44

            bonsoir,

            nickel ça marche - mes boutons incrémentes de +1 ou -1 la valeur de mes minutes,

            MERCI BEAUCOUP!!

            il me reste un problème :-(

            arrivé à 60 mon code ne bascule pas automatiquement mes minutes à zéro et mes heures = heures + 1

            je ferai bien quelques lignes de code pour intégrer les conditions nécessaires mais cela me fait des lignes de code pour m'assurer que ces ok jusque la valeur de l'année,

            n'existerai-t-il pas une solution plus simple?

            s'il vous plaît

            -
            Edité par OcinBzh 2 septembre 2018 à 19:09:18

            • Partager sur Facebook
            • Partager sur Twitter
              3 septembre 2018 à 21:45:30

              bonsoir,

              pour ce que cela intéresse (je suis débutant),

              montage: arduino méga sur usb sur laquelle j'ai clipsé la lcd keypad et branché sur les pins 48, 50 et 52 un module RTC 1302

              il me restait à régler le problème du dérèglement "normal" de la RTC et j'ai trouvé une solution ci-dessous

              myrtc.updateTime();
                   if (myrtc.minutes == 0 && myrtc.seconds == 15){     //recule de 3 secondes toutes les heures
                       if (VarRetard == 0) {
                           myrtc.setDS1302Time (12, myrtc.minutes, myrtc.hours, myrtc.dayofweek, myrtc.dayofmonth, myrtc.month, myrtc.year);
                           VarRetard = 1; 
                       }
                   }
              
                  if (myrtc.minutes == 0 && myrtc.seconds > 15){     //recule de 3 secondes toutes les heures
                       VarRetard = 0; 
                   }

              sinon est-ce possible électroniquement? si oui cela m'intéresse

              merci

              //Exemple de code utilisant la librairie LiquidCrystal
              #include <LiquidCrystal.h>
              #include <virtuabotixRTC.h>
              
              // C ROLLAND - 02 02 2013 Tiptopboards.com
              // Module ecran LCD 2 lignes x 16 caracteres
              // Clavier 5 touches
              // DFRobot : LCD Keypad Shield
              /*******************************************************
               
              Ce programme permet de tester l'écran LCD 16x02 et les 5 boutons
              Mark Bramwell, July 2010 / Rolland - Tiptopboards 2013
               
              ********************************************************/
              
              //RTC
              #define PIN_CLK 48
              #define PIN_DAT 50
              #define PIN_RST 52
              
              char stringa[20];
              
              virtuabotixRTC myrtc(PIN_CLK, PIN_DAT, PIN_RST);
              
              // Sélection des pins utilisées par l'écran LCD
              LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
               
              // Definit des valeurs utilisées par les 5 boutons
              int lcd_key     = 0;
              int adc_key_in  = 0;
              #define btnRIGHT  0
              #define btnUP     1
              #define btnDOWN   2
              #define btnLEFT   3
              #define btnSELECT 4
              #define btnNONE   5
               
              // Lecture des  boutons (tous regroupés sur le Pin Analog A0)
              int read_LCD_buttons()
              {
               adc_key_in = analogRead(0);      // Lit la valeur depuis le sensor sur A0
               // centré sur ces valeurs : 0, 144, 329, 504, 741
               // on ajoute environ 50 à ces valeurs et on vérifie si on est proche
               if (adc_key_in > 1000) return btnNONE; // On définit ça en première option pour raison de rapidité car option la plus probable
              
               if (adc_key_in < 50)   return btnRIGHT; 
               if (adc_key_in < 195)  return btnUP;
               if (adc_key_in < 380)  return btnDOWN;
               if (adc_key_in < 555)  return btnLEFT;
               if (adc_key_in < 790)  return btnSELECT;   
               return btnNONE;  // Sinon, on n'a aucun bouton de sélectionné (par défaut)
              }
              
              int mtime;
              
              bool buttonReleased = false;
              int VarSel=0;
              int VarH;
              int VarM;
              int VarS;
              int VarRetard = 0;
              
              void setup()
              {
                //RTC
                //myrtc.setDS1302Time (30,17,11,6,2,9,2018); 
                
               lcd.begin(16, 2);              // Lance la librarie (16 caractères x 2 lignes)
               Serial.begin(9600);            //Port seriel
              
               //Message hello
               lcd.setCursor(0,0); //En haut à gauche (numéroté depuis 0)
               lcd.print("Sketck Pompe"); // Afficher un petit message
               lcd.setCursor(0,1);   //Ligne du bas
               lcd.print("Sept 2018");   //intro de 5 secondes-
               
               delay(5000);  //Proposer de choisir un bouton
              
               lcd.clear();
              }
               
              void loop() {
               //RTC
                   if (VarSel == 0) {
                      lcd.setCursor(0,0);
                      myrtc.updateTime();
                      sprintf(stringa,"%02d/%02d/%02d", myrtc.dayofmonth, myrtc.month, myrtc.year);
                      lcd.print(stringa);
                   }
              
                   // code ne fonctionne^pas ???
                   myrtc.updateTime();
                   if (myrtc.minutes == 0 && myrtc.seconds == 15){     //recule de 3 secondes toutes les heures
                       if (VarRetard == 0) {
                           myrtc.setDS1302Time (12, myrtc.minutes, myrtc.hours, myrtc.dayofweek, myrtc.dayofmonth, myrtc.month, myrtc.year);
                           VarRetard = 1;
                       } 
                       else if (VarRetard == 1) {VarRetard = 0;}
                   }
                   
                  lcd.setCursor(0,1);
                  myrtc.updateTime();
                  sprintf(stringa,"%02d:%02d:%02d", myrtc.hours, myrtc.minutes, myrtc.seconds);
                  lcd.print(stringa);
               
              
               lcd_key = read_LCD_buttons();  // Lire le bouton appuyé
              
               if (lcd_key == btnNONE) {       // Aucun bouton n'est appuyé
                  buttonReleased = true;       // Ce qui indique que le bouton a été relâché 
                } 
                else if (buttonReleased) {  // n'exécute le switch que si le bouton vient d'être appuyé
                  
                  buttonReleased = false; // réinitialise la variable pour attendre le relâchement suivant
                
                     switch (lcd_key) {            // Selon le bouton choisi
                       case btnRIGHT: { 
                        lcd.setCursor(9,1);
                        lcd.print("Droite");
                        lcd.setCursor(3,0);
                         switch (VarSel) {
                          case 1: {
                            VarH = VarH + 1;
                            if (VarH < 0) {VarH = 23;}
                            if (VarH > 23) {VarH = 0;}
                            if (VarH >= 0 && VarH < 10) {
                                lcd.write('0');
                            }
                            lcd.print(VarH);
                            break;
                          }
                          case 2: {
                            VarM = VarM + 1;
                            if (VarM < 0) {VarM = 59;}
                            if (VarM > 59) {VarM = 0;}
                            if (VarM >= 0 && VarM < 10) {
                                lcd.write('0');
                            }
                            lcd.print(VarM);
                            break;
                          }
                          case 3: {
                            VarS = VarS + 1;
                            if (VarS < 0) {VarS = 59;}
                            if (VarS > 59) {VarS = 0;}
                            if (VarS >= 0 && VarS < 10) {
                                lcd.write('0');
                            }
                            lcd.print(VarS);
                            break;
                          }
                         }                   
                         break;
                         }
                       case btnLEFT: {
                        lcd.setCursor(9,1);
                        lcd.print("Gauche");
                        lcd.setCursor(3,0);
                         switch (VarSel) {
                          case 1: {
                            VarH = VarH - 1;
                            if (VarH < 0) {VarH = 23;}
                            if (VarH > 23) {VarH = 0;}
                            if (VarH >= 0 && VarH < 10) {
                                lcd.write('0');
                            }
                            lcd.print(VarH);
                            break;
                          }
                          case 2: {
                            VarM = VarM - 1;
                            if (VarM < 0) {VarM = 59;}
                            if (VarM > 59) {VarM = 0;}
                            if (VarM >= 0 && VarM < 10) {
                                lcd.write('0');
                            }
                            lcd.print(VarM);
                            break;
                          }
                          case 3: {
                            VarS = VarS - 1;
                            if (VarS < 0) {VarS = 59;}
                            if (VarS > 59) {VarS = 0;}
                            if (VarS >= 0 && VarS < 10) {
                                lcd.write('0');
                            }
                            lcd.print(VarS);
                            break;
                          }
                         }                   
                         break;
                       }
                       
                       case btnSELECT:  {
                         lcd.setCursor(9,1);
                         lcd.print("Select");
                         switch (VarSel) {
                          case 0: { //hours
                            lcd.setCursor(0,0);  
                            lcd.print ("H:              ");
                            VarH = myrtc.hours;
                            lcd.setCursor(3,0);
                            if (VarH >= 0 && VarH < 10) {
                                lcd.write('0');
                            }
                            lcd.print(VarH);
                            VarSel = 1;
                            break;
                          }
                          case 1: { //minutes
                            lcd.setCursor(0,0);  
                            lcd.print ("M:              ");
                            VarM = myrtc.minutes;
                            lcd.setCursor(3,0);
                            if (VarM >= 0 && VarM < 10) {
                                lcd.write('0');
                            }
                            lcd.print(VarM);
                            VarSel = 2;
                            break;
                          }
                          case 2: { //secondes
                            lcd.setCursor(0,0);  
                            lcd.print ("S:              ");
                            VarS = myrtc.seconds;
                            lcd.setCursor(3,0);
                            if (VarS >= 0 && VarS < 10) {
                                lcd.write('0');
                            }
                            lcd.print(VarS);
                            VarSel = 3;
                            break;
                          }
                          case 3: { //enregistrer
                            lcd.setCursor(0,0); lcd.print ("Enregistrer");
                            myrtc.setDS1302Time (VarS, VarM, VarH, myrtc.dayofweek, myrtc.dayofmonth, myrtc.month, myrtc.year);
                            lcd.setCursor(0,0); lcd.print ("            ");
                            VarSel = 0;
                            break;
                          }
                         }
                         break;
                       }
                       case btnNONE:   {
                         lcd.print("Aucun ");
                         break;
                       }
                    }
                }
               }



              -
              Edité par OcinBzh 3 septembre 2018 à 21:58:36

              • Partager sur Facebook
              • Partager sur Twitter

              RTC 1302 + LCD keypad

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown