Buenas.
Tengo una programación básica para probar la alarma del DS3231 y despierte al micro de un modo sleep mediante una interrupción.
He partido de dos modelos básicos anteriores que me funcionan. Uno entra y sale del modo sleep, y otro activa la alarma en el momento programado. El problema es cuando fusiono ambos modelos para hacer una alarma que despierte a Arduino cada 10 minutos. Lo puedo despertar la primera vez, pero no más. Parece como si un bit del micro se queda activo y no se reinicia para permitir de nuevo la interrupción.
Adjunto el código a ver si me podéis ayudar (la respuesta es la misma active o desactive el detachinterrupt). Gracias.
// Date and time functions using a RX8025 RTC connected via I2C and Wire lib
#include <Wire.h>
#include "Sodaq_DS3231.h"
#include "LowPower.h"
char weekDay[][4] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat" };
int pin_int = 2, contador = 0;
//year, month, date, hour, min, sec and week-day(starts from 0 and goes to 6)
//writing any non-existent time-data may interfere with normal operation of the RTC.
//Take care of week-day also.
DateTime dt(2011, 11, 10, 15, 18, 0, 5);
void setup ()
{
pinMode(pin_int, INPUT);
digitalWrite(pin_int, HIGH);
Serial.begin(57600);
Wire.begin();
rtc.begin();
rtc.setDateTime(dt); //Adjust date-time as defined 'dt' above
attachInterrupt(0, INT0_ISR, HIGH);
}
void loop ()
{
if (contador == 60){
contador = 0;
}
else
{
contador = contador + 10;
}
//Enable Interrupt
//rtc.enableInterrupts(EveryMinute); //interrupt at EverySecond, EveryMinute, EveryHour
//or this
rtc.enableInterrupts(15,18,contador); // interrupt at (h,m,s)
DateTime now = rtc.now(); //get the current date-time
Serial.print(now.year(),DEC);
Serial.print('/');
Serial.print(now.month(),DEC);
Serial.print('/');
Serial.print(now.date(),DEC);
Serial.print(' ');
Serial.print(now.hour(),DEC);
Serial.print(':');
Serial.print(now.minute(),DEC);
Serial.print(':');
Serial.print(now.second(),DEC);
Serial.println();
delay(1000);
LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF);
// Disable external pin interrupt on wake up pin.
// detachInterrupt(0); //El cero se refiere al número de la interrupción
delay(1000);
}
//Interrupt service routine for external interrupt on INT0 pin conntected to /INT
void INT0_ISR()
{
//Keep this as short as possible. Possibly avoid using function calls
Serial.println("Despierto");
delay(1000);
}