[MKR WAN 1310 + DS3231] Wake-up da RTC non funziona in deep sleep (LowPower.deepSleep)

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

Si prega di utilizzare la lingua inglese nelle sezioni inglesi del forum. Argomento spostato nella sezione italiana del forum.

@tommynfinity

Buongiorno e benvenuto nella sezione Italiana del forum,

:warning: prima di tutto ti segnalo che, nella sezione in lingua Inglese, si può scrivere SOLO in Inglese ... quindi, per favore, la prossima volta presta più attenzione in quale sezione metti i tuoi post; questa volta esso è stato spostato, da un moderatore della sezione di lingua Inglese, nella sezione di lingua Italiana ... la prossima volta potrebbe venire direttamente eliminato, dopo di che ...

... cortesemente, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15) e poi, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

P.P.S.: Evitate di utilizzare la traduzione automatica fatta dal browser ... vi impedisce di capire la lingua della sezione dove andate a scrivere ...