Pulsadores que reciben demasiados eventos

12

Estoy escribiendo un reproductor de mp3 que escribe información en una pantalla LCD, me gustaría convertirlo de usar el teclado a usar botones, pero constantemente recibo demasiadas pulsaciones de teclas. He intentado tirar hacia arriba y hacia abajo / hacia arriba, pero sigo obteniendo el mismo resultado. ¿Alguien sabe de inmediato si se trata de un problema conocido o simplemente estoy haciendo algo mal? Oh, también estoy haciendo esto completamente en C usando cableado Pi.

linuxgnuru
fuente
1
Solo para agregar al conjunto de soluciones de software, consulte a nuestro amigo en microcontroladores. arduino.cc/en/Tutorial/Debounce
Cammy_the_block
Aquí hay un fragmento de algo que escribí hace un tiempo. if(digitalRead(data) && millis()-startTime > 10){y establece startTime cada vez que ingresa para el bucle.
Cammy_the_block
sólo me preguntaba; ¿en qué establecería exactamente startTime?
linuxgnuru
Algún contador de tiempo. Arduino tiene la función millis que da tiempo desde el inicio.
Cammy_the_block
Ah ok, también lo hace cableadoPi cablepi.com/reference/timing
linuxgnuru

Respuestas:

12

Los botones e interruptores mecánicos pueden sufrir un rebote del interruptor donde alternan rápidamente entre abierto y cerrado durante varios milisegundos.

Puede intentar eliminar el botón / interruptor en software o hardware.

Probablemente el más simple en software.

Si el nivel cambia (activado o desactivado), espere x milisegundos y lea el gpio nuevamente. Si todavía está en el nuevo estado, suponga que es una transición real. El valor de x podría ser algo así como 20.

Para soluciones de hardware, busque este tipo de publicación

joan
fuente
8

Tómese el tiempo para leer la guía de rebote de Jack Ganssle . La primera página ilustra el problema con gran detalle, y la segunda, cómo tratarlo en hardware o software. No existe un método de rebote "perfecto", ¡pero hay muchos malos!

Este es un problema con el que te encontrarás repetidamente si conectas el software con los interruptores, por lo que vale la pena tomarse el tiempo para entenderlo, y el artículo de Jack es la forma más concisa que he visto para hacerlo.

Rolinger
fuente
2

En aplicaciones que tienen un ticker del sistema, generalmente implemento un registro de desplazamiento.

unsigned char button_checker;

// inside the system ticker

button_checker <<= 1; 
button_checker += INPUT;

if (button_checker == 0xFF) 
{ 
    // button was pressed 
}

Por supuesto, debe llevar a cabo el evento de presionar un botón solo en un borde ascendente.

vsz
fuente
1
Ese es un método interesante. Se personaliza fácilmente (enmascarando los bits más significativos de button_checker) para requerir un número variable de lecturas consecutivas.
juan