Modo Sleep no me despierta con boton

Hola a todos,
Lo primero dar las gracias a la gente de este foro, soy novatillo en esto de arduino y sin haber leido preguntas/respuestas vuestras no hubiese llegado hasta aqui
Os expongo mi problema a ver si sabeis que pasa: estoy creando una estacion meteorológica autonoma, y quiero tomar medidas cada hora, asi que quiero que el resto del tiempo me consuma el mínimo posible (modo sleep), y quiero que salga del modo sleep si pulso un boton.
Todo me funciona correctamente si uso el modo sleep de 8 segundos (se duerme, se despierta si toco el boton), pero al meter la orden LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF) en un for para conseguir la hora deseada no consigo que se despierte con el boton.
Alguno podria decirme que estoy haciendo mal??
he probado con el attachInterrupt y detachInterrupt dentro y fuera del for, y nadano me funciona de ninguna de las dos maneras.
Os pego todo el codigo por si el fallo lo tengo en otro lado.
Gracias!!

#include <LowPower.h>

//lo primero es comprobar la direccion del modulo I2C, para ello ejecutamos el programa i2c escaner
//en nuestro caso nos da la direccion 0x27

#include <Wire.h>  //biblioteca modulo i2c
#include <LiquidCrystal_I2C.h>
#include <GFButton.h>  //biblioteca manejo botones
#include <DHT.h>


#define DHTPIN 7
#define DHTTYPE DHT22
#define COLS 16 // Columnas del LCD
#define ROWS 2 // Filas del LCD

//para despertar arduino hay que conectar el boton al pin 2 o 3
const int wakeUpPin = 2;

//Crear el objeto lcd  dirección  0x27 y 16 columnas x 2 filas
LiquidCrystal_I2C lcd(0x27,16,2);  //

//iniciamos el dht 
DHT dht(DHTPIN, DHTTYPE);

//declaramos los vectores para t y h
int dim=5;
float temp[5]={0,0,0,0,0};
float hum[5]={0,0,0,0,0};
float comparacion[4]={1,1,1,1}; //1 aumenta 0 igual, -1 disminuye

//declaramos las vatisables para tmax, t min, hmax y hmin
float Tmax=-100;
float Tmin=100;
float Hmax=-100;
float Hmin=100;


//creamos los caracteres especiales
byte arriba[8] = {
  B00100,
  B01110,
  B10101,
  B00100,
  B00100,
  B00100,
  B00100,
  B00100
};
byte abajo[8] = {
   B00100,
  B00100,
  B00100,
  B00100,
  B00100,
  B10101,
  B01110,
  B00100
};
byte grados[] = {
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};

//------------------------FUNCIONES--------------------------------------

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



//desplaza una posicion los valores del vector 
void colocar(int dim,float vect[]){
  //Desplazo los valores del array
  for (int i=0;i<dim-1;i++){
    vect[i]=vect[i+1];
  }
}


//compara un valor con su siguiente medición, -1 si la siguiente medicion disminuye, 0 si es igual y 1 si aumenta
void comparar(int dim, float vec[]){
    for (int i=0;i<dim-1;i++){
    if(vec[i+1]<vec[i]-0.2){
      comparacion[i]=-1;
    }else if (vec[i+1]>vec[i]+0.2){
      comparacion[i]=1;
    }else {
      comparacion[i]=0;
    }
  }
}


//muestra en lcd  si aumentan o disminuyen los valores (flechas o iguales)
void imprimir_lcd(int dim, float vec[4]){ 
  for(int i=0;i<dim-1;i++){
    if(vec[i]==-1){
      lcd.write(2);
      lcd.print(" ");
    }
     if(vec[i]==0){
      lcd.print("=");
      lcd.print(" ");
    }
     if(vec[i]==1){
      lcd.write(1);
      lcd.print(" ");
    }
  }
}

//---------------------------------PROGRAMA-------------------------------------------------------

void setup() {
  // Configure wake up pin as input.
  // This will consumes few uA of current.
  pinMode(wakeUpPin, INPUT);   
    
  // Inicializar el LCD
  lcd.begin(COLS,ROWS);
  lcd.init();
  
  //almacenamos los caracteres creados
  lcd.createChar (1,arriba);
  lcd.createChar (2,abajo);
  lcd.createChar (3,grados);

 // Inicializamos comunicación serie
  Serial.begin(9600);
 
  // Comenzamos el sensor DHT
  dht.begin();
  
  //Encender la luz de fondo.
  lcd.backlight();
  
  // Escribimos el Mensaje en el LCD.
  lcd.setCursor(0,0);
  lcd.print("DESPERTANDO ");
    
  lcd.setCursor(0,1);
  lcd.print ("medida cada 30 m");
  delay(2000);
  lcd.noBacklight(); // turn off backlight
  lcd.noDisplay();//Deja de mandar la información al LCD
}

void loop() {
  
   
    
    //vammos a meter el apagado en un for para conseguir mas tirmpo de 8 seg, quiero medidas cada hora asi que necesito 3600seg, 8*450

   //for (int i=0;i<450;i++){
         //Allow wake up pin to trigger interrupt on low.
         attachInterrupt(0, wakeUp, CHANGE);  //0 por el pin 2, CHANGE Se dispara cuando pase de HIGH a LOW o viceversa.
        // Enter power down state with ADC and BOD module disabled.
        LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); 
         // Disable external pin interrupt on wake up pin.
         detachInterrupt(0); 
   // }
    
   
 
    lcd.backlight();  
    lcd.display();      
    lcd.clear();
    lcd.print ("nueva medida");
    delay(1000);
    
    //recoloco vector temp
    colocar(dim,temp);
    //mido la tem actual y la coloco en el ultimo vamor del array 
    float t=dht.readTemperature(); 
    temp[dim-1]=t;
    
    //comparo temeratura actual con tmax y tmin, y reasigno valores en caso de ser maxima o minima
    if (t>Tmax) {
      Tmax=t;
    }
    if (t<Tmin) {
      Tmin=t;
    }
      
    //comparo los valores del vector temp
    comparar(dim,temp);
      
    lcd.setCursor(0,0);
    lcd.print ("t:");
    lcd.print (t,1);
    lcd.write(3);
    lcd.print("C");
    lcd.print(" ");
    imprimir_lcd(dim,comparacion);
         
    colocar(dim,hum);
    float h = dht.readHumidity();
    hum[dim-1]=h; 
     if (h>Hmax) {
      Hmax=h;
    }
    if (h<Hmin) {
      Hmin=h;
    }
    comparar(dim,hum);
    lcd.setCursor(0,1);
    lcd.print ("h:");
    lcd.print (h,1);
    lcd.print ("%");
    lcd.print(" ");
    imprimir_lcd(dim,comparacion);
    
    delay(5000); //para mostrar datos 3 seg

    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print ("T");
    lcd.write(1);
    lcd.print (":");
    lcd.print (Tmax,1);
    lcd.print("  ");

    lcd.print ("T");
    lcd.write(2);
    lcd.print (":");
    lcd.print (Tmin,1);
   

    lcd.setCursor(0,1);
    lcd.print ("H");
    lcd.write(1);
    lcd.print (":");
    lcd.print (Hmax,1);
   
    lcd.print("  ");

    lcd.print ("H");
    lcd.write(2);
    lcd.print (":");
    lcd.print (Hmin,1);
   
   
    
    delay(5000);
 
   lcd.noBacklight(); // turn off backlight
   lcd.noDisplay();//Deja de mandar la información al LCD
  

}

No estoy muy familiarizado con la librería LowPower y no sé si faltaría hacer algo más, pero prueba a ver si te sirve así

#include <avr/sleep.h>
#include <LowPower.h>

//lo primero es comprobar la direccion del modulo I2C, para ello ejecutamos el programa i2c escaner
//en nuestro caso nos da la direccion 0x27

#include <Wire.h>  //biblioteca modulo i2c
#include <LiquidCrystal_I2C.h>
#include <GFButton.h>  //biblioteca manejo botones
#include <DHT.h>


#define DHTPIN 7
#define DHTTYPE DHT22
#define COLS 16 // Columnas del LCD
#define ROWS 2 // Filas del LCD

//para despertar arduino hay que conectar el boton al pin 2 o 3
const int wakeUpPin = 2;

//Crear el objeto lcd  dirección  0x27 y 16 columnas x 2 filas
LiquidCrystal_I2C lcd(0x27,16,2);  //

//iniciamos el dht 
DHT dht(DHTPIN, DHTTYPE);

//declaramos los vectores para t y h
int dim=5;
float temp[5]={0,0,0,0,0};
float hum[5]={0,0,0,0,0};
float comparacion[4]={1,1,1,1}; //1 aumenta 0 igual, -1 disminuye

//declaramos las vatisables para tmax, t min, hmax y hmin
float Tmax=-100;
float Tmin=100;
float Hmax=-100;
float Hmin=100;


//creamos los caracteres especiales
byte arriba[8] = {
  B00100,
  B01110,
  B10101,
  B00100,
  B00100,
  B00100,
  B00100,
  B00100
};
byte abajo[8] = {
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
  B10101,
  B01110,
  B00100
};
byte grados[] = {
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};

volatile bool despierto = false;

//------------------------FUNCIONES--------------------------------------

void wakeUp(){
  sleep_disable();
  despierto = true;
}



//desplaza una posicion los valores del vector 
void colocar(int dim,float vect[]){
  //Desplazo los valores del array
  for (int i=0;i<dim-1;i++){
    vect[i]=vect[i+1];
  }
}


//compara un valor con su siguiente medición, -1 si la siguiente medicion disminuye, 0 si es igual y 1 si aumenta
void comparar(int dim, float vec[]){
  for (int i=0;i<dim-1;i++){
    if(vec[i+1]<vec[i]-0.2){
      comparacion[i]=-1;
    }else if (vec[i+1]>vec[i]+0.2){
      comparacion[i]=1;
    }else {
      comparacion[i]=0;
    }
  }
}


//muestra en lcd  si aumentan o disminuyen los valores (flechas o iguales)
void imprimir_lcd(int dim, float vec[4]){ 
  for(int i=0;i<dim-1;i++){
    if(vec[i]==-1){
      lcd.write(2);
      lcd.print(" ");
    }
     if(vec[i]==0){
      lcd.print("=");
      lcd.print(" ");
    }
     if(vec[i]==1){
      lcd.write(1);
      lcd.print(" ");
    }
  }
}

//---------------------------------PROGRAMA-------------------------------------------------------

void setup() {
  // Configure wake up pin as input.
  // This will consumes few uA of current.
  pinMode(wakeUpPin, INPUT);   
    
  // Inicializar el LCD
  lcd.begin(COLS,ROWS);
  lcd.init();
  
  //almacenamos los caracteres creados
  lcd.createChar (1,arriba);
  lcd.createChar (2,abajo);
  lcd.createChar (3,grados);

 // Inicializamos comunicación serie
  Serial.begin(9600);
 
  // Comenzamos el sensor DHT
  dht.begin();
  
  //Encender la luz de fondo.
  lcd.backlight();
  
  // Escribimos el Mensaje en el LCD.
  lcd.setCursor(0,0);
  lcd.print("DESPERTANDO ");
    
  lcd.setCursor(0,1);
  lcd.print ("medida cada 30 m");
  delay(2000);
  lcd.noBacklight(); // turn off backlight
  lcd.noDisplay();//Deja de mandar la información al LCD
}

void loop() {
    //vamos a meter el apagado en un for para conseguir mas tirmpo de 8 seg, quiero medidas cada hora asi que necesito 3600seg, 8*450
   noInterrupts(); //deshabilita momentáneamente todas las interrupciones
   EIFR = bit(INTF0);  // limpia el flag de interrupción para el pin 2;
   attachInterrupt(digitalPinToInterrupt(wakeUpPin), wakeUp, CHANGE);  // esta es la manera correcta de "attachear" la interrupción
  interrupts(); // rehabilita las interrupciones

  for (int i=0;i<450;i++){
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
    if(despierto){
      despierto = false;
      break;
     }
    }
    detachInterrupt(digitalPinToInterrupt(wakeUpPin)); // desactiva la interrupción del pin 2
   
 
    lcd.backlight();  
    lcd.display();      
    lcd.clear();
    lcd.print ("nueva medida");
    delay(1000);
    
    //recoloco vector temp
    colocar(dim,temp);
    //mido la tem actual y la coloco en el ultimo vamor del array 
    float t=dht.readTemperature(); 
    temp[dim-1]=t;
    
    //comparo temeratura actual con tmax y tmin, y reasigno valores en caso de ser maxima o minima
    if (t>Tmax) {
      Tmax=t;
    }
    if (t<Tmin) {
      Tmin=t;
    }
      
    //comparo los valores del vector temp
    comparar(dim,temp);
      
    lcd.setCursor(0,0);
    lcd.print ("t:");
    lcd.print (t,1);
    lcd.write(3);
    lcd.print("C");
    lcd.print(" ");
    imprimir_lcd(dim,comparacion);
         
    colocar(dim,hum);
    float h = dht.readHumidity();
    hum[dim-1]=h; 
     if (h>Hmax) {
      Hmax=h;
    }
    if (h<Hmin) {
      Hmin=h;
    }
    comparar(dim,hum);
    lcd.setCursor(0,1);
    lcd.print ("h:");
    lcd.print (h,1);
    lcd.print ("%");
    lcd.print(" ");
    imprimir_lcd(dim,comparacion);
    
    delay(5000); //para mostrar datos 3 seg

    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print ("T");
    lcd.write(1);
    lcd.print (":");
    lcd.print (Tmax,1);
    lcd.print("  ");

    lcd.print ("T");
    lcd.write(2);
    lcd.print (":");
    lcd.print (Tmin,1);
   

    lcd.setCursor(0,1);
    lcd.print ("H");
    lcd.write(1);
    lcd.print (":");
    lcd.print (Hmax,1);
   
    lcd.print("  ");

    lcd.print ("H");
    lcd.write(2);
    lcd.print (":");
    lcd.print (Hmin,1);
   
   
    
    delay(5000);
 
   lcd.noBacklight(); // turn off backlight
   lcd.noDisplay();//Deja de mandar la información al LCD
  
}

//lo primero es comprobar la direccion del modulo I2C, para ello ejecutamos el programa i2c escaner
//en nuestro caso nos da la direccion 0x27

#include <Wire.h>  //biblioteca modulo i2c
#include <LiquidCrystal_I2C.h>
#include <GFButton.h>  //biblioteca manejo botones
#include <DHT.h>


#define DHTPIN 7
#define DHTTYPE DHT22
#define COLS 16 // Columnas del LCD
#define ROWS 2 // Filas del LCD

//para despertar arduino hay que conectar el boton al pin 2 o 3
const int wakeUpPin = 2;

//Crear el objeto lcd  dirección  0x27 y 16 columnas x 2 filas
LiquidCrystal_I2C lcd(0x27,16,2);  //

//iniciamos el dht 
DHT dht(DHTPIN, DHTTYPE);

//declaramos los vectores para t y h
int dim=5;
float temp[5]={0,0,0,0,0};
float hum[5]={0,0,0,0,0};
float comparacion[4]={1,1,1,1}; //1 aumenta 0 igual, -1 disminuye

//declaramos las vatisables para tmax, t min, hmax y hmin
float Tmax=-100;
float Tmin=100;
float Hmax=-100;
float Hmin=100;


//creamos los caracteres especiales
byte arriba[8] = {
  B00100,
  B01110,
  B10101,
  B00100,
  B00100,
  B00100,
  B00100,
  B00100
};
byte abajo[8] = {
  B00100,
  B00100,
  B00100,
  B00100,
  B00100,
  B10101,
  B01110,
  B00100
};
byte grados[] = {
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};

volatile bool despierto = false;

//------------------------FUNCIONES--------------------------------------

void wakeUp(){
  sleep_disable();
  despierto = true;
}



//desplaza una posicion los valores del vector 
void colocar(int dim,float vect[]){
  //Desplazo los valores del array
  for (int i=0;i<dim-1;i++){
    vect[i]=vect[i+1];
  }
}


//compara un valor con su siguiente medición, -1 si la siguiente medicion disminuye, 0 si es igual y 1 si aumenta
void comparar(int dim, float vec[]){
  for (int i=0;i<dim-1;i++){
    if(vec[i+1]<vec[i]-0.2){
      comparacion[i]=-1;
    }else if (vec[i+1]>vec[i]+0.2){
      comparacion[i]=1;
    }else {
      comparacion[i]=0;
    }
  }
}


//muestra en lcd  si aumentan o disminuyen los valores (flechas o iguales)
void imprimir_lcd(int dim, float vec[4]){ 
  for(int i=0;i<dim-1;i++){
    if(vec[i]==-1){
      lcd.write(2);
      lcd.print(" ");
    }
     if(vec[i]==0){
      lcd.print("=");
      lcd.print(" ");
    }
     if(vec[i]==1){
      lcd.write(1);
      lcd.print(" ");
    }
  }
}

//---------------------------------PROGRAMA-------------------------------------------------------

void setup() {
  // Configure wake up pin as input.
  // This will consumes few uA of current.
  pinMode(wakeUpPin, INPUT);   
    
  // Inicializar el LCD
  lcd.begin(COLS,ROWS);
  lcd.init();
  
  //almacenamos los caracteres creados
  lcd.createChar (1,arriba);
  lcd.createChar (2,abajo);
  lcd.createChar (3,grados);

 // Inicializamos comunicación serie
  Serial.begin(9600);
 
  // Comenzamos el sensor DHT
  dht.begin();
  
  //Encender la luz de fondo.
  lcd.backlight();
  
  // Escribimos el Mensaje en el LCD.
  lcd.setCursor(0,0);
  lcd.print("DESPERTANDO ");
    
  lcd.setCursor(0,1);
  lcd.print ("medida cada 30 m");
  delay(2000);
  lcd.noBacklight(); // turn off backlight
  lcd.noDisplay();//Deja de mandar la información al LCD
}

void loop() {
    //vamos a meter el apagado en un for para conseguir mas tirmpo de 8 seg, quiero medidas cada hora asi que necesito 3600seg, 8*450
   noInterrupts(); //deshabilita momentáneamente todas las interrupciones
   EIFR = bit(INTF0);  // limpia el flag de interrupción para el pin 2;
   attachInterrupt(digitalPinToInterrupt(wakeUpPin), wakeUp, CHANGE);  // esta es la manera correcta de "attachear" la interrupción
  interrupts(); // rehabilita las interrupciones

  for (int i=0;i<450;i++){
    LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF);
    if(despierto){
      despierto = false;
      break;
     }
    }
    detachInterrupt(digitalPinToInterrupt(wakeUpPin)); // desactiva la interrupción del pin 2
   
 
    lcd.backlight();  
    lcd.display();      
    lcd.clear();
    lcd.print ("nueva medida");
    delay(1000);
    
    //recoloco vector temp
    colocar(dim,temp);
    //mido la tem actual y la coloco en el ultimo vamor del array 
    float t=dht.readTemperature(); 
    temp[dim-1]=t;
    
    //comparo temeratura actual con tmax y tmin, y reasigno valores en caso de ser maxima o minima
    if (t>Tmax) {
      Tmax=t;
    }
    if (t<Tmin) {
      Tmin=t;
    }
      
    //comparo los valores del vector temp
    comparar(dim,temp);
      
    lcd.setCursor(0,0);
    lcd.print ("t:");
    lcd.print (t,1);
    lcd.write(3);
    lcd.print("C");
    lcd.print(" ");
    imprimir_lcd(dim,comparacion);
         
    colocar(dim,hum);
    float h = dht.readHumidity();
    hum[dim-1]=h; 
     if (h>Hmax) {
      Hmax=h;
    }
    if (h<Hmin) {
      Hmin=h;
    }
    comparar(dim,hum);
    lcd.setCursor(0,1);
    lcd.print ("h:");
    lcd.print (h,1);
    lcd.print ("%");
    lcd.print(" ");
    imprimir_lcd(dim,comparacion);
    
    delay(5000); //para mostrar datos 3 seg

    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print ("T");
    lcd.write(1);
    lcd.print (":");
    lcd.print (Tmax,1);
    lcd.print("  ");

    lcd.print ("T");
    lcd.write(2);
    lcd.print (":");
    lcd.print (Tmin,1);
   

    lcd.setCursor(0,1);
    lcd.print ("H");
    lcd.write(1);
    lcd.print (":");
    lcd.print (Hmax,1);
   
    lcd.print("  ");

    lcd.print ("H");
    lcd.write(2);
    lcd.print (":");
    lcd.print (Hmin,1);
   
   
    
    delay(5000);
 
   lcd.noBacklight(); // turn off backlight
   lcd.noDisplay();//Deja de mandar la información al LCD
  
}

Fijate que agregué la inclusión de la librería sleep y una variable booleana, despierto

Dato:
Si acaso pruebas el circuito en Proteus, solo simula las interrupciones por LOW, si usas HIGH o CHANGE (como en este caso) las ignora completamente, atención con eso.

Saludos

@barnigar Cuando tengas problemas con algo dirígete a los ejemplos de la librería porque las respuetas siempre estan ahi.
El máximo tiempo que se puede poner a dormir un Arduino son 8 seg, si quieres mas tiempo lo pones en un loop que aumente esos 8 segundos al tiempo que gustes.
Obviamente será multiplo de 8.
Esto que te digo esta en los ejemplos de LowPower.h

Eso es lo que hizo (un lazo for() con 450 iteraciones para tener 1 hora de sleep), solo que quiere poder interrumpir esa espera de 1 hora pulsando un botón (o sea, interrumpir y salir del lazo).

Saludos

@anon90500195 gracias!
con parte de tu codigo nuevo funciona, eso si no me ha hecho falta usar la libreria sleep ni el noInterrupts() / interrupts();
cuelgo el codigo tal y como me esta funcionando ahora por si a alguno le es de utilidad. En cuanto me llegue el sensor bpm280 (para la presion) y lo integre ya pondre el codigo completo y consumos electricos del proyecto con un arduino nano, que seguro que a mas de uno le viene bien

se me olvidaba el codigo:

#include <LowPower.h>

//lo primero es comprobar la direccion del modulo I2C, para ello ejecutamos el programa i2c escaner
//en nuestro caso nos da la direccion 0x27

#include <Wire.h>  //biblioteca modulo i2c
#include <LiquidCrystal_I2C.h>
#include <GFButton.h>  //biblioteca manejo botones
#include <DHT.h>


#define DHTPIN 7
#define DHTTYPE DHT22
#define COLS 16 // Columnas del LCD
#define ROWS 2 // Filas del LCD

//para despertar arduino hay que conectar el boton al pin 2 o 3
const int wakeUpPin = 2;

//Crear el objeto lcd  dirección  0x27 y 16 columnas x 2 filas
LiquidCrystal_I2C lcd(0x27,16,2);  //

//iniciamos el dht 
DHT dht(DHTPIN, DHTTYPE);

//declaramos los vectores para t y h
int dim=5;
float temp[5]={0,0,0,0,0};
float hum[5]={0,0,0,0,0};
float comparacion[4]={1,1,1,1}; //1 aumenta 0 igual, -1 disminuye

//declaramos las vatisables para tmax, t min, hmax y hmin
float Tmax=-100;
float Tmin=100;
float Hmax=-100;
float Hmin=100;


//creamos los caracteres especiales
byte arriba[8] = {
  B00100,
  B01110,
  B10101,
  B00100,
  B00100,
  B00100,
  B00100,
  B00100
};
byte abajo[8] = {
   B00100,
  B00100,
  B00100,
  B00100,
  B00100,
  B10101,
  B01110,
  B00100
};
byte grados[] = {
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
  B00000
};

volatile bool despierto = false; // variable para la interrupcion
//------------------------FUNCIONES--------------------------------------

void wakeUp()
{
    // Just a handler for the pin interrupt.
    despierto = true;
}



//desplaza una posicion los valores del vector 
void colocar(int dim,float vect[]){
  //Desplazo los valores del array
  for (int i=0;i<dim-1;i++){
    vect[i]=vect[i+1];
  }
}


//compara un valor con su siguiente medición, -1 si la siguiente medicion disminuye, 0 si es igual y 1 si aumenta
void comparar(int dim, float vec[]){
    for (int i=0;i<dim-1;i++){
    if(vec[i+1]<vec[i]-0.2){
      comparacion[i]=-1;
    }else if (vec[i+1]>vec[i]+0.2){
      comparacion[i]=1;
    }else {
      comparacion[i]=0;
    }
  }
}


//muestra en lcd  si aumentan o disminuyen los valores (flechas o iguales)
void imprimir_lcd(int dim, float vec[4]){ 
  for(int i=0;i<dim-1;i++){
    if(vec[i]==-1){
      lcd.write(2);
      lcd.print(" ");
    }
     if(vec[i]==0){
      lcd.print("=");
      lcd.print(" ");
    }
     if(vec[i]==1){
      lcd.write(1);
      lcd.print(" ");
    }
  }
}

//---------------------------------PROGRAMA-------------------------------------------------------

void setup() {
  // Configure wake up pin as input.
  // This will consumes few uA of current.
  pinMode(wakeUpPin, INPUT);   
    
  // Inicializar el LCD
  lcd.begin(COLS,ROWS);
  lcd.init();
  
  //almacenamos los caracteres creados
  lcd.createChar (1,arriba);
  lcd.createChar (2,abajo);
  lcd.createChar (3,grados);

 // Inicializamos comunicación serie
  Serial.begin(9600);
 
  // Comenzamos el sensor DHT
  dht.begin();
  
  //Encender la luz de fondo.
  lcd.backlight();
  
  // Escribimos el Mensaje en el LCD.
  lcd.setCursor(0,0);
  lcd.print("DESPERTANDO ");
    
  lcd.setCursor(0,1);
  lcd.print ("medida cada 30 m");
  delay(2000);
  lcd.noBacklight(); // turn off backlight
  lcd.noDisplay();//Deja de mandar la información al LCD
}

void loop() {
   //Allow wake up pin to trigger interrupt on low.
   attachInterrupt(digitalPinToInterrupt(wakeUpPin), wakeUp, CHANGE);  //0 por el pin 2, CHANGE Se dispara cuando pase de HIGH a LOW o viceversa.

   //vamos a meter el apagado en un for para conseguir mas tirmpo de 8 seg, quiero medidas cada hora asi que necesito 3600seg, 8*450
   for (int i=0;i<450;i++){
        // Enter power down state with ADC and BOD module disabled.
        LowPower.powerDown(SLEEP_8S, ADC_OFF, BOD_OFF); 
         //funcionamiento: si pulso boton hay cambio de valor en el pin, se activa attachinterrupt--> entra funcion wakeup, cambiamos valor de despierto a true-->
         //-->entra al if, volvemos despierto a false y con el break rompemos el for
         if(despierto){
            despierto = false;
            break;
         }
    }
    // Disable external pin interrupt on wake up pin.
     detachInterrupt(digitalPinToInterrupt(wakeUpPin)); 
   
 
    lcd.backlight();  
    lcd.display();      
    lcd.clear();
    lcd.print ("nueva medida");
    delay(1000);
    
    //recoloco vector temp
    colocar(dim,temp);
    //mido la tem actual y la coloco en el ultimo vamor del array 
    float t=dht.readTemperature(); 
    temp[dim-1]=t;
    
    //comparo temeratura actual con tmax y tmin, y reasigno valores en caso de ser maxima o minima
    if (t>Tmax) {
      Tmax=t;
    }
    if (t<Tmin) {
      Tmin=t;
    }
      
    //comparo los valores del vector temp
    comparar(dim,temp);
      
    lcd.setCursor(0,0);
    lcd.print ("t:");
    lcd.print (t,1);
    lcd.write(3);
    lcd.print("C");
    lcd.print(" ");
    imprimir_lcd(dim,comparacion);
         
    colocar(dim,hum);
    float h = dht.readHumidity();
    hum[dim-1]=h; 
     if (h>Hmax) {
      Hmax=h;
    }
    if (h<Hmin) {
      Hmin=h;
    }
    comparar(dim,hum);
    lcd.setCursor(0,1);
    lcd.print ("h:");
    lcd.print (h,1);
    lcd.print ("%");
    lcd.print(" ");
    imprimir_lcd(dim,comparacion);
    
    delay(5000); //para mostrar datos 3 seg

    lcd.clear();
    lcd.setCursor(0,0);
    lcd.print ("T");
    lcd.write(1);
    lcd.print (":");
    lcd.print (Tmax,1);
    lcd.print("  ");

    lcd.print ("T");
    lcd.write(2);
    lcd.print (":");
    lcd.print (Tmin,1);
   

    lcd.setCursor(0,1);
    lcd.print ("H");
    lcd.write(1);
    lcd.print (":");
    lcd.print (Hmax,1);
   
    lcd.print("  ");

    lcd.print ("H");
    lcd.write(2);
    lcd.print (":");
    lcd.print (Hmin,1);
   
   
    
    delay(5000);
 
   lcd.noBacklight(); // turn off backlight
   lcd.noDisplay();//Deja de mandar la información al LCD
  

}

Me alegro que te sirviera.

Saludos

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