DS3231 : comprendre la relation interruption/alarm

Bonjour à tous,
je suis philippe, habitant bordeaux; je developpe depuis peu une solution de petits capteurs connectés. Je pense utiliser des pro mini 3v3 8Mhz modifié, un ds3231, un module rf genre RF24L01 et un maxsonar: recherche de low power avec la librairie LowPower.h.
Je souhaite pouvoir endormir l’ensemble tous les jours de 1h à 6h par exemple. Il y a 2 alarmes sur le ds3231; J’ai lu quelques codes illustrant l’usage de ces 2 alarmes, examples pour les fixer:

void setAlarms() {
   
 // Set AlarmBits, ALRM2 first, followed by ALRM1
     int AlarmBits = ALRM2_SET;
     AlarmBits <<= 4;
     AlarmBits |= ALRM1_SET;
     
  // set both alarms to :00 and :30 seconds, every minute
     // Format: .setA*Time(DoW|Date, Hour, Minute, Second, 0x0, DoW|Date, 12h|24h, am|pm)
     //                    |                                    |         |        |
     //                    |                                    |         |        +--> when set for 12h time, true for pm, false for am
     //                    |                                    |         +--> true if setting time based on 12 hour, false if based on 24 hour
     //                    |                                    +--> true if you're setting DoW, false for absolute date
     //                    +--> INTEGER representing day of the week, 1 to 7 (Monday to Sunday)
     //
     Clock.setA1Time(Clock.getDoW(), Clock.getHour(h12, PM), Clock.getMinute(), 30, AlarmBits, true, false, false);
     Clock.setA2Time(Clock.getDate(), Clock.getHour(h12, PM), Clock.getMinute(), AlarmBits, false, false, false);
     // Turn alarms on
     Clock.turnOnAlarm(1);
     Clock.turnOnAlarm(2);
}

Ce que je ne comprends pas c’est comment, par quelle moyen, il y a une relation entre ces 2 alarmes et le sommeil ou le reveil, ou tout autre action ?
Je pense que la question est assez stupide, mais ne trouvant pour l’instant rien pour comprendre, je vous sollicite pour savoir si quelqu’un pourrait m’éclairer.

Philippe.

Bonsoir,
merci pour votre réponse, elle m’a aidé à avancer.
Il y a de nombreuses librairies DS3231.h; à partir d’une, j’ai créé une alarme, genre un signal toutes les minutes; j’ai connecté la broche SQW du DS3231 au pin 2 digital. J’ai testé pas mal de code, du genre:

#include <avr/sleep.h>
#include <avr/power.h>
#include <Wire.h>
#include <DS3231.h>

void setup() {
  attachInterrupt(0, INT0_ISR, LOW); //Only LOW level interrupt can wake up from PWR_DOWN
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);
}

void loop() {
  sleep();
}

void sleep(){
    //\/\/\/\/\/\/\/\/\/\/\/\/Sleep Mode and Power Down routines\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
            
    //Power Down routines
    cli(); 
    sleep_enable();      // Set sleep enable bit
    sleep_bod_disable(); // Disable brown out detection during sleep. Saves more power
    sei();
        
    Serial.println("\nSleeping");
    delay(10);            //This delay is required to allow print to complete
                          //Shut down all peripherals like ADC before sleep. Refer Atmega328 manual
    power_all_disable();  //This shuts down ADC, TWI, SPI, Timers and USART
    sleep_cpu();          // Sleep the CPU as per the mode set earlier(power down)  
    sleep_disable();      // Wakes up sleep and clears enable bit. Before this ISR would have executed
    power_all_enable();   //This shuts enables ADC, TWI, SPI, Timers and USART
    delay(10);            //This delay is required to allow CPU to stabilize
    Serial.println("Awake from sleep");    
    
    //\/\/\/\/\/\/\/\/\/\/\/\/Sleep Mode and Power Saver routines\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
}

//Interrupt service routine for external interrupt on INT0 pin conntected to DS3231 /INT
void INT0_ISR()
{
  //Keep this as short as possible. Possibly avoid using function calls
   detachInterrupt(0); 
   Serial.println("INT0_ISR"); 
}

En synthèse, je ne comprends pas ou pas bien sur :

  • Setup fixe l’interruption: 0 pour le pin 2, la fct INT0_ISR, Low pour le signal
  • Loop lance, sleep qui endort quasi tout, et reste “figé/endormi” entre la ligne sleep_cpu(); et sleep_disable();
  • Quand une alarme du DS3231 est émise sur le pin 2, INT0_ISR est exécutée, soit 1) detachInterrupt et finalement la reprise du code où il s’etait arrêtè soit sleep_disable();.
    Ce que du reste, si j’ai bien compris,… je ne comprends pas bien. Pourquoi le detachInterrupt, implique la reprise du code ou le controleur c’etait arrêté ?

Est ce bien cela ?
Car pour l’instant un terminal ne montre qu’une feuille blanche ?

Merci sincèrement pour ton soutien.
Philippe.