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:
01.
/*
02.
Este es un ejemplo de código para la lectura de la pulsación de un botón que
03.
controla el encendido y apagado de un led. Tiene incorporado un "debouncer"
04.
que no procesa la pulsación hasta que está estable durante una cantidad de
05.
tiempo predeterminada.
06.
*/
07.
08.
const
int
buttonPin = 11;
// pin del pulsador
09.
const
int
ledPin = 13;
// pin del led
10.
11.
int
ledStatus =
false
;
// almacena el estado del led. Por defecto está apagado
12.
int
buttonState = 0;
// estado actual del botón
13.
int
lastButtonState = 0;
// estado del botón tras el filtrado del debounce
14.
int
lastButtonState2 = LOW;
// estado anterior para el filtrado del debounce
15.
int
reading;
// para la lectura del pin del pulsador
16.
17.
long
lastDebounceTime = 0;
// contador para el debounce
18.
long
debounceDelay = 200;
// tiempo que tiene que mantenerse estable la
19.
// señal de la pulsación
20.
21.
void
setup() {
22.
pinMode(buttonPin, INPUT);
23.
pinMode(ledPin, OUTPUT);
24.
}
25.
26.
27.
void
loop() {
28.
// lectura del pin
29.
reading = digitalRead(buttonPin);
30.
31.
// ver si ha cambiado con respecto al estado anterior
32.
if
(reading != lastButtonState2) {
33.
// resetear el contador para el debounce
34.
lastDebounceTime = millis();
35.
}
36.
37.
if
((millis() - lastDebounceTime) > debounceDelay) {
38.
// la señal se ha mantenido estable más del tiempo establecido
39.
// por lo tando se puede cambiar el valor
40.
buttonState = reading;
41.
}
42.
// almacenar la lectura para la siguiente comprobación
43.
lastButtonState2 = reading;
44.
45.
// comparar el estado del pulsador con el estado anterior
46.
if
(buttonState != lastButtonState) {
47.
// si el estado ha cambiado comprobar si ha sido porque ha sido pulsado
48.
// y no porque ha sido soltado
49.
if
(buttonState == LOW) {
50.
// el botón ha sido presionado, cambiamos el valor del led
51.
ledStatus = !ledStatus;
52.
}
53.
// almacenar el nuevo valor del botón
54.
lastButtonState = buttonState;
55.
}
56.
57.
// actualizar el estado del led de acuerdo a la variable
58.
if
(ledStatus) {
59.
digitalWrite(ledPin, HIGH);
60.
}
else
{
61.
digitalWrite(ledPin, LOW);
62.
}
63.
64.
}
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.