Ciao
, 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... ![]()
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