Problema Con Modulo Rele

Estoy haciendo un proyecto para mi casa Domotica, tengo 2 arduino 1 mega como master y un uno como esclavo comunicados entre si por Wire, los alimentos de la siguiente manera, al mega con una fuenta de 7.5v de 1.5 a, y al uno con una fuente de 9v 1a, probe con varias fuentes de varias formas pero sigo teniendo el problema , detallo un poco mas en arduino uno solo tengo conectado un sensor ultrasonio jnst04, y en el mega un modulo rele de 16 canales , mas 1 sensor de humedad y temperatura dht22, mas un sensor de movimientos infrarojo. Manejo todo por Socket TCP , Server Chat, tengo una app en C# para Windows una app para Android con app inventor y otra app en c# para raspberry con una pantalla.

El problema es que al estar encendido al rato de estar todo funcionando los rele cada tanto se vuelven locos o se prenden 2 rele siempre solos, siempre son los mismos. Probe subiendo un codigo limpio al arduino y no hace falla, sera el codigo o problemas de ruido o corriente? Gracias.

Proba con una fuente externa paea alimentar a los rele.

El módulo de RELES consume 65mA x RELE activado, asi que si tienes los 8 al mimos tiempo estas en 8x65=520mA que supera los 350mA máximos que puede entregar el Arduino via su pin de 5V

Asi que sigue la recomendación de Naruto.

Si me olvide de aclarar que los tengo con una fuente externa de 5v 5a, probe tmb con fuentes de 5v 2a, probe de todo, puse gnd de la fuente al gnd de arduino despues saque el gnd y puse el positivo de arduino a vcc de la parte de los pines aparte de la fuente externa.

Postea tu código, ahora si me suena a problema de código.

Lee las normas y postealo como ellas lo piden o sea usando etiquetas (tags).

Llego a casa y te paso el codigo.

bueno vuelvo al tema que mencione , compre una super fuente de 5v de 40a, para alimentar todo el proyecto, pero sigo teniendo problemas lo que vi es que cuelga el ethernet shield cuando mando muy rapido prender y apagar un rele.

#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"
#include <Wire.h>
#define DHTPIN 2     // what digital pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
int medida = 0;
int temp = 0;
int hum = 0;
int distancia = 0;
char dis[10];
char mensaje1;
char mess[15];
char tem[10];
int estadopin3 = 0;
int estadopin4 = 0;
int estadopin5 = 0;
int estadopin8 = 0;
int estadopin31 = 0;
int estadopin33 = 0;
int estadopin35 = 0;
int alarma = 0;
int estadoalarma = 0;
int voz = 0;
int estadovoz = 0;
byte mac[] = {0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};
IPAddress ip(192, 168, 1, 200);
IPAddress myDns(192,168, 1, 1);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
EthernetServer server(23);
EthernetClient client;
void setup() { 

  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(8, OUTPUT);
  pinMode(31, OUTPUT);
  pinMode(33, OUTPUT);
  pinMode(22, OUTPUT);
  pinMode(33, OUTPUT);
  pinMode(35, OUTPUT);
  Ethernet.begin(mac, ip, myDns, gateway, subnet);
  server.begin();
  dht.begin();  
  Wire.begin(1);
  Wire.onReceive(reciboEvent);
}
void loop() {    
  if(digitalRead(37) == HIGH && alarma == 1)
  {
      server.print("ala");
      alarma = 0;   
  }      
EthernetClient client = server.available(); 
      int h = dht.readHumidity();
      int t = dht.readTemperature();     
  if (client) {
    if (client.available() > 0) {
      char c = client.read(); 
      //Mandar estados al iniciar app
      if(c == '*'){
      sprintf(mess,"pin%i%i%i%i%i%i%i%i%i",digitalRead(3),digitalRead(4),digitalRead(5),digitalRead(8),digitalRead(31),digitalRead(33),alarma,voz,digitalRead(35));        
      server.print(mess);
      sprintf(dis,"tin%i  ",115 - medida);
      server.print(dis);
      sprintf(tem,"tem%i  %i  ",t,h);
      server.print(tem);
      }
      //PIN3
      if(c == '1')
      digitalWrite(3, HIGH);
      if(c == '2')
      digitalWrite(3, LOW);
      //PIN4
      if(c == '3')
      digitalWrite(4, HIGH);
      if(c == '4')
      digitalWrite(4, LOW);
      //PIN5
      if(c == '5')
      digitalWrite(5, HIGH);
      if(c == '6')
      digitalWrite(5, LOW);
      //PIN8
      if(c == '7')
      digitalWrite(8, HIGH);
      if(c == '8')
      digitalWrite(8, LOW);
      //PIN31
      if(c == '9')
      digitalWrite(31, HIGH);
      if(c == 'm')
      digitalWrite(31, LOW);
      //PIN33
      if(c == 'n')
      digitalWrite(33, HIGH);
      if(c == 'b')
      digitalWrite(33, LOW);
      if(c == 'q')
      alarma = 1;
      if(c == 'w')
      alarma = 0;
      if(c == 'c')
      voz = 1;
      if(c == 'v')
      voz = 0;
      if(c == 'z')
      digitalWrite(35, HIGH);
      if(c == 'x')
      digitalWrite(35, LOW);
    } 
  
  }      
//Cambio de estado de pin3 me manda el aviso

      if(estadopin3 != digitalRead(3) || estadopin4 != digitalRead(4) || estadopin5 != digitalRead(5) || estadopin8 != digitalRead(8) || estadopin31 != digitalRead(31) || estadopin33 != digitalRead(33) || alarma != estadoalarma || voz != estadovoz || estadopin35 != digitalRead(35))
      {
      sprintf(mess,"pin%i%i%i%i%i%i%i%i%i",digitalRead(3),digitalRead(4),digitalRead(5),digitalRead(8),digitalRead(31),digitalRead(33),alarma,voz,digitalRead(35));        
      server.print(mess);
      estadopin3 = digitalRead(3);
      estadopin4 = digitalRead(4);
      estadopin5 = digitalRead(5);
      estadopin8 = digitalRead(8);
      estadopin31 = digitalRead(31);
      estadopin33 = digitalRead(33);
      estadoalarma = alarma;
      estadovoz = voz;
      estadopin35 = digitalRead(35);
      }
//Mando cambio de distancia tanque sensor
      if(distancia != medida)
      {
      sprintf(dis,"tin%i  ",115 - medida);
      server.print(dis);
      distancia = medida;
      }
//Mando cambio de temperatura
      if(temp != t || hum != h)
      {
      sprintf(tem,"tem%i  %i  ",t,h);
      server.print(tem);
      temp = t;
      hum = h;
      }
//Fin Loop
}
void reciboEvent(int howMany)
{
   while (Wire.available()) { // slave may send less than requested
     int c = Wire.read();
     if(medida != c)
     {
     medida = c;
     }
  }
}

compre una super fuente de 5v de 40a, para alimentar todo el proyecto

Pero no me vas a decir que le has puesto una fuente de 5V 40A a que? Al módulo RELE, al Arduino.
Nosotros no podemos imaginar lo que estas haciendo asi que si no lo explicas estaremos dando vueltas.

Mira el tiempo que llevas desde tu pregunta inicial, esperaba un esquema pero voy a imaginarme la situación.

No se donde tienes el Ethernet Shield.
Supongamos que lo has conectado al MEGA, entonces te digo que lo que uses para alimentar el MEGA mas el SHield ya no da para mas. O sea.. de los 5V de salida de ese MEGA no cargues nada porque no tolera mas carga. Esa es mi experiencia con el Ethernet Shield que es para mi una placa dinosaurio.. o sea del pasado.

Por otro lado, el UNO parece que lo usas con la placa modulo de 8 reles. Esa placa debe alimentarse con 5V externos... no uses el UNO para alimentar el modulo.

Asi que tendras fuente para el UNO, fuente para los reles
Fuente para el MEGA + Ethernet Shield.

Todas mejor que 500mA y para los reles supongamos que todos activos a 65*8 = 520mA una fuente que entregue mas que eso.

Espero te sirva.

Mestro, si es asi como decis, solo una cosa al modulo de 16 rele lo manejo con el mega que tiene el shield y tengo un sensor ultrasonido al mega tmb y un sensor dht22 de temperatura estos 2 los alimentos con los 5v de el mega, voy a probar alimentarlos con el uno. otra cosa compre la fuente de 40a para alimentar todo tiene 3 salidas con borneras, entonces podria usar una salida para el mega y el shield, otra para el modulo rele, y otra para el 1, lo que pasa es que es 5v la fuente si lo conecta por el puerto jack el regulador me saca un poco no?¿ lo puedo poner directo a la salida 5v de los arduinos? Sino la otra opcion es regular la fuente 1v mas tiene un regulador para disminuir o aumentar los v -1 o 1+ , y lo conecto por el jack.

Anoche lo deje funcionando al sistema, hoy me levanto para ir a trabajar y cuando quiero mandar una orden , pum shield colgado o arduino nose cual de los 2 se cuelga, tengo que reniciarlo y a veces no levante con un reset, tengo que sacarle el cqble utp del shield volver a reniciar y vuelve a levantar.

El shield es bobo no hace nada sin el procesador que lo comanda, así que el colgado es el MEGA.
Estas usando una fuente de 7.5V 1.5A para el mega y el shield. Eso debería ser suficiente.

Dos sugerencias, no se si sirvan:

	if (digitalRead(37) == HIGH && alarma == 1)  {
	    server.print("ala");
	    alarma = 0;   
	}      
    int h = dht.readHumidity();
    int t = dht.readTemperature();     
  	EthernetClient client = server.available(); 
  	if (client) {

Cambia esto o sea, EthernetClient luego de que lea el sensor DHT que demora 2 segundos en responder si mal recuerdo.

  1. Me preocupa (no se si está fundamentada) la interrupción I2C reciboEvent para leer datos enviados por el UNO.
    Prueba no usarlo para ver la estabilidad del sistema sin I2C y luego vemos si tiene o no responsabilidad.

Cuando llego a casa lo pruebo, el problema en el codigo no lo veo, por que poniendo un simple codigo de ejemplo chatserver, desconectando todo, se tilda igual el ethernet shield, osea que lo veo mas por el lado de la corriente , cuando mando muy rapido datos al arduino por ehternet como que cuelga y hayu que resetearlo, tengo el cable de red que pasa por el mismo caño de los cables de 220, estaria haciendo ruido ahi? o no afecta? por las dudas pruebo poniendo otro cable de red directo al router por fuera de la instalacion, y el tema de las fuentes probe con un monton, de 5v 40a, 7.5v 1.5a , 5v 5a, 12v 2.5a, lo unico que tmb puedo pensar es que esta jodido el mega o el ethernet shield... nose.

Me llama la atención que la placa ethernet falle.
Yo tuve ese problema hasta que alimenté externamente, es decir, me pasaba cuando lo tenía alimentado por USB.
Luego use fuente externa y reprogramaba por USB sin problemas.
Igualmente como tengo un MEGA clon, nunca se portó muy bien que digamos el MEGA. Muchas fallas de comunicación USB al punto que por un tiempo lo di por muerto y un dia revivió solo, lo que me hace pensar que la actualización de nuestros drivers muchas veces no juegan mal.

En tu caso no se que decirte pero coincido en retirar los cables de la proximidad de los de energía.
Aunque en el peor de los casos tendería a pensar que por un lado los cables trenzados estan por algo, y por otro, debería aumentar la tasa de error pero no colgar al dispositivo.

Prueba con el cable directo al Router y veamos.
Si no tienes estabilidad ahí... difícil seguir.

Bueno ahora llego a casa y sigo testeando...

Bueno saque todo deje solo ethernet usando el modulo de rele con una sola salida, y al mandar muy rapido prender y apagar desde la app empieza a colgar. Se apagan todas las luces del ethernet shield y vuelven a prender cuando vuelven a prender sigue funcionando... nose que sera.

No se cuelga, el problema es la lectura del DHT que demora 2 segundos.
es posible que escuche algunos solicitudes pero cuando necesita leer el sensor, no responderá hasta ser liberado.

Es como tener un delay.

pero ahora le saque todo y hace igual al mandar muy rapido muchos caracteres por tcp al arduino, pero ahora deje todo desconectado solo ethernet para probar si mañana cuando me levanto sigue funcionando o se vuelve a colgar.

Bueno , hoy me levante y todavia sigue funcionando sin colgarse, ahora tendria que ir testeando de donde viene el problema si es el Arduino Uno conectado con Wire, o si es el DHT22.

bueno volvi a conectar todo al sistema y sigue colgando el arduino o el ethernet shield nose que sera, estaba andando bien agrege 2 rele mas , osea de los 16 del modulo solo tenia 1 solo funcionando , ahora puse 2 mas a funcionar y vuelve a colgar todo.