Hola compañeros, me gustaría plantearos un error que llevo días tratando de solventar por si alguien me pudiera ayudar. Estoy trabajando en una aplicación que consiste en enviar valores de sensores de humedad de suelo y de un caudalímetro de agua (con emisor de pulsos) con un Arduino MKR. Para reducir el consumo del Arduino MKR (en este caso uso el MKR1200 FOX) quiero usar la librería ArduinoLowPower.
En los ejemplos de esta librería hay uno que controla el periodo en reposo mediante tiempo (TimedWakeUp) y otro que controla el periodo en reposo mediante interrupciones externas (ExternalWakeUp). He intentado hacer una combinación de ambas ya que quiero dejar el MKR continuamente durmiendo pero que sea capaz de almacenar los pulsos del contador (interrupción externa) y que se despierte cada 15 minutos (interrupción por tiempo) para enviar el mensaje. El código que estoy trabajando es el siguiente:
#include "ArduinoLowPower.h"
const int intPin = 8; //interrupt pin
volatile int ISRCounter = 0; //Variable for counting pulses (interruptions)
int counter = 0; //Variable for counting pulses (interruptions)
unsigned long time1 = 0;
unsigned long time2 = 0;
unsigned long remainingTime = 0;
unsigned long period = 10000; //period of time between messages sent (ms)
void setup() {
Serial.begin(9600);
pinMode(intPin, INPUT);
pinMode(LED_BUILTIN, OUTPUT); // The LED on the MKR board is initialised.
time1 = millis();
LowPower.attachInterruptWakeup(digitalPinToInterrupt(intPin), debounceCount, FALLING);
}
void loop() {
time2=millis();
if(time2 < (time1+period)){ //If the stipulated period has not been exceeded, the if-sentence is carried out:
remainingTime=period-time2; //The time remaining to complete the period between sendings is calculated.
} else { //If the stipulated period between sendings has been exceeded, make the sentence else:
//-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-. message sending function -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.
if (counter != ISRCounter) {
counter = ISRCounter;
for (int i = 0; i < counter; i++) { //The LED will flash as many times as the number of pulses it has received.
digitalWrite(LED_BUILTIN, HIGH);
delay(500);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
}
}else { //The LED will flash for 2 seconds if no pulse has been received.
digitalWrite(LED_BUILTIN, HIGH);
delay(2000);
digitalWrite(LED_BUILTIN, LOW);
delay(500);
}
counter = 0;
ISRCounter=0;
time1 = millis();
remainingTime=period;
}
LowPower.sleep(remainingTime);
}
void debounceCount()
{
ISRCounter++;
}
Creo que el problema está en que cuando el Arduino entra en reposo no realiza la función millis(). ¿Alguien sabría orientarme para continuar en esta línea? En este caso en vez de enviar un mensaje ilumino el led de la placa tantas veces como pulsos reciba o bien lo ilumina de forma continuada durante dos segundos si durante el periodo estipulado no ha recibido pulsos. El periodo entre envíos lo he reducido a 10 segundos para hacer las pruebas.
Un saludo y gracias de antemano.