hola buenas os comento mi problema, estoy realizando un proyecto de una incubadora, en ella e incluido;
-ARDUINO MEGA
-MODULO RTC
-PANTALLA LCD
-3 RELES (resistencia termica, ventilador, humidificador)
-2 DTH22
-SERVOMOTOR
ya teng hecho todo el código e incluso el montaje, que me funcionaba sin conectar la carga a los relés o simulando esas cargas con bombillas. el problema es cuando conecto un ventilador de 220v y un humidifador a la salida de los modulos rele del arduino, pues la pantalla lcd me muestra letras chinas deja de mostrar correctamente las lecturas y el arduino se cuelga sin responder a cambios de temperatura las salidas del rele ni nada parecido.
he leído mucho otras dudas parecidas, he visto que usan un diodo en antiparalelo con esa carga que se le conectaria al modulo rele. pero normalmente siempre es para un ventilador pequeño de 12v DC p algo siempre en DC. mi pregunta es que si para AC utilizaria eso mismo, y si me resolvería ese problema de ruido que es lo que creo que tengo. un saludo y gracias a todos
adjunto el codigo:
#include "DHT.h" // incluimos la libreria para hacer funcionar el sensor//
#define DHTPIN1 26
#define DHTTYPE1 DHT22
#define DHTPIN2 22
#define DHTTYPE2 DHT22
DHT dht1(DHTPIN1, DHTTYPE1);
DHT dht2(DHTPIN2, DHTTYPE2);
int Topt = 23.30; // TEMPERATURA DE INCUBACION REQUERIDA ( huevos de gallina 37.8)
int Hopt = 90.00; // HUMEDAD DE INCUBACION REQUERIDA (en torno al 60% )
int rele1 = 30; //salida RELÉ - RESITENCIA PARA TEMPERATURA ( temp < 37´5ºC )
int rele2 = 34; // salida RELÉ - VENTILADOR ( temperatura sobrepase 37´5ºC )
int rele3 = 38; // salida RELÉ - HUMIDIFICADOR ( humedad menor < 60% )
void setup() {
Serial.begin(9600);
delay(1000);
pinMode(9, OUTPUT);
myservo.attach (9);
dht1.begin();
dht2.begin();
pinMode(rele1, OUTPUT);
pinMode(rele2, OUTPUT);
pinMode(rele3, OUTPUT);
pinMode(52, OUTPUT);
lcd.begin(20, 4);
lcd.clear();
rtc.begin();
}
// Comprobar si esta programado el horario de rotacion del servomotor con rtc
bool isScheduledON(DateTime date)
{
int weekDay = date.dayOfTheWeek();
float hours = date.hour() + date.minute() / 60.0;
// De 09:30 a 11:30 y de 21:00 a 23:00
bool hourCondition = (hours > 11.50 && hours < 12.00) || (hours > 21.00 && hours < 21.45);
// Miercoles, Sabado o Domingo
bool dayCondition = (weekDay == 5 || weekDay == 6 || weekDay == 0);
if (hourCondition && dayCondition)
{
return true;
}
return false;
}
void printDate(DateTime date)
{
Serial.print(date.year(), DEC);
Serial.print('/');
Serial.print(date.month(), DEC);
Serial.print('/');
Serial.print(date.day(), DEC);
Serial.print(" ");
Serial.print(date.hour(), DEC);
Serial.print(':');
Serial.print(date.minute(), DEC);
Serial.print(':');
Serial.print(date.second(), DEC);
Serial.println();
}
void loop() {
// Obtener fecha actual y mostrar por Serial
DateTime now = rtc.now();
printDate(now);
if (state == false && isScheduledON(now)) // Apagado y debería estar encendido
{
digitalWrite(outputPin, HIGH);
digitalWrite(52, HIGH);
Serial.print("servo pos1");
myservo.write(90);
delay (50);
state = true;
}
else if (state == true && !isScheduledON(now)) // Encendido y deberia estar apagado
{
Serial.print("servo pos2");
digitalWrite(outputPin, LOW);
myservo.write(150);
delay (100);
state = false;
}
lcd.setCursor(5,2); // POSICION FECHA EN LCD
if(now.day() < 10)
{
lcd.print("0");
}
lcd.print(now.day(), DEC); //imprime dia
lcd.print('/');
if(now.month() < 10)
{
lcd.print("0");
}
lcd.print(now.month(), DEC); //imprime mes
lcd.print('/');
lcd.print(now.year(), DEC); //imprime el año
lcd.setCursor(6,3); // POSICION FECHA EN LCD
if(now.hour() < 10)
{
lcd.print("0");
}
lcd.print(now.hour(), DEC); //imprime hora
lcd.print(':');
if(now.minute() < 10)
{
lcd.print("0");
}
lcd.print(now.minute(), DEC); //imprime minutos
lcd.print(':');
if(now.second() < 10)
{
lcd.print("0");
}
lcd.print(now.second(), DEC); //imprime segundos
// Reading humidity dth1
float h1 = dht1.readHumidity();
if (h1 >= Hopt) // Lectura de Humedad mayor que deseada
{
digitalWrite(38,HIGH); // salida humidificador OFF
}
if( h1 < Hopt) // lectura temperatura dth22-1 menor T-opt
{
digitalWrite(30,LOW); // salida humidificador ON
}
// Reading temperature as Celsius
float t1 = dht1.readTemperature();
if (t1 >= Topt) // lectura temperatura mayor T-opt
{
digitalWrite(30,HIGH); // Salida temperatura OFF
digitalWrite(34,LOW); // Salida ventilador ON
}
if(t1 <Topt) // lectura temperatura dth22-1 menor T-opt
{
digitalWrite(30,LOW); // Salida temperatura ON ** Recuerda los relés van invertidos
digitalWrite(34,HIGH); // Salida ventilador off
}
// Reading temperature or humidity dth2
float h2 = dht2.readHumidity();
// Read temperature as Celsius
float t2 = dht2.readTemperature();
// problema OBSERVADO; al solo tener una resistencia de calor, y variar l calibracion de los dht22
// solo actuare sobre la temperatura con el dht22-1 pues sino sera un continuo desajuste y dara fallos del sistema
//mostrar datos en la pantalla lcd
lcd.setCursor(0,0);
lcd.print("T1.:");
lcd.print(t1);
lcd.print("C ");
lcd.print("H1:");
lcd.print(h1);
lcd.print("%");
lcd.setCursor(0,1);
lcd.print("T1.:");
lcd.print(t2);
lcd.print("C ");
lcd.print("H1:");
lcd.print(h2);
lcd.print("%");
delay(2000);
}