Sleep mode + DS3231

Buondì.

Sto “studiando” la modalità sleep di Arduino ed il relativo risveglio utilizzando un RTC.
A tal proposito mi sono letto la documentazione di riferimento e analizzato la libreria “DS3231.h” con relativi esempi.

Ero fiducioso di aver compreso il funzionamento, ma evidentemente mi sbagliavo dato che il codice prodotto non funziona (Arduino non si risveglia…).

Qualcuno vede qualche erroraccio in quanto prodotto?

Grazie.

// Collegamenti RTC DS3231 --> Arduino MEGA 2560
// SDA       --> pin 20 
// SLC       --> pin 21
// SQW       --> pin 02

// Inclusione librerie
#include <Wire.h>                                 // Inclusione libreria per comunicazione I2C
#include <DS3231.h>                               // Inclusione libreria per RTC DS3231
#include <avr/sleep.h>                            // Inclusione libresria per modalità "sleep"

// Definizioni varie
#define pinInterrupt 2                            // Pin usato per risvegliare Arduino (interrupt)
                                                  // MEGA --> 2,3,18,19,20,21
                                                  // UNO, PRO MINI --> 2,3
// Istanza di classe per RTC DS3231
DS3231 Clock;                                     

// Variabili per RTC DS3231
byte intervallo = 2;                              // Numero di minuti tra un allarme e l'altro
byte secondi;                                     // Secondi modulo RTC
byte minuti;                                      // Minuti modulo RTC
byte ore;                                         // Ore modulo RTC
byte giorno_mese;                                 // Giorno del mese modulo RTC
byte giorno_sett;                                 // Giorno settimana modulo RTC
byte mese;                                        // Mese modulo RTC
byte anno;                                        // Anno modulo RTC
float TempInt;                                    // Temperatura misurata con RTC
bool Century = false;                             // Variabile per libreria DS3231
bool h12;                                         // Variabile per libreria DS3231
bool PM;                                          // Variabile per libreria DS3231

void setup(){
   
    // Inizializzazione libreria Wire
    Serial.println(F("Inizializzazione libreria Wire..."));
    Wire.begin();

    // Settaggio pin per Interrupt
    pinMode(pinInterrupt,INPUT_PULLUP);
    
    // Inizializzazione RTC e relativi allarmi
    Clock.enableOscillator(true, true, 0);                // Disabilita l'oscillatore dell'RTC
    Clock.turnOffAlarm(1);                                // Disabilita allarme 1
    Clock.turnOffAlarm(2);                                // Disabilita allarme 2
     
    // Lettura RTC
    letturaRTC();

    // Settaggio Allarme RTC (numero "intervallo" minuti dopo ora corrente)
    // Clock.setA2Time(giorno_mese, ore, minuti + intervallo, 0x0, false, false, false);
    Clock.setA1Time(giorno_sett, ore, minuti + intervallo, secondi, 0x0, true, false, false);
   
    // Attivazione allarme 1 con interrupt esterno
    Clock.turnOnAlarm(1);
    // Clock.turnOnAlarm(2);
    
} // Fine setup


void loop(){

  Serial.println(F("Fra 10 secondi dormo..."));
  delay(10000);
  sleep();

} // Fine loop


// Modalità sleep
void sleep(){
  Serial.println(F("Modalità sleep..."));
  delay(1000);
  
  // Abililita modalità sleep
  sleep_enable();

  // Selezione Interrupt numero "0" (pin 2)
  attachInterrupt(digitalPinToInterrupt(pinInterrupt),risveglio,LOW);

  // Seleziona "full sleep"
  set_sleep_mode(SLEEP_MODE_PWR_DOWN);

  // Attiva sleep
  sleep_cpu();

  // Dopo l'esecuzione di "risveglio()" si riprende da qui
  Serial.println(F("Risveglio in corso..."));

  // Settaggio nuovo allarme
  letturaRTC();
  Clock.setA1Time(giorno_sett, ore, minuti + intervallo, secondi, 0x0, true, false, false);
  
} // Fine void sleep


void risveglio(){
  // Disabilità sleep mode
  sleep_disable();

  // Rimuovi gli Interrupt
  detachInterrupt(digitalPinToInterrupt(pinInterrupt));
  
}  // Fine void risveglio

 
// Funzione per leggere i dati da RTC
void letturaRTC(){

    // Recupero i valori da RTC
    secondi = Clock.getSecond();
    minuti = Clock.getMinute();
    ore = Clock.getHour(h12, PM);
    giorno_mese = Clock.getDate();
    giorno_sett = Clock.getDoW();
    mese = Clock.getMonth(Century);
    anno = Clock.getYear();
    TempInt = Clock.getTemperature();
   
}