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
}