Arduino Nano ESP32 - Botón - Pulsación larga / Pulsación corta

Este tutorial proporciona instrucciones sobre cómo usar Arduino Nano ESP32 para detectar la pulsación larga y la pulsación corta. En detalle, aprenderemos:

Acerca de Botón

Tenemos tutoriales específicos sobre el botón. Cada tutorial contiene información detallada e instrucciones paso a paso sobre el pinout de hardware, el principio de funcionamiento, la conexión de cableado al ESP32 y el código para Arduino Nano ESP32... Aprende más sobre ellos en los siguientes enlaces:

Diagrama de Cableado

Esquema de cableado de un botón para Arduino Nano ESP32

This image is created using Fritzing. Click to enlarge image

Este tutorial utilizará la resistencia pull-up interna. El estado del botón es ALTO cuando está en reposo y BAJO cuando se pulsa.

Cómo Detectar una Pulsación Corta

  • Medir el tiempo entre los eventos de pulsación y liberación.
  • Si la duración es menor que un tiempo predefinido, se detecta el evento de pulsación corta.

Veamos paso a paso:

  • Define cuánto dura la pulsación corta máxima.
#define SHORT_PRESS_TIME 500 // 500 milliseconds
  • Detectar cuándo se pulsa el botón y guardar la hora en que se pulsó
if(prev_state == HIGH && button_state == LOW) pressed_time = millis();
  • Detectar cuando se suelta el botón y guardar el tiempo de liberación.
if(prev_state == LOW && button_state == HIGH) released_time = millis();
  • Calcular la duración de la presión y
long press_duration = released_time - pressed_time;
  • Determina la pulsación corta comparando la duración de la pulsación con el tiempo de pulsación corto definido.
if( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected");

Código de Arduino Nano ESP32 para detectar la pulsación corta.

/* * Este código de Arduino Nano ESP32 fue desarrollado por es.newbiely.com * Este código de Arduino Nano ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-button-long-press-short-press */ #define BUTTON_PIN D2 // Arduino Nano ESP32 pin D2 pin connected to button #define SHORT_PRESS_TIME 500 // 500 milliseconds int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin unsigned long pressed_time = 0; unsigned long released_time = 0; void setup() { Serial.begin(9600); 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) // button is pressed pressed_time = millis(); else if (prev_button_state == LOW && button_state == HIGH) { // button is released released_time = millis(); long press_duration = released_time - pressed_time; if ( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } // save the the last state prev_button_state = button_state; }

Pasos R\u00e1pidos

COM6
Send
A short press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ Nota:

El Monitor Serial puede mostrar varias pulsaciones cortas por una sola pulsación. Esto es un comportamiento normal del botón. Este comportamiento se conoce como el “fenómeno de rebote”. Aprenderemos cómo eliminar este problema más adelante en este tutorial.

Cómo Detectar un Toque Largo

Hay dos casos de uso para detectar la pulsación larga.

  • El evento de pulsación larga se detecta justo después de que se suelte el botón.
  • El evento de pulsación larga se detecta mientras se está pulsando el botón.

En el primer caso:

  • Medir la duración entre el evento presionado y el evento liberado.
  • Si la duración es mayor que un tiempo predefinido, se detecta el evento de pulsación larga.

En el segundo caso: durante el tiempo en que se mantiene presionado el botón, realiza a continuación el siguiente proceso repetidamente:

  • Mida el tiempo de pulsación.
  • Si la duración es mayor que el tiempo predefinido, se detecta el evento de pulsación larga.
  • De lo contrario, repita el proceso hasta que se suelte el botón.

Código para Arduino Nano ESP32 para detectar pulsación larga al soltar

/* * Este código de Arduino Nano ESP32 fue desarrollado por es.newbiely.com * Este código de Arduino Nano ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-button-long-press-short-press */ #define BUTTON_PIN D2 // Arduino Nano ESP32 pin D2 pin connected to button #define LONG_PRESS_TIME 1000 // 1000 milliseconds int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin unsigned long pressed_time = 0; unsigned long released_time = 0; void setup() { Serial.begin(9600); 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) // button is pressed pressed_time = millis(); else if(prev_button_state == LOW && button_state == HIGH) { // button is released released_time = millis(); long press_duration = released_time - pressed_time; if( press_duration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } // save the the last state prev_button_state = button_state; }

Pasos R\u00e1pidos

COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Código de Arduino Nano ESP32 para detectar pulsación prolongada

/* * Este código de Arduino Nano ESP32 fue desarrollado por es.newbiely.com * Este código de Arduino Nano ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-button-long-press-short-press */ #define BUTTON_PIN D2 // Arduino Nano ESP32 pin D2 pin connected to button #define LONG_PRESS_TIME 1000 // 1000 milliseconds int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin unsigned long pressed_time = 0; bool is_pressing = false; bool is_long_detected = false; void setup() { Serial.begin(9600); 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) { // button is pressed pressed_time = millis(); is_pressing = true; is_long_detected = false; } else if(prev_button_state == LOW && button_state == HIGH) { // button is released is_pressing = false; } if(is_pressing == true && is_long_detected == false) { long press_duration = millis() - pressed_time; if( press_duration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); is_long_detected = true; } } // save the the last state prev_button_state = button_state; }

Pasos R\u00e1pidos

COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Cómo detectar tanto la pulsación larga como la pulsación corta

Pulsación corta y pulsación larga después de soltar

/* * Este código de Arduino Nano ESP32 fue desarrollado por es.newbiely.com * Este código de Arduino Nano ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-button-long-press-short-press */ #define BUTTON_PIN D2 // Arduino Nano ESP32 pin D2 pin connected to button #define SHORT_PRESS_TIME 1000 // 1000 milliseconds #define LONG_PRESS_TIME 1000 // 1000 milliseconds int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin unsigned long pressed_time = 0; unsigned long released_time = 0; void setup() { Serial.begin(9600); 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) // button is pressed pressed_time = millis(); else if (prev_button_state == LOW && button_state == HIGH) { // button is released released_time = millis(); long press_duration = released_time - pressed_time; if ( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); if ( press_duration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } // save the the last state prev_button_state = button_state; }

Pasos R\u00e1pidos

※ Nota:

El Monitor Serial puede mostrar varias detecciones de pulsaciones cortas cuando se mantiene pulsado. Este es el comportamiento normal del botón. Este comportamiento se llama “fenómeno de rebote”. El problema se resolverá en la última parte de este tutorial.

Pulsación corta y pulsación larga al pulsar

/* * Este código de Arduino Nano ESP32 fue desarrollado por es.newbiely.com * Este código de Arduino Nano ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-button-long-press-short-press */ #define BUTTON_PIN D2 // Arduino Nano ESP32 pin D2 pin connected to button #define SHORT_PRESS_TIME 1000 // 1000 milliseconds #define LONG_PRESS_TIME 1000 // 1000 milliseconds int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin unsigned long pressed_time = 0; unsigned long released_time = 0; bool is_pressing = false; bool is_long_detected = false; void setup() { Serial.begin(9600); 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) { // button is pressed pressed_time = millis(); is_pressing = true; is_long_detected = false; } else if (prev_button_state == LOW && button_state == HIGH) { // button is released is_pressing = false; released_time = millis(); long press_duration = released_time - pressed_time; if ( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } if (is_pressing == true && is_long_detected == false) { long press_duration = millis() - pressed_time; if ( press_duration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); is_long_detected = true; } } // save the the last state prev_button_state = button_state; }

Pasos R\u00e1pidos

  • Si es la primera vez que usas Arduino Nano ESP32, consulta cómo configurar el entorno para Arduino Nano ESP32 en Arduino IDE.
  • Carga el código anterior a Arduino Nano ESP32 mediante Arduino IDE
  • Realiza una pulsación larga y una pulsación corta del botón.
  • Consulta el resultado en el Monitor Serial. Se ve de la siguiente manera:

Pulsación larga y pulsación corta con antirrebote

Es muy importante eliminar el rebote del botón en muchas aplicaciones.

El anti-rebote es un poco complicado, especialmente cuando se usan varios botones. Para hacerlo más sencillo para los principiantes, creamos una biblioteca, llamada ezButton.

Usaremos esta biblioteca en los códigos siguientes.

Pulsación corta y pulsación larga con antirrebote tras la liberación

/* * Este código de Arduino Nano ESP32 fue desarrollado por es.newbiely.com * Este código de Arduino Nano ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-button-long-press-short-press */ #include <ezButton.h> #define SHORT_PRESS_TIME 1000 // 1000 milliseconds #define LONG_PRESS_TIME 1000 // 1000 milliseconds ezButton button(D2); // create ezButton object for pin Arduino Nano ESP32 pin D2 unsigned long pressed_time = 0; unsigned long released_time = 0; 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()) pressed_time = millis(); if (button.isReleased()) { released_time = millis(); long press_duration = released_time - pressed_time; if ( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); if ( press_duration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } }

Pasos R\u00e1pidos

  • Si es la primera vez que usas Arduino Nano ESP32, consulta cómo configurar el entorno para Arduino Nano ESP32 en Arduino IDE.
  • Instala la biblioteca ezButton. Consulta Cómo hacerlo
  • Carga el código anterior en Arduino Nano ESP32 a través de Arduino IDE
  • Realiza una pulsación larga y una pulsación corta del botón.
  • Consulta el resultado en el Monitor Serial. Se ve como se muestra a continuación:

Pulsación corta y pulsación larga con anti-rebote durante la pulsación

/* * Este código de Arduino Nano ESP32 fue desarrollado por es.newbiely.com * Este código de Arduino Nano ESP32 se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano-esp32/arduino-nano-esp32-button-long-press-short-press */ #include <ezButton.h> #define SHORT_PRESS_TIME 1000 // 1000 milliseconds #define LONG_PRESS_TIME 1000 // 1000 milliseconds ezButton button(D2); // create ezButton object for pin Arduino Nano ESP32 pin D2 unsigned long pressed_time = 0; unsigned long released_time = 0; bool is_pressing = false; bool is_long_detected = false; 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()) { pressed_time = millis(); is_pressing = true; is_long_detected = false; } if (button.isReleased()) { is_pressing = false; released_time = millis(); long press_duration = released_time - pressed_time; if ( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } if (is_pressing == true && is_long_detected == false) { long press_duration = millis() - pressed_time; if ( press_duration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); is_long_detected = true; } } }

Pasos R\u00e1pidos

  • Si esta es la primera vez que usas Arduino Nano ESP32, consulta cómo configurar el entorno para Arduino Nano ESP32 en Arduino IDE.
  • Instala la biblioteca ezButton. Ver Cómo hacerlo
  • Carga el código anterior al Arduino Nano ESP32 a través del IDE de Arduino.
  • Realiza una pulsación larga y una pulsación corta del botón.
  • Consulta el resultado en el Monitor Serial. Se muestra a continuación:

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.

Por qué se necesitan pulsaciones largas y cortas

  • Para reducir la cantidad de botones y pines de entrada digital. Un solo botón puede cumplir dos o más funciones. Por ejemplo, una pulsación corta para encender la luz, una pulsación larga para encender el ventilador.
  • Utiliza la pulsación larga en lugar de la pulsación corta para evitar pulsar el botón por accidente. Por ejemplo, algunos tipos de dispositivos utilizan el botón para el restablecimiento de fábrica. Si se pulsa el botón por accidente, es peligroso.

※ 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!