Problema con modelos rele y accionado de aparatos a 220V

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

PERDON ME FALTO DECIR;

tengo alimentación independiente para los reyes que para el arduino, también tengo alimentación independiente para el servomotor. por lo que no es un problema de alimentación.

también probé un programa muy simple sin lcd ni nada solo con los reles y aparatos conectados a ellos y la verdad que no me dio fallo. yo creo que el fallo es que se induce ruido o algo a el control de la lcd y sensores cuando esta todo el programa junto.

de nuevo gracias soy nuevo en el foro y necesito ayuda la verdad porque ya he probado casi de todo

tengo alimentación independiente para los reyes que para el arduino, también tengo alimentación independiente para el servomotor. por lo que no es un problema de alimentación.

Todo lo que genera problemas con un LCD o el mismo arduino se debe a la alimentación.

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

No puedes usar un diodo en antiparalelo en AC.

Lo que se usan son snubbers, o sea una combinación de Resistencia de bajo valor y capacitor.

el problema es cuando conecto un ventilador de 220v y un humidifador a la salida de los modulos rele del arduino,

Evidentemente alguno de los dos provoca ruido de línea (AC). Una solución posible es que uses en lugar de RELE comunes otro de estado sólido conocidos como SSR, no son tan caros y conmutan por cruce por cero con lo que tu problema va a desaparecer.

Aca puedes ver un módulo de 4 SSR

Supongo que los GND de las fuentes de alimentación están comunicados, verdad? Este tema del ruido es realmente un problema dificil.

Desde hace tiempo me hago una pregunta que no sé responder: Tengo 8 relojes electrónicos programadores para control de un acuario:

Controlan electroválvulas de agua, solenoides de gases de alta presión (CO2), motores de 12v DC, bombas de los equipos de filtración (220v AC), ventiladores, cable calentador de 10 metros de largo alimentado con 220 v AC, iluminación con Leds de alta potencia (unos 2000 watts) y más... Y NO FALLAN NUNCA.

¿Alguien ha abierto uno de estos aparatitos o conoce el funcionamiento y sabe porqué no dan fallos? Supongo que eso nos daría pistas para nuestros proyectos Arduino, verdad?

Olvidas Alberto que ese producto que muestras tiene certificación eléctrica?
Arduino es un microcontrolador con un regulador. Usas una fuente vaya a saber de donde, sin ningún filtro RFI, sin ninguna protección con varistores, sin capacitores en el puente de diodos. No digo que todos lo tengan.

Muchas veces al desarmarlo encuentras una jaula de Faraday como los multímetros digitales que si la tienen. Veo la del mío cada vez que debo cambiar un fusible porque por torpeza quemo el fusible de 1A.

La certificación es la gran diferencia. Pero además hay un hilo donde varios foreros hicimos comentarios sobre el uso de arduino en lugares de ruido eléctrico y que solución aportó cada uno para resolverlo.

Estoy de acurdo que parece ser ruido electrico.

Si el problema es solo con el display deberias verificar que estes tomando la alimentacion hacia este lo mas cercano posible a la fuente de alimentacion. Tambien podrias agregar un capacitor electrolitico y uno ceramico (de tantalio mejor ahun, por su baja ESR) entre los pines + y - del LCD.

Seria bueno si compartes fotos de la instalacion, quiza nos de una pista.

Hola Buen día. Tengo el mismo inconveniente… Quisiera saber si lograron la solución… Por favor pistas para dar solución … Les Agradezco…