Problema Con Modulo Rele

Dejo mi codigo como quedo ahora con el Bounce, y dejo 2 fotos de la instalacion del proyecto, llevo semanas horas y horas tratando de hacerlo funcionar sin errores, pero siemnpre el mismo problema se resetea el ethernet o el mega nose cual de los 2, y se me quedan colgadas las app, no vuelven a conectarse sino reseteo arduino.

CODIGO:

#include <SPI.h>
#include <Ethernet.h>
#include "DHT.h"
#include <Wire.h>
#include <Bounce2.h>
#define DHTPIN 2     // what digital pin we're connected to
#define DHTTYPE DHT22   // DHT 22  (AM2302), AM2321
DHT dht(DHTPIN, DHTTYPE);
Bounce debouncer = Bounce(); 
int medida = 0;
int temp = 0;
int hum = 0;
int distancia = 0;
char dis[10];
char mess[15];
char tem[10];
int estadopin3 = 0;
int estadopin4 = 0;
int estadopin5 = 0;
int estadopin6 = 0;
int estadopin7 = 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(28);
EthernetClient client;
void setup() { 
  pinMode(9, INPUT_PULLUP);
  debouncer.attach(9);
  debouncer.interval(100); // interval in ms
  pinMode(8, INPUT);
  pinMode(3, OUTPUT);
  pinMode(4, OUTPUT);
  pinMode(5, OUTPUT);
  pinMode(6, OUTPUT);
  pinMode(7, 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() {   
int t = dht.readTemperature();
int h = dht.readHumidity();
int value1 = debouncer.read();   
debouncer.update();     
EthernetClient client = server.available();        
  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%i",value1,digitalRead(4),digitalRead(5),digitalRead(7),digitalRead(31),digitalRead(33),alarma,voz,digitalRead(35),digitalRead(6));        
      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')
      {
      if(digitalRead(3) == LOW && value1 == 1)
      digitalWrite(3, HIGH);
      else if(digitalRead(3) == HIGH && value1 == 1)
      digitalWrite(3, LOW);
      }
      if(c == '2')
      {
      if(digitalRead(3) == LOW && value1 == 0)
      digitalWrite(3, HIGH);
      else if(digitalRead(3) == HIGH && value1 == 0)
      digitalWrite(3, LOW);
      }
      //PIN4
      if(c == '3')
      digitalWrite(4, HIGH);
      if(c == '4')
      digitalWrite(4, LOW);
      //PIN5
      if(c == '5')
      digitalWrite(6, HIGH);
      if(c == '6')
      digitalWrite(6, LOW);
      //PIN8
      if(c == '7')
      digitalWrite(33, HIGH);
      if(c == '8')
      digitalWrite(33, LOW);
      //PIN31
      if(c == '9')
      digitalWrite(5, HIGH);
      if(c == 'm')
      digitalWrite(5, LOW);
      //PIN33
      if(c == 'n')
      digitalWrite(7, HIGH);
      if(c == 'b')
      digitalWrite(7, 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 != value1 || estadopin4 != digitalRead(4) || estadopin5 != digitalRead(5) || estadopin6 != digitalRead(6) || estadopin7 != digitalRead(7) || 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%i",value1,digitalRead(4),digitalRead(5),digitalRead(7),digitalRead(31),digitalRead(33),alarma,voz,digitalRead(35),digitalRead(6));        
      server.print(mess);
      estadopin3 = value1;
      estadopin4 = digitalRead(4);
      estadopin5 = digitalRead(5);
      estadopin6 = digitalRead(6);
      estadopin7 = digitalRead(7);
      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;
      }
  if(digitalRead(8) == HIGH && alarma == 1)
  {
      server.print("ala");
      alarma = 0;   
  }        
//Fin Loop
}
void reciboEvent(int howMany)
{
   while (Wire.available()) { // slave may send less than requested
     int c = Wire.read();
     if(medida != c)
     {
     medida = c;
     }
  }
}