Partage
  • Partager sur Facebook
  • Partager sur Twitter

Réveiller un Arduino avec une interruption externe

    31 mars 2020 à 17:28:00

    Salut tout le monde, c'est mon premier post, j'espère que vous aller être indulgent :) je suis en train de développer un distributeur de nourriture automatique avec un Arduino Mega2560, un servo-moteur, et une horloge RTC PCF 8563. J'ai fini mon programme tout fonctionne. Cependant j'ai des soucis de consommation d'énergie, j’essaie donc de l'optimiser. J'ai entendu parler d'une librairie qui permet de mettre en veille l'Arduino et de le réveiller grâce à une interruption externe. J'ai donc essayé de mettre en place ce principe de base avant de l'intégrer à mon programme, mais je n'arrive pas à réveiller mon Arduino. Je vous poste mon code. J'ai connecté la broche 3 de mon Arduino a la broche int de mon Horloge, les broches SDA & SCL, ainsi que la masse et le 5V.

    Merci d'avance :) Clément 

    #include <Wire.h>
    #include <Rtc_Pcf8563.h>
    #include <avr/sleep.h>
    
    /* get a real time clock object */
    Rtc_Pcf8563 rtc;
    
    /* a flag for the interrupt */
    volatile int alarm_flag=0;
    
    /* the interrupt service routine */
    
    void blink()
    {
      alarm_flag=1;
    }
    
    void setup()
    {
      pinMode(3, INPUT);           // set pin to input
      digitalWrite(3, HIGH);       // turn on pullup resistors
    
      Serial.begin(9600);
    
      rtc.initClock();
      /* set a time to start with.
       * day, weekday, month, century, year */
      rtc.setDate(14, 6, 3, 0, 10);
      /* hr, min, sec */
      rtc.setTime(1, 15, 55);
      /* set an alarm for 20 secs later...
       * alarm pin goes low when match occurs
       * this triggers the interrupt routine
       * min, hr, day, weekday
       * 99 = no alarm value to be set
       */
      rtc.setAlarm(16, 99, 99, 99);
    }
    
    void loop()
    {
        // Configuration du type de sleep
        set_sleep_mode(SLEEP_MODE_PWR_DOWN);
     
        // Autorisation du mode sleep
        sleep_enable();
         
        // Attachement d'une interruption sur front descendant de INT0
        attachInterrupt(1, blink, FALLING);
     
        // Activation du mode sleep
        sleep_mode();
         
        // CPU en mode sleep,
        // Attente de l'interruption INT0 qui réveillera le CPU
         
        // Désactivation du mode sleep
        sleep_disable();
        
      if (alarm_flag==1)
      {
        clr_alarm();
      }
    
    }
    
    void clr_alarm()
    {
      detachInterrupt(1);
      Serial.print("Alarme!\r\n");
    
      rtc.clearAlarm();
      delay(1000);
      alarm_flag=0;
      attachInterrupt(1, blink, FALLING);
    }



    • Partager sur Facebook
    • Partager sur Twitter
      1 avril 2020 à 13:34:14

      Avant de chercher à utiliser les interruptions, tu devrais vérifier que ton RTC et ton câblage marche.

      Dans un premier temps, je te propose donc de faire une fonction loop qui affiche en permanence l'heure du RTC ainsi que l'état de la pin 3 avec un digitalRead.

      Si l'heure ne bouge pas, c'est que ton RTC ne tourne pas, donc pas étonnant que l'interruption ne marche pas.

      PS: ne manquerait-il pas un appel à Wire.begin() dans la fonction setup de façon à initialiser le bus I2C de l'arduino ?

      -
      Edité par lorrio 1 avril 2020 à 13:36:58

      • Partager sur Facebook
      • Partager sur Twitter
        1 avril 2020 à 16:20:35

        J'ai vérifié mon RTC et mon câblage, tout est fonctionnel. 

        Voici le code utilisé pour le test : 

        #include <Wire.h>
        #include <Rtc_Pcf8563.h>
        #include <avr/sleep.h>
        
        Rtc_Pcf8563 rtc;
        
        /* a flag for the interrupt */
        volatile int alarm_flag=0;
        
        /* the interrupt service routine */
        void blink()
        {
          alarm_flag=1;
        }
        
        void setup()
        {
          pinMode(3, INPUT);           // set pin to input
          digitalWrite(3, HIGH);       // turn on pullup resistors
        
          Serial.begin(9600);
          rtc.initClock();
          /* set a time to start with.
           * day, weekday, month, century, year */
          rtc.setDate(14, 6, 3, 0, 10);
          /* hr, min, sec */
          rtc.setTime(1, 15, 55);
          /* set an alarm for 20 secs later...
           * alarm pin goes low when match occurs
           * this triggers the interrupt routine
           * min, hr, day, weekday
           * 99 = no alarm value to be set
           */
          rtc.setAlarm(16, 99, 99, 99);
        }
        
        void loop()
        {
          attachInterrupt(1, blink, FALLING);
          
          Serial.print(rtc.formatTime());
          Serial.print("  ");
          Serial.print(rtc.formatDate());
          Serial.print("  0x");
          Serial.print(rtc.getStatus2(), HEX);
          Serial.print("\r\n");
          delay(1000);
          
          Serial.println(digitalRead(3));
          
          if (alarm_flag==1)
          {
            clr_alarm();
          }
        
        }
        
        void clr_alarm()
        {
          detachInterrupt(1);
          Serial.print("blink!\r\n");
        
          rtc.clearAlarm();
          delay(1000);
          alarm_flag=0;
          attachInterrupt(1, blink, FALLING);
        }

        Le moniteur série : 

        • Partager sur Facebook
        • Partager sur Twitter

        Réveiller un Arduino avec une interruption externe

        × 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