Programa hotel Arduino + Java

Hola a todos! Hice un sistema eléctrico para controlar el encendido y apagado de luces de habitaciones de un hotel, mediante contactores y Arduino.
Luego vinculé el Arduino a un programa en Java, por puerto USB, donde me muestra con colores las habitaciones libres y ocupadas.

Arduino se encarga de enviar un String a Java y este lo interpreta y en base a eso setea el color determinado.

Aclaro que uso arduino (y no otro sistema más robusto), porque como yo tengo algo de conocimientos (no muchos) investigué un poco en internet sobre cómo vincular el programa Java con la lógica propia del sistema.

Tengo un problema: Cuando los contactores pegan y despegan, producto del campo magnético que se genera, me hacen desequilibrar el sistema porque las ondas le llegan al Arduino y deja de enviar por el puerto USB la señal. Esto sucede casi siempre.

Entonces, intenté codear un "Watchdog" para que detecte automáticamente y resetee la conexión cuando se congela el envío de datos por USB entre Arduino y PC, pero sigue sin funcionar correctamente.

Les dejo el código.

Muchas gracias de antemano por la solución que me puedan brindar.

Saludos!

Código:
//#include <WatchDog.h>

//#include <avr/wdt.h>

String pines[54];
unsigned int oldvalues[54];
unsigned int newvalues[54];
int i = 0;
String guion;
String mensaje;
int a;


void setup() {
  // put your setup code here, to run once:
 
 // wdt_disable(); // Desactivar el watchdog mientras se configura
//  wdt_enable(WDTO_2S); // Configurar a dos segundos
 
  Serial.begin(9600);
  guion = String(",");
    for(a = 0; a < 20; a++){ //inicializo todos los pines desde el 31 al 53 en input
    pinMode(a, INPUT);
    digitalWrite(a,HIGH);
    delay(100);
    } 
  for(i=0;i<20;i++){
 //   newvalues[i]  = HIGH;
    newvalues[i] = digitalRead(i);
    delay(20);
    oldvalues[i] = newvalues[i];
    delay(20);
    pines[i] = String(i);
    }
}

void loop() {
  // put your main code here, to run repeatedly:
 
  Serial.println(1);
 
  for(i=0;i<20;i++){
    newvalues[i] = digitalRead(i);
    delay(20);
    //Serial.println(String("Valor I")+ i);
    if(i==1){
    //Serial.println(String("LEYO el pin = ") +i+ String(" Valor= ")+ String(newvalues[i]));
    }
    }
 for(i=0;i<20;i++){
      delay(20);
      if(newvalues[i] != oldvalues[i]){
      delay(20); 
      mensaje = String("Pin ") + pines[i] + guion + String(" Value = ")+  newvalues[i];
      delay(20);
      Serial.println(mensaje);
      delay(20);
      oldvalues[i] = newvalues[i];
      delay(20);
      }
    }
    delay(100);

//wdt_reset(); // Actualizar el watchdog para que no produzca un reinicio
      }
 
¿Has probado a activar el watchdog justo antes de empezar la comunicación serie? Yo esperaría un par de milisegundos entre la activación del Watchdog y el envío del mensaje. Y al terminar, desactivar el Watchdog.

Es más... si el ambiente es tan ruidoso... hasta pondría el Serial.begin() también como parte del proceso del envío del mensaje.
 
El código va a ser bastante intrascendente.
Este es un tema muchísimas veces tratado en el foro; mejorar fuentes de alimentación, filtrar, bajar impedancias, rezar bastente...
La forma en la que esté realizado el cableado puede ser muy importante.

El watchdog no es la solución; normalmente se ponen varios de ellos con la esperanza de que no actuen nunca, usarlos con la certeza de que se van disparando continuamente no me parece un método admisible.
 
No creo que sea problema de software, huele más al típico error de principiante algo de programación 0 electrónica.
El error es no hacer la alimentación independiente de la lógica, de la parte de potencia, como siempre ni siquiera un esquema de lo realizado.
No es el campo magnético si fuera así no se podrían ni utilizar, el problema es que las bobinas generan sobre tensiones importantes varias veces superior a la alimentación y se pueden llevar puesto cualquier componente que no lo soporte.
Supongo(no soy adivino) que las bobinas de los contactores deben ser de 24V(por cuestiones de seguridad) manejados por un transistor adecuado ´bjt o mosfet, seguro que pusiste la base o gate directo a la salida del arduino? o pusiste un resistor como debe ser?
Y como bien te dijo trilo, la mejor manera es un opto para evitar tener masas comunes y te sacas todo el ruido de encima de una.
 
Digamos que el WD es además, no en lugar de.
O que en el funcionamiento normal no debe de funcionar nunca.
Es cómo resetear un PC, en teoría no se hace nunca, solo cuando se cuelga. Pongamos una vez al mes. Si el PC no tiene a nadie de operador es cuando viene bien un Watchdog que lo resetea sin intervención humana.
 
Atrás
Arriba