Lo que se puede ver en el dibujo es el montaje que he realizado para probar este pequeño “bosquejo” de código para Arduino. Con este código se controla el estado de un led mediante la pulsación de un botón. Para evitar el indeseado efecto rebote (debounce en inglés) también está añadido un contador que hace que solo cambie el estado del led si se mantiene estable la pulsación durante al menos 200 milisegundos.
Como demostración de su funcionamiento he aquí un muy corto vídeo:
Y por supuesto, el código de la aplicación:
/* Este es un ejemplo de código para la lectura de la pulsación de un botón que controla el encendido y apagado de un led. Tiene incorporado un "debouncer" que no procesa la pulsación hasta que está estable durante una cantidad de tiempo predeterminada. */ const int buttonPin = 11; // pin del pulsador const int ledPin = 13; // pin del led int ledStatus = false; // almacena el estado del led. Por defecto está apagado int buttonState = 0; // estado actual del botón int lastButtonState = 0; // estado del botón tras el filtrado del debounce int lastButtonState2 = LOW; // estado anterior para el filtrado del debounce int reading; // para la lectura del pin del pulsador long lastDebounceTime = 0; // contador para el debounce long debounceDelay = 200; // tiempo que tiene que mantenerse estable la // señal de la pulsación void setup() { pinMode(buttonPin, INPUT); pinMode(ledPin, OUTPUT); } void loop() { // lectura del pin reading = digitalRead(buttonPin); // ver si ha cambiado con respecto al estado anterior if (reading != lastButtonState2) { // resetear el contador para el debounce lastDebounceTime = millis(); } if ((millis() - lastDebounceTime) > debounceDelay) { // la señal se ha mantenido estable más del tiempo establecido // por lo tando se puede cambiar el valor buttonState = reading; } // almacenar la lectura para la siguiente comprobación lastButtonState2 = reading; // comparar el estado del pulsador con el estado anterior if (buttonState != lastButtonState) { // si el estado ha cambiado comprobar si ha sido porque ha sido pulsado // y no porque ha sido soltado if (buttonState == LOW) { // el botón ha sido presionado, cambiamos el valor del led ledStatus = !ledStatus; } // almacenar el nuevo valor del botón lastButtonState = buttonState; } // actualizar el estado del led de acuerdo a la variable if (ledStatus) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } }
Fuente: arduino.cc examples
8 replies on “Arduino + botón + debounce = ¡mi primer sketch!”
Bravo!!! enhorabuena churri 😀
Lo único que me suena de la instalación es la placa con puntitos, para colocar las resistencias que utilizábamos en las prácticas de Electrotécnia en el CPS 😛
@Judith, jaja, esa plaquita blanca se llama ‘protoboard’ y se usa normalmente para ensamblar prototipos. Una vez que se tienen probados se puede hacer una placa definitiva soldada.
me puedes explicar como hacer para que el programa regrese se resete cuando presione el boton por dos segundos por favor.
@kassa, hola kassa, las modificaciones que tendrías que hacer son:
long debounceDelay = 2000;
if ((millis() - lastDebounceTime) > debounceDelay) {
asm volatile (" jmp 0");
}
@sucotronic,
Hola podias responderme una pregunta…
quiero setear y resetear un programa en funcionamiente en arduino con un pulsador.
es decir como si el pulsador fuese un boton para encender el ordenador. pulsarlo y que empieze el programa. pulsarlo otra vez y que se apague.
muchas gracias de ante mano!!
espero respuesta porque me estoy bolbiendo loco y nolo consigo
@xabi, lo principal es tener en cuenta que el programa siempre va a estar arrancado en el arduino, dentro del bucle principal. Dentro del bucle, primero tienes que leer el estado del botón con el código del artículo, y si está pulsado cambiar el valor de una variable que almacena si tu código principal se va a ejecutar o no. Después de la lectura, solo tienes que poner un “if” y dentro el código que quieras. Una vez que salga del “if” se volverá a comprobar el botón, y así sucesivamente. Si lo que quieres es que el botón pare el arduino en cualquier momento del tiempo, necesitas hacer uso de interrupciones, lo cual es más avanzado.
Hola una consulta como puedo usar debounce para controlar un loop completo….osea…que al presionar un boton empiece a correr mi programa??
@Araya, lo mas sencillo es poner en un bucle la lectura del estado de la entrada, y no salir de él hasta que ésta tenga cierto valor.