Partage
  • Partager sur Facebook
  • Partager sur Twitter

problème lors du réveil d'une arduino avec un RTC

sortir une arduino de veille avec un DS3231

Sujet résolu
    27 août 2021 à 19:43:15

    Bonjour et merci de l'attention que vous portez à mon cas.

    Je fais face à un problème qui me colle depuis plusieurs semaines et dont je n'arrive malheureusement pas à me débarrasser...

    En effet je souhaite mettre mon arduino (mega mais j'ai également testé sur une UNO) en veille (profonde); et j'ai déjà réussi cela auparavant avec un écran tactile, sans rencontrer aucun soucis.

    Or alors que j'essaye d'adapter le procédé afin qu'il fasse de même avec mon module d'horloge (DS3231), je n'y arrive plus !

    voici la démarche dans le code joint qui illustre le cas:

          je crée une alarme, je place l'arduino en mode veille et lui dit d'attendre que la tension devienne nulle au PIN dédié (car en temps normal le module maintiendra une tension de 5 volts, et à l'instant où l'alarme se déclenchera, cette même tension chutera jusqu'à ce que l'arduino désactive l'alarme en question auprès du module). Puis l'arduino doit alors se réveiller, et dans l'exemple ci-contre simplement transmettre un message.

    Or au cours de mes tests je suis parvenu à vérifier que l'alarme était bien crée, prise en compte, j'ai mesuré les tensions lors de l'activation de l'alarme par le module (je confirme que la tension chute bien lorsque l'alarme est déclenchée) et enfin le moment où l'arduino écrit "re" avant de s’arrêter correspond bien. Ainsi j'en viens a croire que le problème survient après le réveil...

    (de plus j'ai du ajouter un temps d'attente avant la mise en veille car, je ne peux pas l'expliquer mais, sinon le programme crashait avant même d'arriver à l’exécution de la mise en veille (passage qui n'avait aucun rapport avec la mise en veille cependant...))

    En espérant que vous puissiez m'aider...  ^^

    (voici les liens vers les bibliothèques que j'utilise pour :

      - le module DS3231 : https://github.com/NorthernWidget/DS3231

      - la mise en veille : https://github.com/rocketscream/Low-Power/blob/master/LowPower.cpp )

    #include <LowPower.h>
    #include <Wire.h>
    #include <DS3231.h>
    
    const int wakeUpPin = 3;
    
    DS3231 Clock;
    
    void setup() {
      Wire.begin();
      Serial.begin(9600);
      pinMode(3, INPUT);
      
      
      Clock.setA1Time(1, 0, 1, 0, 00000, false, false, false);  
      Clock.turnOnAlarm(1);
      //je crée une alarme auprès du module
      
      if (Clock.checkAlarmEnabled(1)) {
        Serial.println("enabled"); // verifie que l'alarme 1 est bien activée
      }
      //le module dit bien avoir pris l'alarme en compte
      
      Serial.println("mise en veille");
      
      delay(1000);  
      //j'ai rajouté cette attente car autrement cela crashait... (bien que je ne sache pas ce qu'elle fait concrètement pour l'éviter...)
      
      ShutDown ();
      
      Serial.println("retour");
      // et donc alors que le moniteur devrait afficher "retour", il n'écrit que "re" (mais en soit il doit donc bien sortir de veille... ?)
      // de plus lors de mes test afin de résoudre ce problème, le programme se trouvant dans la boucle loop() ne s'éxécutait pas
    }
    
    
    
    void loop() {
      
    }
    
    
    void WakeUp () {
      
    }
    void ShutDown () {
      attachInterrupt(digitalPinToInterrupt(3), WakeUp, LOW);
      LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); 
      detachInterrupt(3);
    }



    • Partager sur Facebook
    • Partager sur Twitter
      31 août 2021 à 13:57:38

      Mettre une interruption sur état LOW ne me parait pas une très bonne idée, car tu arduino va entrée en interruption en boucle temps que la pin reste à 0V.

      Tu ferais mieux de faire un attachInterrupt sur FALLING plutôt que LOW, de façon à ce que ton arduino ne fasse la fonction WakeUp qu'une seule fois.

      Sinon, il se pourrait très bien que ton arduino retourne exécuter la fonction WakeUp une seconde fois, puis troisième fois et ainsi de suite, avant même d'avoir eu le temps d'aller exécuté la fonction detachInterrupt.

      Ou alors, il faudrait faire le detachInterrupt dans la fonction WakeUp.

      Il y a aussi le fait que tu oublies de faire un digitalPinToInterrupt pour ton detachInterrupt, ce qui va désactiver l'interruption n°3, qui n'est pas forcément celle associée à la pin 3 de l'arduino.

      Au final, ton arduino garde l'interruption activé, et ne fait plus rien d'autre que d'entrée dedans en boucle, ce qui ne lui laisse même plus le temps de s'occuper du Serial.

      • Partager sur Facebook
      • Partager sur Twitter
        1 septembre 2021 à 12:30:30

        Merci beaucoup,

        cela marche parfaitement maintenant :).

        Bonne journée et désolé du dérangement (le problème pouvait paraître bête mais bon quand on coince, on coince... ^^)

        • Partager sur Facebook
        • Partager sur Twitter

        problème lors du réveil d'une arduino avec un RTC

        × 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