Si has usado botones con Arduino alguna vez, te habrás dado cuenta de que a veces las pulsaciones se duplicaban, y ahí es dónde entra en juego el anti rebote. Esto es debido a que un botón funciona uniendo dos elementos mecánicos (contactos), para cerrar el paso de corriente, lo cual puede provocar falsos contactos. Arduino al ser muy rápido, detecta estas pulsaciones duplicadas y provocar que tu programa ejecute la pulsación del botón varias veces.

¿Cómo solucionamos este problema?

La solución al problema es muy fácil: cuando detectemos una pulsación, esperamos un tiempo antes de darla por válida. Para ello os traigo esta librería Anti rebote para Arduino y ESP8266.

¿Cómo funciona el anti rebote?

La librería básicamente genera un objeto vinculado a un botón, que ejecuta un checkeo cada loop. Este checkeo verifica si se ha pulsado el botón y en el caso de haberse pulsado lo marca como pulsado. Tras un tiempo de espera configurable, si el botón sigue en el mismo estado, devuelve como que se ha pulsado. Este proceso se repite igual para cuando se suelta el botón, para evitar también falsas despulsaciones.

¿Qué me ofrece esta librería?

En un principio esta librería ofrece básicamente lo que se ve, una función que hace que las pulsaciones de los botones no se dupliquen. Hay varias librerías que lo hacen y te puedes escribir un pequeño código que la supla, pero quise añadir además funcionalidades como detección de pulsaciones largas, o modo ráfaga. Además de que algunas de esas librerías no me convencieron por las funcionalidades o porque bloqueaban el programa mientras esperaban para confirmar la pulsación.

La detección de pulsación larga lo que hace es que tras un tiempo preestablecido (1 segundo por defecto), la librería lanza un evento indicando que se ha realizado dicha pulsación larga, por lo que puedes capturarlo y actuar en consecuencia. Esto es muy útil para por ejemplo menús contextuales, o para poner una función a una pulsación corta y otra para la larga… En mi caso añadí dicha funcionalidad para mostrar un menú de opciones al dejar pulsado un botón.

El modo ráfaga lo que hace es que cuando se deja pulsado el botón un tiempo preestablecido (1 segundo por defecto), lanza un evento indicándolo, y luego repite ese evento cada 100ms (configurable también), hasta que se suelte el botón. Esto es útil para cuando se quieran hacer botones para subir un número por ejemplo, en el que queramos evitar que el usuario tenga que pulsar 100 veces el botón y el contador vaya subiendo con tan sólo dejarlo pulsado.

Por supuesto, esta librería no está limitada sólo a botones, y ofrece un anti rebote para switches. Además sirve para cualquier evento basado en los estados LOW y HIGH de un pin digital.

También añadir, que ha sido probada en STM32 y ESP8266, funcionando perfectamente.

Descarga e instalación

La descarga de esta librería la puedes realizar a través de Bitbucket, así siempre tendrás la última versión:

https://bitbucket.org/danixu/buttondebouncer/

Una vez descargado, puedes instalarlo copiando el contenido a una carpeta en la carpeta Arduino/libraríes de Mis Documentos, la cual está localizada en C:\Users\<user>\Documents\Arduino\libraries\.

¿Cómo se usa el anti rebote?

Podría llenar varios párrafos aquí acerca de cómo se usa la librería de anti rebote, pero basándome en el principio de vagancia, no lo haré. Nah, en serio, en el código descargado desde el enlace de Bitbucket de arriba, hay una carpeta llamada examples. Esta carpeta tiene ejemplos de cómo usar la librería, y tiene la ventaja de que estará actualizada, así evitamos que el código puesto aquí no funcione por estar desactualizado.

Antes de despedirme tengo que dar las gracias al creador original de la librería, la cual me sirvió en gran medida para hacer posible la mía.

https://github.com/xoseperez/debounceevent

En mi librería sólo he quitado el bloqueo que realizaba con un delay para detectar falsos positivos y que en muchas ocasiones no interesa, y le he añadido las funcionalidades de la pulsación larga y el modo ráfaga.

Como siempre, espero que te haya gustado y te sea útil. ¡Saludos!

Daniel Carrasco

DevOps con varios años de experiencia, y arquitecto cloud con experiencia en Google Cloud Platform y Amazon Web Services. En sus ratos libres experimenta con Arduino y electrónica.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.