Bonsoir,
je rame depuis pas mal de temps pour limiter la conso de mon pro mini 3.3v. Je me suis inspiré du sketch proposé par Fabio Cuomo "wakeup_alarm.ino".
En gros, je souhaite endormir mon arduino à des moments répétitifs donnés. J'utilise pour cela la commande :
tm % interval != 0 où interval prend par exemple la valeur 15 (endormissement toutes les 15 minutes)
Mon sketch ci-dessous endort bien la bête mais le réveil est impossible...Si le programme démarre sur une valeur divise par "interval", ça mesure jusqu'à ce que la condition tm % interval != 0 soit vérifiée. Là le MCU s'endort profondément pour l'éternité.
A noter que le sketch de F. Cuomo fonctionne sans problème (contrôlé sur oscillo).
J'ai besoin de vos conseils.
Merci d'avance.
//sleep-ds32321_301028.ino
#include <Wire.h>
#include <RTClibExtended.h>
#include <LowPower.h>
#define wakePin 2 //utilise l'interruption 0 (broche 2) et lance la fonction wakeUp quand la broche 2 est "LOW"
RTC_DS3231 RTC;
float RTCtempC;
int interval = 2;
int tm;
byte AlarmFlagSleep = 0;
//-------------------------------------------------
void wakeUp() // fonction activant l'interruption
{
}
//------------------------------------------------------------
void setup() {
//Defini la broche 2 comme INPUT pour accepter le signal d'interruption du DS3231
pinMode(wakePin, INPUT);
//Initialise les fonctions
Serial.begin(115200);
Wire.begin();
RTC.begin();
//regle l'heure et la date
RTC.adjust(DateTime(__DATE__, __TIME__));
// supprime toutes les alarmes en attente
RTC.armAlarm(1, false);
RTC.clearAlarm(1);
RTC.alarmInterrupt(1, false);
RTC.armAlarm(2, false);
RTC.clearAlarm(2);
RTC.alarmInterrupt(2, false);
/*active la broche SQW sur OFF, qui connectee
sur la broche 2 du pro mini assurera le reveil*/
RTC.writeSqwPinMode(DS3231_OFF);
/*syntaxe de la commande RTC.setAlarm(alarmType, seconds, minutes, hours, dayOrDate);*/
// donne la date, les heures, minutes et secondes RTC.
RTCtempC = RTC.getTemp();
DateTime now = RTC.now();
RTC.setAlarm( ALM1_MATCH_MINUTES, 0, tm, 0, 0 ); // commande d'alarme
RTC.alarmInterrupt(1, true);
}
void loop() {
DateTime now = RTC.now();
tm = now.minute();
while (tm % interval != 0){ // we enter the sleep mode according to the interval value "tm"
if (AlarmFlagSleep == 0){
attachInterrupt(0, wakeUp, LOW);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); // pro mini enters the sleep mode
detachInterrupt(0); // We detach interrupt
RTC.armAlarm(1, false); // we clear any pending alarms
RTC.clearAlarm(1);
RTC.alarmInterrupt(1, false);
AlarmFlagSleep ++;
}
}
if (tm % interval == 0){ // we measure the temperature of the RTC module
Serial.print("temperature du module RTC:");
Serial.println(RTCtempC);
}
}