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();
}
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;
}
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.
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
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.
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.