Hi everybody,
in order to reduce the power as much as possible, I'm trying to wake up my Elegoo Mega every 15 minutes.
I'm using a DS3231 and I started from this sketch to try to understand how I can configure everything for my requirements.
Using this sketch I'm able to send the Arduino to sleep but it's not awakened.
Are there any differences about this aspect between Arduino Uno e and Mega?
I tried also using wakeup pin 2 and 18 (as I reed searching on the web)
#include <Wire.h> //libreria wire, presente di default nell'IDE
#include <DS3231.h> // Libreria ds3231, https://github.com/jarzebski/Arduino-DS3231
#include <avr/sleep.h> // libreria avr/sleep, presente di default nell'IDE
DS3231 clock;
RTCDateTime dt;
const byte wakePin = 18; // Porta per il segnale di risveglio - pin used for alarm clock (interrupt 0)
byte temp_buffer = 0b11110111; // configurazione del byte che disabilita il pin SQW sul modulo DS3231.
// Sembra inutile, ma senza di questo arduino non si addormenta. Byte to disable SQW pin
// of DS3231, not logical yes, but without that the Arduino doesn't go to sleep mode even the first time
char print_date[16]; // zona di memorizzazione data ed ora fornita da ds3231 - repository actual time from ds3231
//
//
// ****** routine di modifica del byte di controllo DS3231 - Set DS3121 SQW control bytes
//
void modificabyte (byte control, bool which) // Set DS3121 RTC control bytes
{
Wire.beginTransmission(0x68);
if (which) // which=false -> 0x0e, true->0x0f.
Wire.write(0x0f);
else
Wire.write(0x0e);
Wire.write(control);
Wire.endTransmission();
}
//
//
// ****** routine di sveglia, attivata dall'interrupt (su allarme DS3231) - wake routine, activated on interrupt from ds3231
//
void svegliatiora()
{
sleep_disable(); // disabilita la modalita' sleep (sveglia il sistema)
}
//
//
// **** routine di "addormentamento" - sleep routine
//
void dormiora()
{
Serial.print("dormo - sleep.... ");
dt = clock.getDateTime(); // chiede l'ora dall'orologio digitale DS3231 - get time form DS3231
sprintf(print_date, "%02d/%02d/%d %02d:%02d:%02d", dt.day, dt.month, dt.year, dt.hour, dt.minute, dt.second);
Serial.println(print_date); // visualizza sul monitor seriale il momento dell'addormentamento - display sleeping time on serial monitor
sleep_enable(); // abilita l'addormentamento del sistema
delay(100);
digitalWrite (LED_BUILTIN, LOW); // spegne il led 4, per segnalare che il sistema e' dormiente
set_sleep_mode(SLEEP_MODE_PWR_DOWN); // Seleziona la modalita' "power down", che massimizza
// il risparmio di energia - Select "power down mode" to maximize energy saving
cli(); // disabilita l'interrupt - disable interrupts
//sleep_bod_disable(); // disabilita il controllo interno di alimentazione (brown out detection)
sei(); // riabilita l'interrupt - enable interrupts
sleep_cpu(); // "addormenta" la cpu - sleep mode on cpu
//
/* questo e' il punto in cui Arduino riprende a lavorare, subito dopo la routine svegliatiora - arduino wake up here */
//
clock.clearAlarm1(); // elimina l'allarme (per evitare ulteriori indesiderati interrupt)
Serial.print("sveglio - working.. ");
dt = clock.getDateTime(); // chiede l'ora dall'orologio digitale DS3231 - get time form DS3231
sprintf(print_date, "%02d/%02d/%d %02d:%02d:%02d", dt.day, dt.month, dt.year, dt.hour, dt.minute, dt.second);
Serial.println(print_date); // visualizza sul monitor seriale il momento della sveglia - display wake time on serial monitor
}
//
//
void setup()
{
Serial.begin(9600);
clock.begin();
modificabyte(temp_buffer, 0);
clock.armAlarm1(false);
clock.armAlarm2(false);
clock.clearAlarm1();
clock.clearAlarm2();
pinMode (LED_BUILTIN, OUTPUT); // alla porta 4 e' collegato il led che segnala lo dtato di "sveglio"
pinMode(wakePin, INPUT); // la porta 2 riceve l'allarme da DS3232 - pin 2 for alarm signal from ds3232
attachInterrupt(0, svegliatiora, FALLING); // attiva la gestione dell'interrupts - enable intrrupts
//clock.setDateTime(2022, 3, 27, 15, 15, 45); // inizializza l'orologio con data ed ora prefissata,
// utile al solo fine del test. In caso di uso effettivo l'orologio deve essere inzializzato
// una sola volta, con data ed ora effettiva - initializes ds3231 with a dummy date and hour.
}
//
//
void loop()
{
// setAlarm2(Date or Day, Hour, Minute, Mode, Armed = true)
clock.setAlarm2(0, 0, 1, DS3231_MATCH_M);
//clock.setAlarm1(0, 0, 0, 10, DS3231_MATCH_S); // attiva la sveglia al 10 secondo di ogni minuto - set alarm
// on the tenth second of every minute
delay (100);
dormiora(); // richiama la routine di addormentamento - call sleep routine
//
// **** punto in cui il sistema rientra nella sezione di loop dopo il risveglio - arduino start working here after woke
//
digitalWrite (LED_BUILTIN, HIGH); // segnala lo stato di "sveglio" - woke status signal
delay (5000); // rimane sveglio per 5 secondi - arduino remain active for 5 seconds
Serial.println("Sveglio!");
}
Please note that I'm not the author of this sketch!