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
}