Incubadora de huevos

Saludos,
Aun estoy aprendiendo sobre arduino y realice un codigo para que al sensar la temperatura con un DHT22 si es menor o igual 37.4 se encienda un foco y un ventilador, y si es mayor o igual que 37.7 se apague lo antes mencionado. Tambien le agrege un RTC DS3231 para controlar el encedido de un motor de volteo a determinadas horas del día.

El problemas surge cuando le dejo funcionando por algún tiempo se cuelga aunque para solucionar eso agrege watchdog según lo que leí en varios foros y el otro problema es que a veces la temperatura sobrepasa los 37.7 llega a 40 y sigue subiendo pero los focos no se apagan, la condición deja de funcionar.

#include "DHT.h" // Libreria DHT22
#include <Wire.h>
#include <LiquidCrystal_I2C.h> // Libreria LCD_I2C
#include "Sodaq_DS3231.h"
#include <avr/wdt.h> //Libreria watchdog
#define DHTPIN 2     // Pin donde está conectado el sensor

//#define DHTTYPE DHT11   // Descomentar si se usa el DHT 11
#define DHTTYPE DHT22   // Sensor DHT22

//DEFINIR PINES
#define foco 3
#define ventilador 4
#define motor1 5
#define motor2 6

DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal_I2C lcd(0x27,16,2); // si no te sale con esta direccion  puedes usar (0x3f,16,2) || (0x27,16,2)  ||(0x20,16,2) 

char DiaSemana[][4] = {"Dom", "Lun", "Mar", "Mie", "Jue", "Vie", "Sab"};
    // La linea fija la fecha, hora y dia de la semana, se debe suprimir la linea en la segunda carga
    // Ejemplo 2018 noviembre 11, 08:00:00  dia 6-Sabado (0=Dom, 1=Lun, 2=Mar, 3=Mie, 4=Jue, 5=Vie, 6=Sab)
     //DateTime dt(2019, 12, 2, 16, 42, 0, 1);
    
void setup() {
  wdt_disable();  //Desactivar el watchdog
  Serial.begin(9600);
  Serial.println("Iniciando...");
  dht.begin(); //INICAR SENSOR
  lcd.init();//INICIAR PANTALLA PANTALLA
  lcd.backlight();
  lcd.clear();
  rtc.begin(); //INICIAR RTC DS3231
  Wire.begin();

  // La linea fija la fecha, hora y dia de la semana, se debe suprimir la linea en la segunda carga 
    //rtc.setDateTime(dt);
   
  //DECLARAR SALIDAS
  pinMode(foco, OUTPUT);
  pinMode(ventilador, OUTPUT);
  pinMode(motor1, OUTPUT);
  pinMode(motor2, OUTPUT);

  wdt_enable(WDTO_4S); //Configuracion de tiempo watchdog
}

long tiempoUltimaLectura=0;; //Para guardar el tiempo de la última lectura
void loop() {
   
   
  //---------Lectura del Sensor/CALEFACCION--------------------------
  if(millis()-tiempoUltimaLectura>2000)
  {    
      float h = dht.readHumidity(); //Leemos la Humedad
      float t = (dht.readTemperature()-0.6); //Leemos la temperatura en grados Celsius
      //----CALIBRACION---
      //----------Enviar las lecturas al LCD----------------
      lcd.setCursor(0,1);
      lcd.print("H:");
      lcd.print(h);
      lcd.print(" ");
      lcd.setCursor(8,1);
      lcd.print("T:");
      lcd.print(t);
      lcd.print("C");

      //--------CONDICION DE FOCO---------
     
      if(t <= 37.4)
               {
                digitalWrite(foco, LOW);
                digitalWrite(ventilador, LOW);
               }
          else{ 
                if(t >= 37.7){
                digitalWrite(foco, HIGH);
                digitalWrite(ventilador, HIGH);
                           }
               }
      tiempoUltimaLectura=millis(); //actualizamos el tiempo de la última lectura
  }
  //----Fin de la lectura - CALEFACCION---------------------------
    
                
  //------------CODIGO DEL RELOJ--------------
     DateTime now = rtc.now();
    lcd.setCursor(0,0);
    lcd.print(now.date(), DEC);
    lcd.print('/');
    lcd.print(now.month(), DEC);
    lcd.print('/');
    lcd.print(now.year(), DEC);
    lcd.print(' ');
    lcd.setCursor(10,0);
    lcd.print(now.hour(), DEC);
    lcd.print(':');
    lcd.print(now.minute(), DEC); 
   delay(1000);
   lcd.clear();
   int hora    =now.hour();
   int minuto  =now.minute();
   int segundo = now.second();
   
   //----------ENCENDIDO MOTOR------------
   if( ((hora == 4) && (minuto ==11)) || ((hora == 9) && (minuto ==11)) || ((hora == 14) && (minuto ==11)) || ((hora == 19) && (minuto ==11)) || ((hora == 23) && (minuto ==11)) )
                 {
                 digitalWrite(motor1,LOW);
                 digitalWrite(motor2,LOW);
                 }

             else{
                 digitalWrite(motor1,HIGH);
                 digitalWrite(motor2,HIGH);
                 }
  

wdt_reset(); //Actualziar el watchdog para que no se produzca reinicio
}

Hola Bro,

Tu problema para mi es que se te pega el relevador, usa unos de estado solido para eliminar el problema, a mi me paso lo mismo y le meti unos relevadores omron de 2amp y con eso me quite de problemas, el detalle con los reles de laminita es que si tu control de temperatura no es muy bueno este esta entrando y saliendo muy seguido y a la larga los arcos que genera pegan la laminita y normalmente es al lado de que energiza.

Saludos.

Cesarin94, el conseguir un control preciso de la temperatura es casi imposible con el sistema que usas de conmutación todo-nada con reles. Tendrás variaciones enormes arriba o debajo de tus margenes.

Debes usar la tecnologia PID que no marca unos limites Max y Min de actuación. Lo que hace es marcar la temperatura (u otros parámetros) que queremos alcanzar y mantener (setpoint)

Sin ser nada experto, hace unos meses expermenté con PID en un caso similar al tuyo.
Espero te sirva.

www.jopapa.me

Hi,
Pregunta tu esta usando el DTH22 dentro del horno?

Incubadora, no horno... y 37.7 grados te parece demasiado tauro?

La especificación dice:

Rango de temperatura: -40 a 80°C ± 0.5°C

si llega a 80 quiere decir que el material no se degradará.
Comparto la inquietud pero para < 40°C no creo que haya problema, y mas controlando una lámpara justamente en el entorno de ese valor.

La preocupacion es la cubierta de plastico que proteje el sensor. Aunque como tu menciona la temperatura esta dentro de los limites del sensor.

Yo tmb pienso lo mismo aunque en este caso debería estar controlado.
Todos sabemos que si falla algo, se va a derretir si esta muy próximo.
En eso coincidimos.