Despertar Arduino cuando le llegue Información del Sensor

Hola Comunidad, espero se estén divirtiendo con cada uno de sus Proyectos.

Tengo un Arduino Uno, el cual recibe información de un sensor de flujo de agua YF-S201 https://naylampmechatronics.com/blog/47_tutorial-sensor-de-flujo-de-agua.html me indica la cantidad de agua que ha pasado por la tubería, si quiero empezar una nueva medición pulso un botón para que reinicie el contador. me funciona muy bien, sin embargo al tener el arduino siempre encendido consume mucha energía.
Lo que pretendo es que el arduino se encuentre “dormido”, cuando pase agua por el sensor “despierte” y realice las mediciones que hace actualmente, si después de 5 minutos no ha pasado agua por el sensor, duerma otra vez en espera de alguna señal.
He tratado con la librería LowPower.h, modo sleep, instrucciones wdt, attachInterrupt, sin embargo no encuentro la solución.

acá les dejo el código.

// Se incluye la librería de Arduino
#include <Arduino.h>
  // Importar librerías
  #include <Wire.h> // Librería comunicación I2C
  #include <LiquidCrystal_I2C.h> // Librería LCD I2C
  #include <Arduino.h>
  // Pin de conexión para el LED.
  // Declaración del objeto para el LCD
  // Poner la dirección del LCD a 0x20 para display 20x4 (A0=0, A1=0, A2=0)
  // Terminales de conexión del LCD
  //                    addr, en,rw,rs,d4,d5,d6,d7,bl,blpol
  LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);

  const int sensor = 2; // Pin digital para el sensor de flujo YF-S201
  const int btn = 3; // Pin para el Boton
  int valorBtn = 0; // boton empieza con el valor 0

  
  
  int litros_Hora; // Variable que almacena el caudal (L/hora)
  volatile int pulsos = 0; // Variable que almacena el número de pulsos
  unsigned long tiempoAnterior = 0; // Variable para calcular el tiempo transcurrido
  unsigned long pulsos_Acumulados = 0; // Variable que almacena el número de pulsos acumulados
  float litros; // // Variable que almacena el número de litros acumulados



  // Rutina de servicio de la interrupción (ISR)
  void flujo()
  {
    pulsos++; // Incrementa en una unidad el número de pulsos
  }
   
  void setup()
  {
    pinMode(btn, INPUT);// Activamos en pin del boton 
        
    
    pinMode(sensor, INPUT_PULLUP); // Pin digital como entrada con conexión PULL-UP interna
    lcd.begin(16,2); // Inicializo el LCD 1602
    interrupts(); // Habilito las interrupciones
    // Interrupción INT0, llama a la ISR llamada "flujo" en cada flanco de subida en el pin digital 2
    attachInterrupt(digitalPinToInterrupt(sensor), flujo, RISING); 
    tiempoAnterior = millis(); // Guardo el tiempo que tarda el ejecutarse el setup
    LCD_titulo();
    
  }
   
  void loop ()
  {

  valorBtn = digitalRead(btn); // Leemos el valor del pin donde se encuentra el boton


            if (valorBtn == HIGH) { reset(); }
            
            // Cada segundo calculamos e imprimimos el caudal y el número de litros consumidos
                if(millis() - tiempoAnterior > 1000)
            
              // delay(10000);//  espera 1 segundo
            
                  // Realizo los cálculos
                  tiempoAnterior = millis(); // Actualizo el nuevo tiempo
                  pulsos_Acumulados += pulsos; // Número de pulsos acumulados
                  litros_Hora = (pulsos * 60 / 7.5); // Q = frecuencia * 60/ 7.5 (L/Hora)
                  litros = pulsos_Acumulados*1.0/402; // Cada 450 pulsos son un litro
                  pulsos = 0; // Pongo nuevamente el número de pulsos a cero
                  // Llamada a la función que muestra los resultados en el LCD 1602
                  LCD_1602();

        
      }// LOOP


   
  // Función que muestra los resultados en el LCD 1602
  void LCD_1602() // Muestra la cantidad de litros
  {
   
    lcd.setCursor(2,1);// se posiciona en la segunda fila, primer columna
    lcd.print(litros);  // muestra el valor de la variable litros
    lcd.print(" Litros"); // coloca la palabra "Litros"
    //
   
  }

  void LCD_titulo()// Muestra encabezado
  {
    lcd.setCursor(1,0); // se posiciona en la primer fila, primer columna
    lcd.print("Medicion"); // coloca el encabezado
   
  }

  void reset()// metodo para reiniciar el contador, al presionar el boton
  {
            litros_Hora = 0; // Variable que almacena el caudal (L/hora)
            pulsos = 0; // Variable que almacena el número de pulsos
            tiempoAnterior = 0; // Variable para calcular el tiempo transcurrido
            pulsos_Acumulados = 0; // Variable que almacena el número de pulsos acumulados
            litros = 0; // // Variable que almacena el número de litros acumulados
            lcd.setCursor(2,1);/// Se posiciona en la fila 2 para limpiar la pantalla con el comando de abajo
            lcd.print(" ");// limpia pantalla
          
  }

Moderador
Por favor @tntbogantes, edita tu post usando etiquetas de enlace para indicar el link que has posteado.
El código lo has posteado correctamente.

Lee las Normas del foro

Puedes usar una interrupción hardware INT0 (Pin 2) o INT1 (pin 3) para despertar al Arduino cuando esta en Sleep.
La librería LowPower tiene un ejemplo pero veo que tu código usa para leer las RPM del sensor de caudal justamente la misma interrupción que suelen usar en el ejemplo de LowPower.

const int sensor = 2; // Pin digital para el sensor de flujo YF-S201

Acá esta el ejemplo de LowPower

El ejemplo define justamente pin2 para despertar

// Use pin 2 as wake up pin
const int wakeUpPin = 2;

tu usas exactamente el mismo pin para leer las RPM
Cambia a otro pin la lectura de las RPM o con que despierta.
Solo tienes Pin 3 para hacerlo

Si usaras pin3 para despertar hazlo de este modo

#include "LowPower.h"

// Use pin 2 as wake up pin
const byte wakeUpPin = 3;

void wakeUp()
{
    // Just a handler for the pin interrupt.
}

void setup()
{
    // Configure wake up pin as input.
    // This will consumes few uA of current.
    pinMode(wakeUpPin, INPUT);   
}

void loop() 
{
    // Allow wake up pin to trigger interrupt on low.
    attachInterrupt(1, wakeUp, LOW);
    
    // Enter power down state with ADC and BOD module disabled.
    // Wake up when wake up pin is low.
    LowPower.powerDown(SLEEP_FOREVER, ADC_OFF, BOD_OFF); 
    
    // Disable external pin interrupt on wake up pin.
    detachInterrupt(0); 
    
    // Do something here
    // Example: Read sensor, data logging, data transmission.
}

Gracias.. voy a intentarlo

Saludos