Salve a tutti
sto lavorando con una Arduino MKR WAN 1310 (SAMD21) e un RTC DS3231 per realizzare un sistema a basso consumo.
Il mio obiettivo è far entrare la scheda in deep sleep e risvegliarla tramite l’interrupt del DS3231 (pin SQW/INT).
Il segnale di interrupt arriva (verificato all’oscilloscopio, fronte LOW), ma la MKR1310 non si risveglia mai dal LowPower.deepSleep().
Ho messo anche una pull-up da 10 kΩ a 3.3 V su SQW, provato vari pin (D0, D4…), ma niente da fare.
Sotto trovate il codice
#include <Wire.h>
#include <RTClib.h>
#include <ArduinoLowPower.h>
#define RTC_INT_PIN 4
RTC_DS3231 rtc;
volatile bool wokeUp = false;
void alarmISR() {
wokeUp = true;
}
void setup() {
Serial.begin(115200);
while (!Serial);
Serial.println("=== MKR1310 + DS3231: DeepSleep Wake Test ===");
if (!rtc.begin()) {
Serial.println("Errore: RTC non trovato!");
while (1);
}
if (rtc.lostPower()) {
Serial.println("RTC ha perso alimentazione, imposto ora corrente...");
rtc.adjust(DateTime(F(__DATE__), F(__TIME__)));
}
rtc.writeSqwPinMode(DS3231_OFF);
rtc.clearAlarm(1);
rtc.clearAlarm(2);
pinMode(RTC_INT_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(RTC_INT_PIN), alarmISR, FALLING);
LowPower.attachInterruptWakeup(RTC_INT_PIN, alarmISR, FALLING);
Serial.println("Setup completato, imposto primo allarme tra 15 secondi...");
delay(500);
setNextAlarm(15);
}
void setNextAlarm(uint32_t secondsFromNow) {
DateTime now = rtc.now();
DateTime alarmTime = now + TimeSpan(secondsFromNow);
rtc.clearAlarm(1);
rtc.clearAlarm(2);
rtc.writeSqwPinMode(DS3231_OFF);
rtc.setAlarm1(alarmTime, DS3231_A1_Date);
Serial.print("Allarme impostato per ");
Serial.print(alarmTime.hour());
Serial.print(":");
Serial.print(alarmTime.minute());
Serial.print(":");
Serial.print(alarmTime.second());
Serial.println();
}
void loop() {
wokeUp = false;
Serial.println(" Entro in deep sleep...");
delay(50);
// --- Qui non si risveglia mai ---
LowPower.deepSleep();
Serial.println(" Risveglio dal DS3231!");
if (wokeUp && rtc.alarmFired(1)) {
Serial.println(" Allarme RTC attivo!");
rtc.clearAlarm(1);
} else {
Serial.println(" Sveglia ma nessun allarme (forse rimbalzo).");
}
setNextAlarm(15);
}