Error con libreria ArduinoLowPower.h

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.

Esto no está bien

if(time2 < (time1+period)){                      //If the stipulated period has not been exceeded, the if-sentence is carried out:

Lo correcto es

if(time2 - time1 < period) {

No entiendo bien que quieres hacer acá

remainingTime=period-time2

pero ni bien time2 sea mayor a period el resultado será un valor enorme de alrededor de 25 días.

Creo, si interpreto bien, que debería ser

remainingTime = period - (time2 - time1); 

Saludos

Gracias por las aportaciones y por la rápida respuesta. En la siguiente función estaba cometiendo un fallo. Ya lo he corregido con tu aportación.
remainingTime=period-time2
Aún así sigue sin funcionar el código. He seguido realizando pruebas y sustituyendo la función LowPower.sleep(remainingTime) por LowPower.idle(remainingTime) funciona perfectamente. Tengo entendido que la segunda función es menos restrictiva (es decir, ahorra menos energía) que la primera función.
Os agradecería cualquier ayuda. Un saludo y gracias.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.