ESP8266 - Botón - Antirrebote

Cuando se presiona o se suelta un botón, o se activa un interruptor, los novatos suelen asumir que su estado cambia de BAJO a ALTO o de ALTO a BAJO. En realidad, esto no es así. Debido a características mecánicas y físicas, el estado del botón (o interruptor) puede fluctuar entre BAJO y ALTO varias veces durante una única acción del usuario. Esto se conoce como parpadeo de contactos. El parpadeo de contactos puede hacer que una única pulsación se lea como varias pulsaciones, lo que provoca un mal funcionamiento en ciertas aplicaciones.

fenómeno de traqueteo

El método para evitar este problema se conoce como debouncing o debounce. Este tutorial te enseña cómo hacerlo al usar el botón con ESP8266. Aprenderemos a través de los siguientes pasos:

Hardware Requerido

1×ESP8266 NodeMCU
1×Cable USB Tipo-A a Tipo-C (para PC USB-A)
1×Cable USB Tipo-C a Tipo-C (para PC USB-C)
1×Botón para Protoboard con Tapa
1×Kit de Botón para Protoboard
1×Botón Pulsador de Panel
1×Módulo de Botón Pulsador
1×Protoboard
1×Cables Puente
1×(Recomendado) Placa de Expansión de Terminales de Tornillo para ESP8266
1×(Recomendado) Divisor de Alimentación para ESP8266 Tipo-C

Or you can buy the following kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)
Divulgación: Algunos de los enlaces proporcionados en esta sección son enlaces de afiliado de Amazon. Podemos recibir una comisión por las compras realizadas a través de estos enlaces sin costo adicional para usted. Apreciamos su apoyo.

Acerca del botón

Si no estás familiarizado con los botones (incluidos los pinouts, su funcionamiento y la programación), los siguientes tutoriales pueden ayudarte:

Diagrama de Cableado

Diagrama de cableado del botón ESP8266 NodeMCU

This image is created using Fritzing. Click to enlarge image

Para obtener m\u00e1s informaci\u00f3n, consulte Pines del ESP8266 y c\u00f3mo alimentar ESP8266 y otros componentes.

Vamos a echar un vistazo al código del ESP8266 para ambos casos, con y sin anti-rebote, y comparar sus comportamientos respectivos.

Lectura de un botón sin rebote

Antes de explorar el debouncing, eche un vistazo al código sin él y observe su comportamiento.

Pasos R\u00e1pidos

Para empezar con ESP8266 en el IDE de Arduino, siga estos pasos:

  • Consulta el tutorial cómo configurar el entorno para ESP8266 en Arduino IDE si es la primera vez que usas ESP8266.
  • Conecta los componentes como se muestran en el diagrama.
  • Conecta la placa ESP8266 a tu computadora usando un cable USB.
  • Abre Arduino IDE en tu computadora.
  • Elige la placa ESP8266 correcta, como (p. ej. NodeMCU 1.0 (ESP-12E Module)), y su puerto COM correspondiente.
  • Conecta tu ESP8266 a tu computadora usando un cable USB.
  • Inicia el IDE de Arduino, selecciona la placa y el puerto adecuados.
  • Copia el código a continuación y ábrelo en el IDE de Arduino.
/* * Este código de ESP8266 NodeMCU fue desarrollado por es.newbiely.com * Este código de ESP8266 NodeMCU se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp8266/esp8266-button-debounce */ #define BUTTON_PIN D7 // The ESP8266 pin D7 connected to button int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin void setup() { // Initialize the Serial to communicate with the Serial Monitor. Serial.begin(9600); // Configure the ESP8266 pin as a pull-up input: HIGH when the button is open, LOW when pressed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: button_state = digitalRead(BUTTON_PIN); if (prev_button_state == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if (prev_button_state == LOW && button_state == HIGH) Serial.println("The button is released"); // save the the last state prev_button_state = button_state; }
  • Haz clic en el botón Subir en el IDE de Arduino para compilar y cargar el código al ESP8266.
Subir código al IDE de Arduino
  • Abre el Monitor Serial.
  • Mantén pulsado el botón durante unos segundos, luego suéltalo.
  • Verifica la salida en el Monitor Serial.
COM6
Send
The button is pressed The button is pressed The button is pressed The button is released The button is released
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Puede que veas que, a veces, solo presionaste y soltaste el botón una vez. Sin embargo, el ESP8266 lo percibe como múltiples pulsaciones y liberaciones. Este es el fenómeno de rebote mencionado al inicio del tutorial. Veamos cómo solucionarlo en la próxima parte.

Lectura de un botón con antirrebote

El código que se muestra a continuación aplica el método llamado debounce para prevenir el fenómeno de parpadeo.

/* * Este código de ESP8266 NodeMCU fue desarrollado por es.newbiely.com * Este código de ESP8266 NodeMCU se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp8266/esp8266-button-debounce */ #define BUTTON_PIN D7 // The ESP8266 pin D7 connected to button #define DEBOUNCE_TIME 50 // The debounce time in millisecond, increase this time if it still chatters int lastSteadyState = LOW; // The previous steady state from the input pin int lastFlickerableState = LOW; // The previous flickerable state from the input pin int button_state; // The current reading from the input pin // The following variables are unsigned longs because the time, measured in // milliseconds, will quickly become a bigger number than can be stored in an int. unsigned long lastDebounceTime = 0; // The last time the output pin was toggled void setup() { // Initialize the Serial to communicate with the Serial Monitor. Serial.begin(9600); // Configure the ESP8266 pin as a pull-up input: HIGH when the button is open, LOW when pressed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: button_state = digitalRead(BUTTON_PIN); // check to see if you just pressed the button // (i.e. the input went from LOW to HIGH), and you've waited long enough // since the last press to ignore any noise: // If the switch/button changed, due to noise or pressing: if (button_state != lastFlickerableState) { // reset the debouncing timer lastDebounceTime = millis(); // save the the last flickerable state lastFlickerableState = button_state; } if ((millis() - lastDebounceTime) > DEBOUNCE_TIME) { // whatever the reading is at, it's been there for longer than the debounce // delay, so take it as the actual current state: // if the button state has changed: if(lastSteadyState == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if(lastSteadyState == LOW && button_state == HIGH) Serial.println("The button is released"); // save the the last steady state lastSteadyState = button_state; } }

Pasos R\u00e1pidos

  • Conecta los componentes como se muestra en el diagrama.
  • Conecta la placa ESP8266 a tu computadora utilizando un cable USB.
  • Abre el IDE de Arduino en tu computadora.
  • Elige la placa ESP8266 correcta, por ejemplo (p. ej. NodeMCU 1.0 (ESP-12E Module)), y su puerto COM respectivo.
  • Copia el código anterior y ábrelo con el IDE de Arduino.
  • Haz clic en el botón Subir en el IDE de Arduino para compilar y cargar el código a la ESP8266.
  • Abre el Monitor serie.
  • Mantén presionado el botón durante unos segundos, luego suéltalo.
  • Verifica el Monitor serie para ver el resultado.
COM6
Send
The button is pressed The button is released
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Como puedes observar, solo presionaste y soltaste el botón una vez. ESP8266 es capaz de detectarlo como una única pulsación y liberación, eliminando así cualquier rebote innecesario.

Lo Hicimos Fácil - Código de Rebote de Botón ESP8266 con Biblioteca

Hemos desarrollado una biblioteca, ezButton, para facilitar su uso a quienes recién comienzan, especialmente cuando utilizan varios botones. Puedes obtener más información sobre la biblioteca ezButton aquí.

Código de anti-rebote de botón para un solo botón en ESP8266

/* * Este código de ESP8266 NodeMCU fue desarrollado por es.newbiely.com * Este código de ESP8266 NodeMCU se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp8266/esp8266-button-debounce */ #include <ezButton.h> ezButton button(D7); // create ezButton object for pin D7 void setup() { Serial.begin(9600); button.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button.loop(); // MUST call the loop() function first if(button.isPressed()) Serial.println("The button is pressed"); if(button.isReleased()) Serial.println("The button is released"); }

Código de antirrebote para múltiples botones con ESP8266

/* * Este código de ESP8266 NodeMCU fue desarrollado por es.newbiely.com * Este código de ESP8266 NodeMCU se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/esp8266/esp8266-button-debounce */ #include <ezButton.h> ezButton button1(D5); // create ezButton object for pin D5 ezButton button2(D6); // create ezButton object for pin D6 ezButton button3(D7); // create ezButton object for pin D7 void setup() { Serial.begin(9600); button1.setDebounceTime(50); // set debounce time to 50 milliseconds button2.setDebounceTime(50); // set debounce time to 50 milliseconds button3.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button1.loop(); // MUST call the loop() function first button2.loop(); // MUST call the loop() function first button3.loop(); // MUST call the loop() function first if(button1.isPressed()) Serial.println("The button 1 is pressed"); if(button1.isReleased()) Serial.println("The button 1 is released"); if(button2.isPressed()) Serial.println("The button 2 is pressed"); if(button2.isReleased()) Serial.println("The button 2 is released"); if(button3.isPressed()) Serial.println("The button 3 is pressed"); if(button3.isReleased()) Serial.println("The button 3 is released"); }

El esquema del código anterior:

La ilustración del cableado del código:

La representación de las conexiones para el código:

Diagrama de cableado de la biblioteca de botones para ESP8266 NodeMCU

This image is created using Fritzing. Click to enlarge image

Video Tutorial

Estamos considerando crear tutoriales en video. Si considera que los tutoriales en video son importantes, suscríbase a nuestro canal de YouTube para motivarnos a crear los videos.

Conocimiento Adicional

  • El valor de DEBOUNCE_DELAY depende de las características físicas del botón. Cada botón puede tener un valor diferente.

Extensibilidad

La técnica de anti-rebote se puede utilizar para interruptores, sensores táctiles y más.

※ NUESTROS MENSAJES

  • No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!