buenas soy ryuk y estoy metido en un proyecto de automatización de un terrario. El programa lo voy haciendo sin problemas...luces, temperatura etc.. pero tengo un problema con el control de la humedad a través de un DHT22, mínima 65% y máxima 80 %. Lo que yo tengo es tan simple como, la lectura del sensor de humedad es menor a la que o le establezco como buena, activa un rele que a su vez activa una bomba (sistema de lluvia) hasta aquí bien, pero me he dado cuenta que, tal y como esta hecho la bomba se activaria cuando llegue al minimo de 65 pero se desactivaría a los pocos segundos ya que la humedad sube bastante rápido con este sensor. Esto crearía estrés al rele que se activaría muchas veces muy pocos segundos y no digamos a la bomba (esto es lo que creo yo). He pensado hacerlo con la función Delay, que al estar por debajo de 65% se encienda por unos 15 segundos. Pero también me pararía todo el sketch 15 segundos, dejando así de hacer otras cosas. adjunto la parte interesante de la función humedad.
void mirarSensorHumedad(){
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
int h = dht.readHumidity();
int t = dht.readTemperature();
int humedadMinima=65;
lcd.home (); // go home
lcd.setCursor (0,0);
lcd.print("H");
lcd.print(":");
lcd.print(h);
lcd.print("%");
lcd.setCursor(0,1);
lcd.print("hT");
lcd.print(":");
lcd.print(t);
//RELES
if(h<=humedadMinima){ //minima 65
digitalWrite(releLluvia, LOW);
delay(15000);
digitalWrite(releLluvia, HIGH);
}
else{
digitalWrite(releLluvia, HIGH);
}
}
releLluvia es la salida al rele que activa la bomba. Creo recordar que los reyes se activan con LOW, por eso esta asi, corregirme si no es así.
creéis que hay alguna forma de activar la bomba unos 15 segundos cuando baje de 65% de humedad sin la función delay?
muchas gracias a todos de antemano, siento algún error al editar, es mi 1 post y soy novato
prueba asi, con una máquina de estado.
Tienes 3 estados posibles que puedes visualizar claramente.
0 cuando h < 65
1 cuando h < 65 y pasaron 15 segundos y quieres apagarlo
2 cuando h > 65 o terminaron los 15 segundos y te quedas con rele apagado.
Este procedimiento debe ejecutarse en todo momento o no funcionará. millis() no es como delay que lo llamas 1 vez y es suficiente. millis() requiere que funcione todo el tiempo.
debes definir start como variable global del tipo unsigned long
asi
unsigned long start;
esta es tu rutina modificada
void mirarSensorHumedad(){
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
int h = dht.readHumidity();
int t = dht.readTemperature();
int humedadMinima = 65;
lcd.home (); // go home
lcd.setCursor (0,0);
lcd.print("H");
lcd.print(":");
lcd.print(h);
lcd.print("%");
lcd.setCursor(0,1);
lcd.print("hT");
lcd.print(":");
lcd.print(t);
//RELES
if (h <= humedadMinima) { //minima 65
estado = 0;
}
else {
estado = 2;
}
switch(estado) {
case 0: digitalWrite(releLluvia, LOW);
estado = 1;
start = millis();
break;
case 1: if (millis() - start > 15000) {
digitalWrite(releLluvia, HIGH);
estado = 2;
}
break;
case 2: digitalWrite(releLluvia, HIGH);
break;
}
}
Ve a Documentación => Indice tutoriales => Maquina de estados y lee al respecto
buenas surbyte, gracias por contestar, te comento. He probado tu modificación, le he metido un digitalread al pin para ver su estado en todo momento y cuando llega a la humedad media (65), el pin me da 0, es decir, no espera esos 15 segundos.
a que te refieres con que debe ejecutase en todo momento? creo que por ahí puede venir mi fallo. la función mirarSensorhumedad la tengo simplemente llamada en el void loop.
Hola,
Comentas que la humedad sube muy rápido, pero ¿cuánto de rápido? ya que la solución puede ser tan simple como programar una histéresis.
if(h<=humedadMinima){ //minima 65
digitalWrite(releLluvia, LOW);
//delay(15000); // Nos olvidamos del tiempo
//digitalWrite(releLluvia, HIGH);
}
// Programamos una histéresis se encendió en 65 pero no se apagara hasta 85
else if (h>=humedadMaxima){// máxima 85
digitalWrite(releLluvia, HIGH);
}
.
Además también será una buena idea alejar lo máximo posible el sensor de la fuente del riego.
Ahora, si me dices que la humedad nada mas conectar el riego sube al 100%, entonces la idea del tiempo será tu única opción.
buenas chicos, pues acabo de probar lo de la histeresis. Si que sube rápido la humedad, lo he probado y de 60 a 80 tarda unos 7 segundos... creo que son suficientes, si la bomba aguanta tan poco. De momento con la histeresis va genial, muchas gracias rodripelto.