Terrario-control humedad sistemas lluvia

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 :slight_smile:

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.

void loop() {
mirarSensorHumedad();
HoraLuces();
mirarTempH();
cuadrado();
int valorpin=digitalRead (releLluvia);
Serial.println(valorpin);

es como si el case 1, no le hiciera caso y pasara al 2 de inmediato nada mas superar la humedad mínima.

int valorpin=digitalRead (releLluvia);
Serial.println(valorpin);

esto lo he puesto solo para ver el estado del pin.
gracias!

A ver.. tu pusiste eso

if(h<=humedadMinima){ //minima 65

    digitalWrite(releLluvia, LOW);
    delay(15000);
    digitalWrite(releLluvia, HIGH);
    
    }

Quiero decir que tu código dice que vaya a LOW el rele y luego de 15 seg debe apagarse.

Agregaste como global

unsigned long start;

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.

Gracias a ti tmb surbyte por tu apoyo!!!