Problema con interrupt per wake up Arduino

Ciao :slight_smile: , forse in questi giorni sto rompendo un pò le scatole con le molte domande che sto facendo sul forum, però quando dopo tanti tentativi ci si blocca e internet non aiuta... :confused:

Utilizzando le librerie <avr/sleep.h> <avr/power.h> sono stato in grado di realizzare lo spegnimento SLEEP_MODE_PWR_DOWN su un Arduino, a cui è collegato un DS3231 che tramite la libreria DS3232RTC manda un falling (ovvero va da alto a basso) sul pin di interrupt.

L'altro Arduino che sto usando ha delle periferiche differenti, ma di base vorrei che andasse in SLEEP_MODE_IDLE con la stessa idea di base.. quindi nulla di più semplice (pensavo):

#include <DS3232RTC.h>
#include <Wire.h>
#define INT_PIN 2
.
.
... SETUP...
.
.
  setSyncProvider(RTC.get);
  pinMode(INT_PIN, INPUT_PULLUP);
  RTC.alarm(ALARM_1);
  RTC.alarm(ALARM_2);
  RTC.alarmInterrupt(ALARM_1, false);
  RTC.alarmInterrupt(ALARM_2, false);
  RTC.squareWave(SQWAVE_NONE);

Qui infatti inizializzo il mio RTC e imposto la resistenza di pull-up interna al pin D2 dove vorrei ricevere l'interrupt (non ho altro collegato a D2). Disattivo gli allarmi del RTC.

Gli allarmi saranno riattivati nel loop prima della chiamata alla funzione dormi() che è la seguente:

void dormi(){
  attachInterrupt(digitalPinToInterrupt(INT_PIN), disabilita, FALLING);
  set_sleep_mode(SLEEP_MODE_IDLE);
  sleep_enable();
  sleep_mode();
  /* Ripresa da questo punto */
  sleep_disable();
}

void disabilita(){
  detachInterrupt(digitalPinToInterrupt(INT_PIN));
}

Quello che succede, verificato con una Serial.print(), è che al pin D2 viene continuamente ricevuto l'interrupt, ma ancora più strano è che lo riceve anche in assenza del pin SQW del RTC che dovrebbe invece generarlo!
Pensando che potesse essere dovuto a disturbi ho collegato D2 con una pull-down da 10k (quindi togliendo INPUT_PULLUP) ma continua a fare così :o

Non so se il silenzio riguardante questo post sia dovuto alle festività oppure al fatto che sia mal posta la mia domanda (però penso sia dovuto più per la prima :grinning: )..

Scrivo per aggiornarvi, ovvero in un altro Arduino Nano (sì, sto usando modello questo e non lo avevo specificato) l'interrupt funziona bene finché non gli carico il codice incriminato e lo monto sulla breadboard (incriminata?): e qui continua a presentarsi il problema (ciò esclude malfunzionamenti dell'altro Nano).

Quello che vi chiedo è se il problema sia da ricercarsi nel codice o nei collegamenti (i quali però mi sembrano corretti).

Credo, anzi spero di aver risolto!

Dopo decine e decine di tentativi ho notato che scrivendo

set_sleep_mode(SLEEP_MODE_PWR_DOWN);

invece di

set_sleep_mode(SLEEP_MODE_IDLE);

non produce più il problema!!! :fearful:

A questo punto mi piacerebbe scoprire anche il perché ed eventualmente se stessi sbagliando ad utilizzare la modalità IDLE..