Categories
electrónica

Arduino + botón + debounce = ¡mi primer sketch!

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 😛

[Responder]

sucotronic Reply:

@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.

[Responder]

me puedes explicar como hacer para que el programa regrese se resete cuando presione el boton por dos segundos por favor.

[Responder]

sucotronic Reply:

@kassa, hola kassa, las modificaciones que tendrías que hacer son:

  1. establecer el tiempo de pulsación a 2 segundos
    long debounceDelay = 2000;
  2. resetear el arduino saltando a la dirección 0
    if ((millis() - lastDebounceTime) > debounceDelay) {
    asm volatile (" jmp 0");
    }

[Responder]

xabi Reply:

@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

[Responder]

sucotronic Reply:

@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??

[Responder]

sucotronic Reply:

@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.

[Responder]

Leave a Reply

Your email address will not be published. Required fields are marked *