Problema de diafonía en la placa Arduino Mega 2560 usando una fuente externa con relé [cerrado]

-1

simular este circuito : esquema creado usando CircuitLab

Soy nuevo en arduino. Según el foro y la guía, he conectado el circuito según el archivo adjunto, levantando las resistencias para controlar la flotación de los pines. Pero tengo el problema de los pines de conversación cruzada / flotante cada vez que enciendo / apago alguno de los interruptores que muestra el otro pin. El tema del flotador. Conectado alrededor de 17 interruptores todos según la imagen a pines arduino de 22 a 38.

int prevPinVal[17];

void setup() {
 // put your setup code here, to run once:
 for(int i=22; i<=38;i++)
 {
   pinMode(i, INPUT);
   prevPinVal[i-22] = digitalRead(i);
 }
 Serial.begin(9600);

}

void loop() {
 // put your main code here, to run repeatedly:
 int pinVal;

 for(int i=22; i<=38; i++)
 {
   pinVal = digitalRead(i);
   if(pinVal != prevPinVal[i-22])
   {
     Serial.print("<");
     Serial.print(i);
     Serial.print(",");
     Serial.print(pinVal);
     Serial.print(">");
   }
   prevPinVal[i-22] = pinVal;
 }
 Serial.println("");
 delay(1000);

}

El código utilizado es el siguiente: [! [Imagen del circuito] [2]] [2]

    
pregunta Hemant salwan

2 respuestas

-1

Puede rebotar los otros pines a, aquí hay un ejemplo donde se necesitan ocho lecturas idénticas sucesivas para validar el cambio:

int prevPinVal[17];
unsigned char debounce_buffer[17];
void setup() {
 // put your setup code here, to run once:
 for(int i=22; i<=38;i++)
 {
   pinMode(i, INPUT);
   prevPinVal[i-22] = digitalRead(i);
   debounce_buffer[i-22] = 255; //Set all bits to one (inactive)
   // The initial value is not debounced but you can use
   //the same multiple readings to set the initial value
 }
 Serial.begin(9600);

}

void loop() {
 // put your main code here, to run repeatedly:
 int pinVal;

 for(int i=22; i<=38; i++)
 {
   pinVal = digitalRead(i);
   //Shift the last reading into LSB
   debounce_buffer[i-22] = (debounce_buffer[i-22]<<1)| pinVal;
   pinVal = prevPinVal[i-22];//defaults to the old value
   // change only for eight successive identical readings 
   if (debounce_buffer[i-22]==255) pinVal = 1; 
   if (debounce_buffer[i-22]==0) pinVal = 0; 
   //Now check the value as before
   if(pinVal != prevPinVal[i-22])
   {
     Serial.print("<");
     Serial.print(i);
     Serial.print(",");
     Serial.print(pinVal);
     Serial.print(">");
   }
   prevPinVal[i-22] = pinVal;
 }
 Serial.println("");
 delay(100);// change the delay to read faster to accommodate with the multiple reading

}

El código puede optimizarse para el tamaño de la memoria ya que está utilizando un int para almacenar un poco. Los otros 15 bits no utilizados se pueden usar para rebotar.

No me optimicé para mantener el código fácil de entender.

Actualizar

También debe colocar un diodo de retorno en los relés, el pico en el voltaje de la bobina podría ser la fuente del ruido en las entradas no utilizadas.

simular este circuito : esquema creado usando CircuitLab

    
respondido por el Dorian
0

pinMode (pin, INPUT_PULLUP); // adjuntar resistencia pullup interna

    
respondido por el Brian Moreau

Lea otras preguntas en las etiquetas