Ruido en las entradas digitales

Que tal muy buenas a todos, hice un llamador usando una placa arduino mega, el cual funciona con 6 botones en 6 habitaciones distintas y al tocar cada uno se ordenan en una pantalla lcd de 16x2.

Cual es el problema? los botones se activan solos, para mi es por el ruido que se genera ya que en ese lugar hay mucha estática y de cada botón a la placa de arduino hay 12 metros, llevo con este problema hace bastante tiempo y mi ultima idea fue poner un condensador en cada uno de los cables del botón lo mas cerca posible de la placa y funciono... pero solo un día, quizás haya sido por que use condensadores electrolíticos (que tienen polaridad) y no unos de cerámica como se deberían utilizar normalmente para los condensadores de desacoplo, cabe destacar que no soy técnico electrónico solo me doy maña con estas cosas por lo tanto no tengo gran conocimiento en el tema.

si alguno me pudiera dar al menos una idea de que tengo que aislar o filtrar o el cambio que deba hacer en el circuito realmente me seria de gran ayuda ya que me dieron una ultima oportunidad y si no lo soluciono para la próxima todo el trabajo que hice va a ser en vano.

Muchas gracias de antemano

Hi,
Para poderte ayudar necesitamos que nos provea el sketch que estas usando, como lo alimentas y como lo tienes alambrado, que tipo de energia usas para alimentar el mega y final por lo menos un esquematico de como lo tienes alambrado. De momento se me ocurre si tienes los pines de inputs declarados como inputs con el PULLUP seleccionado. cuando usas switches tienes que tener cuidado pues tienden a vibrar y esto hace que tengas lecturas erraticas. Pudes usar el arduino debouncer para switches.. Haz un google de como hacerlo.

esta alimentado por una fuente de 9v, el cable que estoy usando no esta recubierto por malla es un cable para porteros eléctricos, pero ya no puedo cambiarlo, el debounce lo tuve en cuenta y la conexion que hice seria algo como

pin digital
l
gnd
_(boton)l__(resistencia 10k)___5v

y el codigo es este

#include <Wire.h>
#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27,16,2);
const int boton1 = 22;
const int boton2 = 23;
const int boton3 = 24;
const int boton4 = 25;
const int boton5 = 26;
const int boton6 = 27;
const int boton7 = 32;
const int zumbador = 33;
int hab[6];
int puntero=0;
int i=0;
const int led[]={42,43,44,45,46,47};
int estado[6]={0,0,0,0,0,0};

void setup() {
  Serial.begin(9600);
  pinMode(boton1, INPUT_PULLUP);
  pinMode(boton2, INPUT_PULLUP);
  pinMode(boton3, INPUT_PULLUP);
  pinMode(boton4, INPUT_PULLUP);
  pinMode(boton5, INPUT_PULLUP);
  pinMode(boton6, INPUT_PULLUP);
  pinMode(boton7, INPUT_PULLUP);
  pinMode(33, OUTPUT);
  pinMode(42, OUTPUT);
  pinMode(43, OUTPUT);
  pinMode(44, OUTPUT);
  pinMode(45, OUTPUT);
  pinMode(46, OUTPUT);
  pinMode(47, OUTPUT);
  lcd.init();
  lcd.backlight();
  lcd.begin(16,2);
  lcd.setCursor(0,0);
  lcd.print("Numero de Box");
  
}

void loop() {
  if ( digitalRead (boton1)==0 && estado[0]==0 )
  {
    digitalWrite(42,HIGH);
    btnBounce(boton1);
    estado[0]=1;
    tone(zumbador, 261, 100);
    delay(150);
    tone(zumbador, 293, 100);
    delay(150);
    lcd.setCursor(puntero*3+0,1);
    lcd.print("1");
    hab[puntero]=1;
    puntero++;
  }
  if ( digitalRead (boton2)==0 && estado[1]==0 )
  {
    digitalWrite(43,HIGH);
    btnBounce(boton2);
    estado[1]=1;
    tone(zumbador, 261, 100);
    delay(150);
    tone(zumbador, 293, 100);
    delay(150);
    lcd.setCursor((puntero*3+0),1);
    lcd.print("2");
    hab[puntero]=2;
    puntero++;
  }
  if ( digitalRead (boton3)==0 && estado[2]==0 )
  {
    digitalWrite(44, HIGH);
    btnBounce(boton3);
    estado[2]=1;
    tone(zumbador, 261, 100);
    delay(150);
    tone(zumbador, 293, 100);
    delay(150);
    lcd.setCursor((puntero*3+0),1);
    lcd.print("3");
    hab[puntero]=3;
    puntero++;
  }
  if ( digitalRead (boton4)==0 && estado[3]==0 )
  {
    digitalWrite(45,HIGH);
    btnBounce(boton4);
    estado[3]=1;
    tone(zumbador, 261, 100);
    delay(150);
    tone(zumbador, 296, 100);
    delay(150);
    lcd.setCursor((puntero*3+0),1);
    lcd.print("4");
    hab[puntero]=4;
    puntero++;
  }
  if ( digitalRead (boton5)==0 && estado[4]==0 ) 
  {
    digitalWrite(46,HIGH);
    btnBounce(boton5);
    estado[4]=1;
    tone(zumbador, 261, 100);
    delay(150);
    tone(zumbador, 293, 100);
    delay(150);
    lcd.setCursor((puntero*3+0),1);
    lcd.print("5");
    hab[puntero]=5;
    puntero++;
  }
  if ( digitalRead (boton6)==0 && estado[5]==0 )
  {
    digitalWrite(47,HIGH);
    btnBounce(boton6);
    estado[5]=1;
    tone(zumbador, 261, 100);
    delay(150);
    tone(zumbador, 293, 100);
    delay(150);
    lcd.setCursor((puntero*3+0),1);
    lcd.print("6");
    hab[puntero]=6;
    puntero++;
  }
  if( digitalRead (boton7)==0)// cuando apretas el boton de clear
 {
    digitalWrite(led[hab[0]-1],LOW);// apago led posición 1
    btnBounce(boton7);
    estado[hab[0]-1]=0;
  for (i=0; i<puntero ; i++)
  { 
  hab[i]= hab[i+1]; // desplazo las habitaciones a la posición anterior en el display
  }
    lcd.setCursor(0,2);
    lcd.print("                                             ");
  for( i=0 ; i<puntero-1 ; i++)
  {
  lcd.setCursor((i*3+0),1);// imprime en el lcd los valores actualizados
  lcd.print(hab[i]);
  }
    puntero--;
  if(puntero<0)
  {
  puntero=0;
  estado[0]=0;
  }
}
}

void btnBounce(int btnPin)
{
  while (digitalRead(btnPin) == LOW);
  delay(250);
}

Hi,
Una cosa que puedes hacer es de anadirle un condesador de .i uf en paralelo de los contactos. Tu dices que los tiene a la entrada del mega. Otra es de trenzar los cables de los switches. Esto lo que hace es que cualquier ruido que se induce en los cable se cancele. No dices si la distancia de los cables es corta o es bastante larga.Una cosa que me llamo la atencion es que se activan solos. Eso quire decir que se esta induciendo ruidos electricos en los cables. Trata trenzandos los cables y si no vaz a tener que usar cables blindados.

estuve investigando un poco mas y creo que una buena idea seria poner un filtro de paso bajo, pero no sabría que resistencia ni condensador usar ya que no se que frecuencias debería filtrar y cuales no, como podría determinar eso?

Hi,
Que distacia hay entre el mega y los switches. Tambien que tamano de cables estas usando pues si la distancia es larga entonces debe de usar cable mas grueso.

Hi,
esta aclarado en el primer post, 12 metros

Hi.
Mi error parece que lo pase por alto. Puedes hacer una prueba. Lee el voltaje al lado de los switches. Asi se sabra si los 5 voltios se estan perdiendo por la resistencia de la distancia del cable. Posiblemente este marginal.

en realidad no puedo hacer la prueba por que el equipo esta instalado, quizás te sirva saber que el cable que utilice para los 5v y gnd son de 1,5 mm

Hi,
Podrias hacerlo entonces de leer el voltaje en el mega mientras alguien aprieta el boton. Otra cosa es de leer el voltaje en el mega con la selecion del voltaje en AC, Esto es para ver si se esta induciendo voltaje AC en el cable. Debe de leer zero.

nono a lo que voy es que el aparato no lo tengo yo si no que esta instalado en el lugar

Hi,
Lo que sucede es que estoy buscando ver si la resistencia del cable afecta que el voltaje no baje el voltaje de por lo menos 1.75 voltios. Se no baja entonces la lectura va hacer erratica debido a resistencia. Si es asi entonces vaz a necesitar cambiar el cable por uno mas gruezo o usar optocouples.

Para mi el problema es la tensión inducida en los cables por el campo electrico presente sea AC, RF pero el error esta ahí en los cables y su disposición.
Cada vez que pones cables largos uno a la par de otro actúan como antena y no hay filtro pasa bajos que funcione.
Sugerencia para ver si funciona bien:

  1. Usa cable trenzado con malla o simple cable de audio con malla. No te arriesgues con todos los botones, haz la prueba con uno primero y observa que ocurre.
  2. Si no consigues, usa cable UTP (el que se usa para conectar redes de PCs) con malla también.

Prueba de modo simple y si aún asi sigue el inconveniente. deberás montar la malla con con una jabalina a tierra.

al principio utilice un cable blindado pero no con maya, es decir cubierto con una lamina de aluminio y lo conecte directamente a la tierra del lugar, lo que seria el cable verde y amarillo de la instalación eléctrica.
si utilizo cable mayado puede que tenga resultados efectivos o seria igual que con el cable blindado?

también en ese momento la conexión de los cables estaba flotante es decir el cable del pin hacia contacto con el gnd(ahora esta conectado como aclare anteriormente), quizas por eso tampoco haya funcionado

Hi,
El que tenga maya o blindado es lo mismo. El prolema cuando usas blindado o maya es que el cable blindado va al ground del equipo que genera la senal. Aqui el problema es que el ground esta en el mega. Entonces el switche al extremo lo que hace es conectar el voltaje que suple el mega y lo conecta al ground usando el cable que viene del ground del mega. En otras palabra vaz a tener 12 metros para llevar el voltaje al switche y 12 metros para conectar el cable del ground del switche al mega. Eso quire decir que vaz a tener 24 metros de cable para llevar la senal. Como estas usando 5 voltios dc el voltaje no a poder llevar el voltaje a zero voltios en mega. Por eso te sugeri de leer el voltaje en el mega para ver si cuando cierras el contacto el voltaje baja a zero.Sino baja a zero no vaz a poderlo usar con ese cable.