Control de temperatura y humedad dht22

Hola
Soy nuevo en programacion de arduino y me surgio un problema en este codigo q dejo a continuacion. El problema es que despues de un determinado tiempo deja de ejecutar el codigo.. Talvez alguien que me pueda ayudar con este problema.

  
  // AMBIENTE CONTROLADO 
#include <DHT.h>
#include <avr/wdt.h> //Libreria watchdog
#define DHTPIN 4 
        
#define DHTTYPE DHT22  
DHT dht(DHTPIN, DHTTYPE);  
 
 #define humidificador 5    //DEFINIR PIN DEL  HUMIDIFICADOR
 #define foco 11            //DEFINIR PIN DEL LA RESISTENCIA O FOCO 
 #define ventilador 12   //DEFINIR PIN DEL VENTILADOR
 
void setup() {
   wdt_disable();
  Serial.begin(9600); 
  pinMode(foco, OUTPUT);
  pinMode(ventilador, OUTPUT);
  pinMode(humidificador, OUTPUT);
 wdt_enable(WDTO_4S);
}
long tiempo =0; 

void loop() {
     if(millis()-tiempo>2000)
  { 
        int h = dht.readHumidity(); //Leemos la Humedad
      float t = dht.readTemperature(); //Leemos la temperatura 
      Serial.println("temperatura :");
       Serial.print(t);
        Serial.println();
      Serial.println("humedad");
       Serial.println(h);
        Serial.println();
       
        //--------CODIGO DE FOCO---------
      if (t <30.80){
                     digitalWrite(foco, LOW);
                  } else if(t >=31.00) { digitalWrite(foco,HIGH); 
                  } 

            
           //--------CODIGO HUMIDIFICADOR---------
     
      if(h <= 60) {
                digitalWrite(humidificador, LOW);
                 }else{ digitalWrite(humidificador, HIGH);
                } 
       //--------CODIGO DE SOBRETEMPERATURA ---------
                
                 if(31.00>= t){
                     digitalWrite(ventilador,HIGH );
               }else {digitalWrite(ventilador, LOW);
               }
                           
                tiempo=millis();
       } 
 wdt_reset();
}

Moderador:
Bienvenido al foro Arduino en Español.
Te contacto porque has posteado indebidamente tu código.
Los códigos deben postearse usando etiquetas.


Por favor, edita tu código haciéndolo correctamente y lee el resto de las normas, asi evitarás interrupciones de mi parte.
NOTA: El hecho que responda no te exime de lo que te he solicitado como moderador.

Porque usas watchdog?
Un dht no require de watchdog.
Tu código tiene una falla en como actualizas tiempo, la variable asociada a millis() y ademas no las definas como long solamente sino unsigned long.
No será tu caso ahora pero es bueno trabajar correctamente.
Long fallará a los 47/2 dias, tal como dije algo que no te ocurre.
Ahora nada de esto resuelve lo que ocurre.

Varios de nosotros hemos tenido problemas con los sensores aparentemente DHT22, digo aparentemente porque se copian entre tantos fabricantes que ya no sabemos si responden bien o no a las librerías.
De hecho me ha ocurrido que en el dia se detiene y la única solución ha sido alimentarlo con un pin de Arduino y no con 5V y que se reinicie. O sea en tu caso harias esto si lo alimentaras con el pin 6 por ejemplo.

#include <DHT.h>

#define DHTPIN 4
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

#define humidificador   5 //DEFINIR PIN DEL HUMIDIFICADOR
#define foco            11 //DEFINIR PIN DEL LA RESISTENCIA O FOCO
#define ventilador      12 //DEFINIR PIN DEL VENTILADOR
#define powerDHT22      6
unsigned long tiempo;

void setup() {
    Serial.begin(9600);
    pinMode(foco, OUTPUT);
    pinMode(ventilador, OUTPUT);
    pinMode(humidificador, OUTPUT);
}

void loop() {

    if (millis()-tiempo>2000)    {
        float h = dht.readHumidity();       // Leemos la Humedad
        float t = dht.readTemperature();    // Leemos la temperatura
        Serial.println("temperatura :");
        Serial.print(t);
        Serial.println();
        Serial.println("humedad");
        Serial.println(h);
        Serial.println();

        //--------CODIGO DE FOCO---------
        if (t <30.80){
            digitalWrite(foco, LOW);
        } else if (t >=31.00) { 
                digitalWrite(foco,HIGH); 
        } 
            
        //--------CODIGO HUMIDIFICADOR---------
        if (h <= 60.0) {
            digitalWrite(humidificador, LOW);
        } else { 
            digitalWrite(humidificador, HIGH);
        } 
        //--------CODIGO DE SOBRETEMPERATURA ---------
              
        if (31.00>= t) {
            digitalWrite(ventilador,HIGH );
        }else {
            digitalWrite(ventilador, LOW);
        }
        digitalWrite(powerDHT22, LOW);      // apago dht22
        digitalWrite(powerDHT22, HIGH);     // enciendo dht22
        tiempo = millis();
    } 

Muchas gracias por las sugerencias las tomare muy encuenta

Se podria hacer algo mas inteligente que lo que he sugerido.
Algo como cuando cuando el DHT22 se cuelga o sea empieza a dar NAN, no recibes datos de temperatura ni humedad entonces en ese momento haces lo que te he sugerido con apagarlo y encenderlo.
Solo mira el ejemplo de tu librería y observa cuando no entrega valor y le agregas las dos instrucciones.

  // Check if any reads failed and exit early (to try again).
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println(F("Failed to read from DHT sensor!"));
    digitalWrite(powerDHT22, LOW);      // apago dht22
    delay(200);  // algo de demora inutil para asegurarnos un buen apagado.
    digitalWrite(powerDHT22, HIGH);     // enciendo dht22
    return;
  }

A esto me refería.

Esto funcionaria con el watchdog pero sin reiniciar todo el codigo??.
Solo se reinicia en pocas palabras el sensor.

No necesitas watchdog. Solo reinicia el sensor que es el que falla si la falla es la que yo te he descripto, justamente que varios sensores DHT22 fallan en forma azarosa.

Hi,
Aqui hay que tener cuidado con el DHT22 ya que algunos tienen la resistencia de pullup y algunos no la tienen. Si no la tiene entonces se la tienes que anadir. Otra cosa es que tienes que tener un tiempo de lectura a lectura si no no te va a leer. En otras palabras se tranca.

El tiempo de lectura esta @tauro0221 en el código se ven los 2000 mseg recomendados por la hoja de datos.

if (millis()-tiempo>2000)    {

La resistencia pull-up es posible que sea la responsable. En mi caso con o sin resistencia fallaba. Nunca lo desarmé para ver si la tiene o no.

Aún con sus sugerencias sigo teniendo el mismo inconveniente el código no se ejecuta correctamente.
El código se Salta algunos "if" específicamente
Esta parte

Y entonces todo el codigo se congela

A ver.. una cosa es que tus condiciones no funcionen y otra es que no entregue datos y eso lo estoy pensando yo.
Concentrémosnos en los datos.

#include <DHT.h>

#define DHTPIN 4
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

#define powerDHT22      6  // VCC del DHT22 conectado al pin 6.
// Verifica si tiene o no resistencia pull up sino agrega una de 4k7 o 10k, entre pin 4 y pin 6 en este caso.
unsigned long tiempo;

void setup() {
    Serial.begin(9600);
}

void loop() {

    if (millis()-tiempo>2000) {
        float h = dht.readHumidity();       // Leemos la Humedad
        float t = dht.readTemperature();    // Leemos la temperatura
        
        Serial.println("temperatura :");
        Serial.print(t);
        Serial.println();
        Serial.println("humedad");
        Serial.println(h);
        Serial.println();

        //--------CODIGO DE FOCO---------
        // Check if any reads failed and exit early (to try again).
        if (isnan(h) || isnan(t)) {
            Serial.println(F("Failed to read from DHT sensor!"));
            digitalWrite(powerDHT22, LOW);      // apago dht22
            delay(00);  // algo de demora inutil para asegurarnos un buen apagado.
            digitalWrite(powerDHT22, HIGH);     // enciendo dht22
            return;
        }
        tiempo = millis();
    }
}

Corre este programa, captura lo que sale por el monitor serie y hablamos.


ESTO es lo q me aparece en el monitor serial.

Funcionan bien los datos. Muy estables.
Corrige el código para que no separe lineas cuando pone los datos, a esto me refiero

        Serial.println("temperatura :");
        Serial.print(t);
        Serial.println();
        Serial.println("humedad");
        Serial.println(h);
        Serial.println(); // para separar lecturas.

Mas alla de esta pequeñez, donde esta el problema inicial? No veo que no se presenten datos o ocurre aleatoriamente?
Recordemos que este código reinicia el sensor si hubiera problemas pero como no veo la leyenda "Failed to read from DHT sensor!" asumo que no ocurre.
Ya nos dirás.

Hi,
Veo que tu mencionas que cuando prendes los focos es cuando acurre el problema. De que tamanos son lo focos ya que estos dependiendo del tamano pueede causar ruidos electromagnectico que puden causar que el micro deje de funcionar. Un dibujo de como tienes alambrado y como alimentas el sistema seria idear.

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