Partage
  • Partager sur Facebook
  • Partager sur Twitter

format date et heure

Sujet résolu
    2 septembre 2018 à 23:50:22

    bonjour,

    je voudrai que la date sur ma lcd s'affiche au format suivant "ddd dd/mm/yy" - exemple: Lun 03/09/18

    j'ai beau chercher je ne trouve pas la solution

    pour le moment j'utilise le code suivant

    lcd.setCursor(0,0);
     myrtc.updateTime();
     sprintf(stringa,"%02d %02d/%02d/%02d", myrtc.dayofweek, myrtc.dayofmonth, myrtc.month, myrtc.year);
     lcd.print(stringa);

    s'il vous plaît

    merci

    • Partager sur Facebook
    • Partager sur Twitter
      3 septembre 2018 à 10:16:35

      Est ce que tu utilises une RTC genre DS1307 ou DS3231?

      Si oui, le format est BCD. Il faut faire un tableau pour les correspondances.

      Ex : la date (lundi, mardi ...) est un registre qui compte de 1 à 7.

      • Partager sur Facebook
      • Partager sur Twitter
      Le 25 juillet 2016, j'ai essayé une Ford Mustang.
        3 septembre 2018 à 17:44:55

        Pour ce qui est du jour, un petit tableau de chaine s'impose.

        Exemple:

        char *daystrings[] = {
            "---",
            "Dim",
            "Lun",
            "Mar",
            "Mer",
            "Jeu",
            "Ven",
            "Sam",
        };
        
        sprintf(stringa,"%s", daystrings[myrtc.dayofweek]);
        Serial.print();

        Tu noteras que le premier indexe est "---" dans le cas où les dayofweek commenceraient à 1.

        Si jamais ton RTC renvoie une valeur dayofweek entre 0 et 6, il faudra supprimer ce "---".

        Ensuite, tu devras peut-être revoir l'ordre des jours car ton RTC ne commence pas forcément à Dimanche.

        * * *

        Ce serait bien que tu nous dises quelle lib RTC tu utilises afin que l'on puisse t'en dire plus ;)

        • Partager sur Facebook
        • Partager sur Twitter
          3 septembre 2018 à 20:39:34

          La DS1307 et la DS3231 comptent de 1 à 7 et c'est l'utilisateur qui définit quel jour porte quel N°. Pour moi, 1 c'est lundi.
          • Partager sur Facebook
          • Partager sur Twitter
          Le 25 juillet 2016, j'ai essayé une Ford Mustang.
            3 septembre 2018 à 22:05:08

            bonsoir,

            merci pour vos réponses et notamment lorrio

            via ce code ca fonctionne:

            myrtc.updateTime();
            static const char* dayStrings[] = { "Sun", "Mon", "Tues", "Wed", "Thur", "Fri", "Sat" };
            sprintf(stringa,"%s %02d/%02d/%02d", dayStrings[myrtc.dayofweek], myrtc.dayofmonth, myrtc.month, myrtc.year);

            et apparemment je n'ai pas besoin des "---" (mon module RTC est un RTC1302 et j'utilise #include <virtuabotixRTC.h>)


            me reste à afficher l'année en 2 chiffres! une idée?

            autre question purement électronique cette fois, peut-on ralentir le module RTC via un montage électronique spécifique? je règle en partie le problème en retardant via mon code ma RTC de 3'' chaque heure mais bon ce n'est pas top,

            merci pour l'aide apportée !!

            -
            Edité par OcinBzh 3 septembre 2018 à 22:21:29

            • Partager sur Facebook
            • Partager sur Twitter
              4 septembre 2018 à 8:13:14

              Si tu as une valeur d'année sur 4 digits, du genre 2018, alors le plus simple et le plus intuitif serait de soustraire 2000 pour n'avoir que 18 restant.

              Exemple: sprintf(stringa,"annee: %02d", (myrtc.year-2000));

              Cependant, lors du passage en l'an 20100 (ce qui n'est pas pour tout de suite), alors ton RTC affichera 01/01/100, ce qui n'est pas très logique.

              Une autre solution serait donc d'utiliser le reste te la division euclidienne (modulo), a l'opérateur %

              Exemple: sprintf(stringa,"annee: %02d", (myrtc.year%100));

              * * *

              Pour ce qui est du retard, avoir un décalage de 3" toutes les heures est énorme, ce n'est pas normal !

              Un quartz de 20ppm (très classique comme quartz) a une dérive maxi 2 minutes par mois, et donc 0.072" par heures.

              Les condensateurs qu'il y a sur le montage à coté du quartz ne sont probablement pas adaptés ;)

              -
              Edité par lorrio 4 septembre 2018 à 8:16:35

              • Partager sur Facebook
              • Partager sur Twitter
                4 septembre 2018 à 11:40:23

                Je me répète, mais la DS3231 est beaucoup plus précise. Le quartz est intégré.

                • Partager sur Facebook
                • Partager sur Twitter
                Le 25 juillet 2016, j'ai essayé une Ford Mustang.
                  4 septembre 2018 à 21:15:40

                  Bonjour

                  merci beaucoup Lorrio pour ta réponse qui m'a permis d'afficher l'année sur 2 chiffres

                  concernant le décalage, sans la pile le décalage n'est plus présent - cela signifie quoi selon vous (à part de la changer :-))

                  merci

                  • Partager sur Facebook
                  • Partager sur Twitter
                    5 septembre 2018 à 22:02:09

                    Bonsoir,

                    toujours en réflexion avec mon projet d'affichage, je voudrai modifier mon affichage lorsque j'appuie sur select (j'ai la solution pour cela)

                    ce que je ne sais pas faire c'est revenir au premier écran automatiquement au bout de 30'' si aucun bouton n'a pas utilisé

                    mon montage utilise une arduino méga + lcd KeyPad + RTC DS1302

                    je pensai créer une variable qui s'incrémente d'1'' chaque seconde mais je ne vois pas comment écrire cela en C#

                    finalement j'ai la solution

                    création d'une variable int CptRebours = 0;

                    dans void septup

                    si appui sur select alors CptRebours = 6000;

                    CptRebours--;

                    if CptRebours ==0 alors afficher données écran1;

                    -
                    Edité par OcinBzh 5 septembre 2018 à 22:33:26

                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 septembre 2018 à 8:23:56

                      Pour déclencher des actions, tu peux te baser sur millis qui renvoie le nombre de millis seconde écoulé depuis le lancement du programme.

                      Pour cela, on a :

                      // Init, tempo inactive
                      unsigned long tempo = 0;
                      
                      // Si appui sur SELECT, lancement de la tempo
                      if ( digitalRead(select) == LOW ) {
                          tempo = millis();
                      }
                      
                      // Si tempo active
                      if ( tempo != 0 ) {
                          // Et si tempo écoulée
                          if ( ( millis() - tempo ) >= 30000 ) {
                              // Alors retour écran 1
                              ...
                          }
                      }



                      • Partager sur Facebook
                      • Partager sur Twitter
                        6 septembre 2018 à 21:56:47

                        Bonsoir lorrio

                        merci pour ce bout de code - cela fonctionne très bien,

                        je souhaite afficher en temps réel les valeur de mon DTH22 à l'écran

                        pour cela je dois placer 1 delay(1000); sinon les valeurs = Err#,

                        ce delay(1000); me pose un pb lors de l'appui sur Select du LCD KeyPad

                        y aurait-il une solution pour contourner ce delay(1000) svp

                        // affichage écran princ DHT
                          lcd.setCursor(9,0); lcd.print("T:");
                          lcd.setCursor(9,1); lcd.print("H:");
                          float temperature = 0;
                          float humidity = 0;
                          int err = SimpleDHTErrSuccess;
                          if ((err = dht22.read2(&temperature, &humidity, NULL)) != SimpleDHTErrSuccess) {
                               lcd.setCursor(9,0); lcd.print("T: Err#");
                               lcd.setCursor(9,1); lcd.print("H: Err#");
                               return;
                          }
                          lcd.setCursor(11,0); lcd.print((float)temperature);
                          lcd.setCursor(11,1); lcd.print((float)humidity);
                          delay(1000);
                        d'avance merci

                        -
                        Edité par OcinBzh 6 septembre 2018 à 23:30:40

                        • Partager sur Facebook
                        • Partager sur Twitter
                          7 septembre 2018 à 9:03:23

                          Là encore, tu peux utiliser une temporisation avec millis.

                          Pour que l'action se répète indéfiniment, il te suffit de la relancer dans le if de temporisation.

                          // Dans l'espace global :
                          //========================
                          
                          // Temporisation affichage
                          unsigned long tempoAff = 0;
                          
                          
                          // Dans le loop :
                          //================
                          
                          // Si temporisation écoulée
                          if ( ( millis() - tempoAff ) >= 1000 )
                          
                              // On relance tout de suite la temporisation
                              tempoAff = millis();
                          
                              // Et on affiche quelque chose
                              Serial.print("Hello !");
                          
                          }

                          Tu verras que ce programme affiche Hello! toutes les secondes.

                          Libre à toi de te créer autant de variable de temporisation que tu veux pour toutes tes actions.

                          * * *

                          Par contre, je tiens à te prévenir que la base de temps millis de l'arduino n'est pas aussi précise qu'un RTC.

                          Donc quand tu demandes une tempo de 1000ms, tu n'as pas forcément exactement 1000ms.

                          Le mieux serait de lire ton RTC plusieurs fois par secondes (toutes les 100ms par exemple), et rafraichir l'affichage si la valeur du RTC a changée depuis la dernière lecture.



                          • Partager sur Facebook
                          • Partager sur Twitter

                          format date et heure

                          × 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