Entrada digital se activa sola

Hola a todos. Tengo un problema con las entradas digitales del Arduino Nano. Antes que nada les comento de que se trata.
Diseñe un circuito eléctrico para añadir limites de desplazamiento de un puente grúa de 25 toneladas.
Este circuito esta compuesto de 2 sensores fotoeléctricos (uno para cada límite), 2 relés 4 inversores de 24 vdc (que funcionan como repetidores de señal de los sensores), 1 fuente ajustable de 220vca/24vdc, 1 Arduino nano, 1 regulador de voltaje step down LM2596 , y 1 módulo relé de dos canales.
El sketch es simple (si es necesario subirlo, lo subo). Pero básicamente lee las entradas digitales 2 y 3 ( que provienen de los relés repetidores de los sensores fotoeléctricos ) estas entradas estan configuradas como INPUT_PULLUP .
Al recibir la señal de estos pines ( 0 logico o LOW) activa la salida correspondiente configuradas en los pines 11 y 12 que estan conectadas al módulo relé, guarda el valor en la memoria EEPROM y espera por un nuevo pulso. Ese es todo el programa.
Ahora bien, el problema está en que, sin recibir pulso de los sensores, las salidas envian señal al módulo relé activando uno de ellos o ambos, de forma totalmente espontánea y sin patrón de tiempo.
Por lo que he leído, el problema viene a raiz de ruido eléctrico.
He probado con "filtrar" el ruido por software, es decir, colocando unos delays entre cada lectura de las entradas, unos 100 ms. Eso ayudo bastante, decir que estuvo funcionando un dia completo, pero luego volvió el problema.
Agradezco sus consejos y ayuda de antemano.

Estas en una instalación industrial con motores trifásicos, ruido electrico por todos lados. Debes llevar adelante todas las recomendaciones que se usan para estos casos. Cables apantallados para comenzar. Todo cable de los sensores fotolectricos hasta tu arduino debe estar con malla y la malla a tierra. No GND, tierra electrica y no la misma tierra de los motores o de la instalacion del puente grúa sino una tierra de tu equipo.
A pesar de todo esto, he visto que hay ocaciones en que ciertas cosas se escapan y los equipos fallan. Lo mejor que he visto ha sido el uso de aros de ferrite. Usarlos en los cables apantallados elimina toda posible perturbación transmisible al Arduino.
Lo mismo debes hacer con el Arduino, su fuente con núcleos de ferrite, la caja puesta a la misma tierra mencionada antes y debería ser metálica para lo cual toma las precauciones para mantener todo debidamente aislado. Usa soportes plásticos.
Puedes usar una caja metalica externa y dentro una plástica para tu comodidad (me refiero al arduino y demás elementos).
Ahora en el software:
Cada entrada debe tener rutina antirebote, yo uso Bounce2 con excelentes resultados siempre que me hace falta.

Agradezco mucho tu aporte Surbyte, como siempre.
Solo una aclaración, los sensores no van de forma directa al Arduino, sino a través de los relés de 24 vdc (repetidores de señal de los mencionados sensores) , por ende el gnd del Arduino va al común de estos relés, y de la salida del NO nuevamente hacia el Arduino, entradas 2 y 3 respectivamente.
Voy a tomar la recomendación de los cables apantallados ( alguno en particular?), en cuanto a la tierra, me seria imposible separarla de la tierra de protección de la instalación, más teniendo en cuenta que es un puente grúa, y el tablero está en altura montado sobre el mismo puente.
En breve subo el sketch y planos eléctricos de la instalación.
Con el rebote no he tenido problema.
Gracias desde ya.

Cuando digo apantallado lo mejor es cable de instrumentación, total no creo que sean muchos metros aunque en un puente grúa suele haber varios metros entre limite y limite.
La idea es ir eliminando problemas.
No entiendo porque es imposible. Puede ser dificil o costoso pero no imposible.
Busca entonces los ferrites como los que usan los cables USB. Hay unos que vienen para montar directamente sobre ambos cables.

Los sensores están montados sobre el puente, los espejos en cada limite ( ESTE y OESTE), por ende la distancia de los sensores al tablero no supera los 2 metros. De todas formas estos sensores estan separados electricamente del Arduino.
Paso a mostrarles el sketch.

#include <EEPROM.h>
int sensor1;
int sensor2;
int estado_1;
int estado_2;


void setup() {

  pinMode(2,INPUT_PULLUP);
  pinMode(3,INPUT_PULLUP);
  pinMode(4,OUTPUT);
  pinMode(5,OUTPUT);
  pinMode(6,OUTPUT);
  pinMode(7,OUTPUT);
  pinMode(8,OUTPUT);
  pinMode(9,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(11,OUTPUT);
  pinMode(12,OUTPUT);
  pinMode(13,OUTPUT);
  digitalWrite(11,EEPROM.read(0));
  digitalWrite(12,EEPROM.read(1));
  
  
}

void loop() {

   while(digitalRead(2) == 1 & digitalRead(3) == 1){
    digitalRead(2);
    digitalRead(3);
   }

   sensor1=digitalRead(2);
   delay(100);
   sensor1=digitalRead(2);

   
     while(sensor1 == 0){
      sensor1=digitalRead(2);
      estado_1=1;
     }
   
     if(sensor1 == 1 & estado_1 ==1){
      digitalWrite(11,!digitalRead(11));
      EEPROM.write(0,digitalRead(11));
      estado_1=0;
      delay(20);
      }

     
   sensor2=digitalRead(3);
   delay(100);
   sensor2=digitalRead(3);
   
     while(sensor2 == 0){
      sensor2=digitalRead(3);
      estado_2=1;
     }
   
     if(sensor2 == 1 & estado_2 ==1){
      digitalWrite(12,!digitalRead(12));
      EEPROM.write(1,digitalRead(12));
      estado_2=0;
      delay(20);
      }

  
  }

A continuación los esquemas respectivos:


Ahora comparto algunas fotos del pequeño circuito anexo al tablero del puente:


No son de muy buena calidad las imagenes, pero es un pantallazo del circuito para cerrar la idea.
En cuanto al sketch, no soy experto, hice lo que tengo al alcance de mi conocimiento.

¿Está bien el esquema?
¿Estás alimentando el Nano con 24V?
Imagino que es un error del esquema.

Hola gatul, no. Los 24 vdc van hacia el LM2596 , y de alli salen unos 8 vdc regulados hacia el Arduino.

Buscate de estos
41wTLwb5ENL.AC_SR160,160
o estos que son lo mismo
image

image
De última esto
image
Si el cable baila, agrega silicona para que quede firme.

Eso es un festival de ruido, con contactores y reles.
Ahh me olvidaba, el variador, que por mas que haga bien las cosas. tmb hace su parte.
Si no me crees, coloca un osciloscopio en las entradas. Mira lo que esta pasando.

Voy a probar con los cables apantallados, como primer medida. Luego comento.
Muchas gracias por tu aporte!.

Buenos días. He llevado a cabo las recomendaciones que indico Surbyte, puse cables apantallados como se mencionó.
No así, los nucleos de ferrita.
Todo anduvo muy bien (según lo programado), 2 días, luego volvió a fallar, el modulo relay se activó intespectivamente sin llegar a nunguno de los límites.
Mi pregunta es la siguiente, hay algún otro modo de atacar el problema del ruido?
Muchas gracias desde ya.

Pusiste los cables pero no usaste una tierra independiente. De todos modos mas allá que fuera complicado montarlo, hay que aislar todo respecto del puente grua.
Yo ya te di mis consejos.
Mas no tengo.

Y te agradezco enormemente.
Lo de la tierra independiente, si, es complicadisimo. Seguiré buscando y buscando para dar con la solución.

Busca los ferrites. Aros o los que te he indicado, son maravillosos.
Recuerdo un video de una persona que tenia ruido probó todo lo que ya te dije y con los ferrites logró que el problema desapariera. Lo mostraba en un osciloscopio.
Era un inversor estático que tomaba tensión DC de unos paneles solares. Dime: donde puede haber interferencia? Y sin embargo la había. Le puso los ferrites a los cables de alimentación 24VDC y asunto resuelto.

Atento que el código de #5 tiene errores en los condicionales

while(digitalRead(2) == 1 & digitalRead(3) == 1){

debería ser

while(digitalRead(2) == 1 && digitalRead(3) == 1){

Lo mismo con

if(sensor1 == 1 & estado_1 ==1){

y

if(sensor2 == 1 & estado_2 ==1){

que deben ser

if(sensor1 == 1 && estado_1 ==1){

y

if(sensor2 == 1 && estado_2 ==1){

& es un operación a nivel de bits.
&& es una operación lógica.

Por otro lado, es buena práctica setear todos los pines no usados como salidas y a nivel alto (HIGH, 1) según recomendación de la hoja de datos del micro, incluso los analógicos (excepto A6 y A7 en el Nano porque no trabajan en modo digital), para reducir los problemas de ruido eléctrico.

Saludos

Saludos gatul! , Muchas gracias por tus correcciones y tu aporte en general!
Respecto a los condicionales, no sabia la diferencia entre & y && , si podés explicarme mejor esto te lo agradecería!
Voy a configurar todos los pines como salidas y en HIGH.
MUCHAS GRACIAS!!!

Que bueno!, Voy a probar con esto, voy a probar con cada recomendación hasta dar con la solución.
Desconocía lo grave que significaba el ruido electrico con Arduino, en realidad nunca habia armado un proyecto como este, en un entorno industrial.

Fijate si va mejor

#include <EEPROM.h>

const byte SRF1 = 2;
const byte SRF2 = 3;
const byte RELE1 = 11;
const byte RELE2 = 12;

void setup() {

  pinMode(SRF1, INPUT_PULLUP);
  pinMode(SRF2, INPUT_PULLUP);
  pinMode(RELE1, OUTPUT);
  pinMode(RELE2, OUTPUT);
      
  for(byte i = 4; i <= 10; i++){
    pinMode(i, OUTPUT);
    digitalWrite(i, HIGH);
  }
  for(byte i = A0; i <= A5; i++){ 
    pinMode(i, OUTPUT);
    digitalWrite(i, HIGH);
  }
  digitalWrite(RELE1, EEPROM.read(0));
  digitalWrite(RELE2, EEPROM.read(1));
}

void loop() {

  if(!digitalRead(SRF1)){
    digitalWrite(RELE1, !digitalRead(RELE1));
    EEPROM.write(0, digitalRead(RELE1));
    delay(100);
    while(!digitalRead(SRF1));
    delay(100);
  }

  if(!digitalRead(SRF2)){
    digitalWrite(RELE2, !digitalRead(RELE2));
    EEPROM.write(1, digitalRead(RELE2));
    delay(100);
    while(!digitalRead(SRF2));
    delay(100);
  }

}

La diferencia entre operación lógica y entre bits la encuentras por toda la red. :wink:

Saludos

Por eso siempre hay que postear todo, códigos, esquemas, fotos, etc.
Creo que tu problema era de código y @anon90500195 ya te lo resolvió.

Muchas gracias gatul, acabo de cargar tu codigo, lo probé en protoboard y va de lujo, en estos días lo estaré probando en el puente.
Mis más sinceras gracias.

Espero sea ese el problema, lo estaré probando en los siguientes días.
Muchas gracias!!!