Editando
Debounce
(sección)
Ir a la navegación
Ir a la búsqueda
Advertencia:
no has iniciado sesión. Tu dirección IP se hará pública si haces cualquier edición. Si
inicias sesión
o
creas una cuenta
, tus ediciones se atribuirán a tu nombre de usuario, además de otros beneficios.
Comprobación antispam. ¡
No
rellenes esto!
= Solución software, en que se basa? = La solución por software se basa en implementar un código que filtre las pulsaciones que no se mantienen estables un mínimo de x milisegundos, así sabemos que esa pulsación es la que es correcta y las demás no se tienen en cuenta. == Código para un solo botón == Después de buscar por la red un código anti-rebote me decanté por el de la web [http://blog.wikifotos.org/2010/06/07/arduino-boton-debounce-%C2%A1mi-primer-sketch/ a trastear un poco]. Encuentro que es sencillo y claro. Este código lo modificado un poco (he cambiado el nombre de algunas varaibles, funciona con las resistencias pull-up integradas en arduino y he modificado alguna tonteria mas, pero la esencia de cómo hacerlo es del sitio [http://blog.wikifotos.org/2010/06/07/arduino-boton-debounce-%C2%A1mi-primer-sketch/ a trastear un poco] <pre> //Esta programado tienendo en cuena que se usan las PULL UP integradas en Arduino. Por lo tanto //la logica esta cambiada. Es decir, cuando aprieto el boton la entrada lee LOW y cuando esta sin //apretar lee HIGH. Para cambiar la logica se tiene que cambiar: //-El flanco - si se usa PULL DOWN para el flanco de subida es HIGH y el de bajada es LOW // - si se usa PULL UP (este caso) el flanco de subida es LOW y el de bajada es HIGH //-Las variables inicializadas en HIGH deben pasar a LOW // -Aunque realmente lo importante es que botonFiltadoAnt sea inicializada con el mismo valor que botonFiltrado // y el valor de inicializado de botonSinFiltrarAnt no es relevante //Se utilizad una pareja de variables para el estado del boton actual y anterior sin filtrar y otra igual pero filtrada. //Las filtradas se usan para saber si ha habido un cambio de estado voluntario y entonces cambiar el led según el flanco //Las sin filtrar se usan para empezar a contar cuando se detecta un cambio de estado int buttonPin = 8; int ledPin = 13; byte botonSinFiltrar; byte botonSinFiltrarAnt = HIGH; byte botonFiltrado = HIGH; byte botonFiltradoAnt = HIGH; boolean estadoLed = false; long tiempo = 0; long debounceTime = 50; void setup() { pinMode(buttonPin, INPUT_PULLUP); pinMode(ledPin, OUTPUT); } void loop() { botonSinFiltrar = digitalRead(buttonPin); if(botonSinFiltrar != botonSinFiltrarAnt){ tiempo = millis(); } botonSinFiltrarAnt = botonSinFiltrar; if(millis()-tiempo > debounceTime){ botonFiltrado = botonSinFiltrar; } if(botonFiltrado != botonFiltradoAnt){ if(botonFiltrado == LOW){ //Solo se cambia el led en el flanco de subida estadoLed = !estadoLed; digitalWrite(ledPin, estadoLed); } botonFiltradoAnt = botonFiltrado; } } </pre> == Código para mas de un botón == Hay una librería llamada Bounce en [http://playground.arduino.cc/code/bounce Arduino Playground - Bounce]. Esta librería es muy útil para cuando tienes más de un botón en el circuito porqué crea un objeto para cada botón.<br/> <br/> He usado esta libreria para el proyecto [[Cronometro]] y he podido implementar las pull-up del arduino sin tener que modificar nada. La manera en la que he usado la librería es: <pre> //Declaración del objeto Bounce nombreBoton = Bounce(NumeroPin, DebounceTimeMillis); //En setup void setup(){ pinMode(NumeroPin, INPUT_PULLUP); } //Para leer el estado de un botón if(nombreBoton.update() && nombreBoton.read() == LOW){ //Se pone en LOW porque estoy trabajando con ressitencias pull up, sino seria HIGH //hacer lo que sea } </pre>
Resumen:
Ten en cuenta que todas las contribuciones a Proyectos se consideran publicadas bajo la Creative Commons Atribución-CompartirIgual (véase
Proyectos:Derechos de autor
para más información). Si no deseas que las modifiquen sin limitaciones y las distribuyan libremente, no las publiques aquí.
Al mismo tiempo, asumimos que eres el autor de lo que escribiste, o lo copiaste de una fuente en el dominio público o con licencia libre.
¡No uses textos con copyright sin permiso!
Cancelar
Ayuda de edición
(se abre en una ventana nueva)
Menú de navegación
Herramientas personales
No has accedido
Discusión
Contribuciones
Crear una cuenta
Acceder
Espacios de nombres
Página
Discusión
español
Vistas
Leer
Editar
Ver historial
Más
Buscar
Navegación
Página principal
Cambios recientes
Página aleatoria
Ayuda sobre MediaWiki
Páginas especiales
Herramientas
Lo que enlaza aquí
Cambios relacionados
Información de la página