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();
}