Pilotare alimentazione DS3231 con allarmi di risveglio

Buona sera,
So come risvegliare il micro con un allarme del DS3231 ma dato che consuma 5mA volevo pilotare l'alimentazione con un PIN digitale di Arduino. Ma se Arduino è addormentato e il DS3231 di conseguenza spento, come fa a risvegliare il micro? Infatti resta in dormienza...ma come posso risolvere ? Se utilizzassi ad esempio il watchdog o un INT per svegliare che senso avrebbe poi mandare allarmi con il DS3231? In che modo quindi posso fare combaciare le due cose: alimentazione pilotata da Arduino e risveglio tramite allarme?

P.S. uso un modulo con il DS3231 e noto che c'è un led Power, potrei dissaldarlo ma se riesco a pilotare l'alimentazione potrebbe tornarmi utile come segnalazione dell'alimentazione

Puoi tagliare l'alimentazione ad DS3231 pilotando un transitor da un pin digitale. L'RTC ha a bordo la sua batteria (solitamente) e quindi all'orario impostato dovrebbe far scattare l'interrupt e risvegliare il micro. Se l'RTC di spegne e smette di funzionare quando togli l'alimentazione la batteria è scarica o qualcosa è rotto.

ciao fabPolli grazie per la risposta.
eseguendo questo codice, imposto l'allarme una volta al minuto, scatterà in particolare al quinto secondo.

#include <DS3232RTC.h>      // https://github.com/JChristensen/DS3232RTC
const byte alimentazioneDS3231 = 6;
void setup()
{
  Serial.begin(115200);
  pinMode(alimentazioneDS3231, OUTPUT);
  digitalWrite(alimentazioneDS3231, HIGH);
  //l'allarme scatta al quinto secondo di ogni minuto
  RTC.setAlarm(ALM1_MATCH_SECONDS, 5, 0, 0, 0);
  RTC.alarmInterrupt (ALARM_1, true);
  RTC.alarmInterrupt (ALARM_2, false);
  RTC.squareWave(SQWAVE_NONE);
  RTC.alarm(ALARM_1);
  attachInterrupt(0, interrupt, RISING);
}
void loop()
{
   RTC.alarm(ALARM_1); //resetto flag allarme
 Serial.println("LOOP.");
  delay(1000);
}
void interrupt()
{
Serial.println("INTERRUPT!");
}

il problema è quando stacco l'alimentazione al DS3231. La batteria tampone però funziona, perchè conta l'ora...non capisco come mai l'SQW non da l'impulso con la batteria tampone

inoltre, se stacco l'alimentazione al DS3231 nel frattempo gira il loop, questo si ferma e si blocca l'intero codice..

E' normale che se gli stacchi l'alimentazione e poi tenti di resettargli l'allarme si blocca tutto.
Secondo me ti conviene separare le due cose e verificare, ovvero elimina quel reset sull'allarme nel loop e magari inizia anche a gestire bene l'interrutpt, ovvero nell'ISR setta una variabile che leggi nel loop per stampare su seriale, non stampare sulla seriale direttamente nell'isr. Quando nel loop trovi la variabile a true stampi e la resetti, se l'RTC ti manda correttamente gli interrupt gli togli l'alimentazione e verifichi che tutto continui a funzionare.
A quel punto sei già a buon punto per capire un eventuale problematica legata all'RTC nel caso in cui non funzionasse bene con la batteria. Se invece funziona non ti resta che mandare in sleep Arduino e controllare che si risvegli in modo corretto.
Qullo che non devi fare e cercare di parlare con l'RTC se non sei sicuro che questo sia alimentato.

Ho modificato il codice:

#include <DS3232RTC.h>      // https://github.com/JChristensen/DS3232RTC
const byte alimentazioneDS3231 = 6;
volatile bool statoInterrupt = false;
void setup()
{
  Serial.begin(115200);
  pinMode(alimentazioneDS3231, OUTPUT);
  digitalWrite(alimentazioneDS3231, HIGH);
  //l'allarme scatta al quinto secondo di ogni minuto
  RTC.setAlarm(ALM1_MATCH_SECONDS, 5, 0, 0, 0);
  RTC.alarmInterrupt (ALARM_1, true);
  RTC.alarmInterrupt (ALARM_2, false);
  RTC.squareWave(SQWAVE_NONE);
  RTC.alarm(ALARM_1);
  attachInterrupt(0, interrupt, RISING);
}
void loop()
{
  if (statoInterrupt == true)
  {
    Serial.println("INTERRUPT!");
    statoInterrupt = false;
  }
  RTC.alarm(ALARM_1); //resetto flag allarme
  Serial.println("LOOP.");
  delay(1000);
}
void interrupt()
{
  statoInterrupt = true;
}

Succede la stessa cosa, con l'alimentazione il ds3231 invia interrupt ad arduino, senza alimentazione si blocca arduino...la batteria non può essere, ho settato ora e data ieri e non ha perso un colpo da quando è spenta

Si blocca perché nel loop hai lasciato la riga che resetta il flag allarme fuori dall'if, e comunque in queta fase devi proprio eliminarla e verificare che ogni 5 secondo del minuto arrivi l'interrupt

Gianky00:
DS3231 ma dato che consuma 5mA

Ma non consuma mica 5mA!
Tu probabilmente hai un modulo e stai misurando il consumo del led.
Se vuoi andare in low power devi toglierlo e anche disabilitare il circuito farlocco per la ricarica della batteria integrata visto che quasi certamente la piccola batteria integrata è non ricaricabile.
In rete trovi un sacco di post in proposito.
La persona che penso ne sappia di più è il tizio che tiene questo blog

Purtroppo il blog è strutturato come una serie di appunti presi con frequenti aggiornamenti messi alla fine e cambi di idea.
Secondo lui la cosa migliore è far funzionare il DS3231 solo dalla batteria tampone.

@Zoomx infatti avevo scritto che utilizzo un modulo :S quindi ho dissaldato il led e la resistenza marcata 201 cosi come segnalato da questa guida ma il consumo si è abbassato da 5,34mA a 1,89mA...è comunque ancora troppo per un sistema stand-alone... :frowning:

@fabpolli, scusami..me l'avevi già detto, quindi ho levato il flag dal loop. Quando alimentato, il DS3231 invia l'interrupt solo la prima volta, proprio perchè il setup viene eseguito una volta, e solo li c'è il reset del flag. Se non lo alimento, nessun interrupt ma gira lo stesso il loop

Secondo quanto scritto qui

nell'Addendum: 2014-10-28
dovrebbe consumare 89uA a 3.3V

Purtroppo il post è pieno di addendum e uno per raccapezzarsi se li deve leggere tutti e ricordarsi cosa c'era scritto prima.

Ma il tizio ha anni di esperienza di datalogger a basso consumo realizzati con Arduino

Bene. link utilissimi sto leggendo tutto, ma a questo punto mi chiedo perché modificare moduli progettati per non avere un risparmio energetico quando esiste il Chronodot V.2.0 che secondo quanto scritto QUI le correnti in gioco sono veramente bassissime..e poi c'è il minimo indispensabile, bisogna saldare le resistenze R1 ed R2 di pull-up su SDA e SCL..ma non è meglio acquistare quindi il Chronodot piuttosto che QUESTI?

Ti stavo per rispondere :Perché quelli costano meno.
Poi ho visto che su Aliexpress ci sono i cloni. Anche tu hai messo un link ad un commento che ha un link di Aliexpress.
Per cui si, i Chronodot sono meglio a parte la forma inusuale. Anche il portabatterie è piccino ma penso si possa sostituire se proprio si vuole.

Penso che il motivo per cui si usa l'altro modulo è perché è molto più diffuso e trovi molti più rivenditori.