Arduino - Botón - Pulsación larga Pulsación corta

Aprenderemos:

En las tres primeras partes, aprendemos cómo detectar en principio.

En la última parte, aprendemos cómo detectar en la práctica aplicando el antirrebote. Vea por qué necesitamos aplicar antirrebote para el botón. Sin antirrebote, podemos detectar erróneamente una pulsación corta del botón.

Acerca de Botón

Si no sabes sobre los botones (disposición de pines, cómo funcionan, cómo programarlos...), aprende sobre ellos en los siguientes tutoriales:

Diagrama de Cableado

Diagrama de cableado del botón de Arduino

This image is created using Fritzing. Click to enlarge image

En este tutorial, utilizaremos la resistencia de pull-up interna. Por lo tanto, el estado del botón es ALTO cuando está en reposo y BAJO cuando se presiona.

Cómo Detectar una Pulsación Corta

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

Veamos paso a paso:

  • Definir la duración máxima de una pulsación corta.
const int SHORT_PRESS_TIME = 500; // 500 milliseconds
  • Detectar cuando se presiona el botón y guardar el momento de la pulsación
if(lastState == HIGH && currentState == LOW) pressedTime = millis();
  • Detecta cuando se suelta el botón y guarda el tiempo de liberación
if(lastState == LOW && currentState == HIGH) releasedTime = millis();
  • Calcule la duración de la pulsación y
long pressDuration = releasedTime - pressedTime;
  • Determina la pulsación corta comparando la duración de la pulsación con el tiempo de pulsación corto definido.
if( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected");

Código de Arduino para detectar la pulsación corta

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-button-long-press-short-press */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin const int SHORT_PRESS_TIME = 500; // 500 milliseconds // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin unsigned long pressedTime = 0; unsigned long releasedTime = 0; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) // button is pressed pressedTime = millis(); else if(lastState == LOW && currentState == HIGH) { // button is released releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } // save the the last state lastState = currentState; }

Pasos R\u00e1pidos

  • Carga el código anterior en Arduino mediante el IDE de Arduino
  • Pulsa el botón varias veces de forma breve
  • Observa el resultado en el Monitor Serial
COM6
Send
A short press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ Nota:

El Monitor Serial puede mostrar varias detecciones de una pulsación corta para una sola pulsación. Este es el comportamiento normal del botón. A este comportamiento se le llama el “fenómeno de rebote”. El problema se resolverá en la última parte de este tutorial.

Cómo detectar una pulsación prolongada

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

  • El evento de pulsación larga se detecta justo después de que se suelta el botón
  • El evento de pulsación larga se detecta durante el tiempo en que se mantiene presionado el botón, incluso si el botón aún no se ha soltado

En el primer caso de uso, medimos la duración entre los eventos de pulsación y liberación. Si la duración es mayor que un tiempo definido, se detecta el evento de pulsación prolongada.

En el segundo caso de uso, después de que se presione el botón, medimos continuamente el tiempo de pulsación y comprobamos el evento de pulsación larga hasta que se libere el botón. Si la duración es mayor que un tiempo definido, se detecta el evento de pulsación larga.

Código de Arduino para detectar una pulsación larga al soltar

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-button-long-press-short-press */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin const int LONG_PRESS_TIME = 1000; // 1000 milliseconds // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin unsigned long pressedTime = 0; unsigned long releasedTime = 0; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) // button is pressed pressedTime = millis(); else if(lastState == LOW && currentState == HIGH) { // button is released releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } // save the the last state lastState = currentState; }

Pasos R\u00e1pidos

  • Carga el código anterior en Arduino usando el IDE de Arduino.
  • Presiona y suelta el botón después de un segundo.
  • Mira el resultado en el Monitor Serial.
COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

El evento de pulsación prolongada solo se detecta inmediatamente después de soltar el botón.

Código de Arduino para detectar pulsación larga durante la pulsación

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-button-long-press-short-press */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin const int LONG_PRESS_TIME = 1000; // 1000 milliseconds // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin unsigned long pressedTime = 0; bool isPressing = false; bool isLongDetected = false; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) { // button is pressed pressedTime = millis(); isPressing = true; isLongDetected = false; } else if(lastState == LOW && currentState == HIGH) { // button is released isPressing = false; } if(isPressing == true && isLongDetected == false) { long pressDuration = millis() - pressedTime; if( pressDuration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); isLongDetected = true; } } // save the the last state lastState = currentState; }

Pasos R\u00e1pidos

  • Cargar el código anterior al Arduino mediante el IDE de Arduino
  • Presiona y suelta el botón después de varios segundos.
  • Ve el resultado en el Monitor Serial
COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

El evento de pulsación prolongada solo se detecta cuando el botón aún no se ha liberado.

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 fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-button-long-press-short-press */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin const int SHORT_PRESS_TIME = 1000; // 1000 milliseconds const int LONG_PRESS_TIME = 1000; // 1000 milliseconds // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin unsigned long pressedTime = 0; unsigned long releasedTime = 0; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) // button is pressed pressedTime = millis(); else if(lastState == LOW && currentState == HIGH) { // button is released releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); if( pressDuration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } // save the the last state lastState = currentState; }

Pasos R\u00e1pidos

  • Carga el código anterior en Arduino mediante el IDE de Arduino
  • Haz una pulsación larga y una pulsación corta del botón
  • Ver el resultado en el Monitor Serial

※ Nota:

El Monitor Serial puede mostrar varias detecciones de pulsaciones cortas al realizar una pulsación larga. 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 durante la pulsación

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-button-long-press-short-press */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin const int SHORT_PRESS_TIME = 1000; // 1000 milliseconds const int LONG_PRESS_TIME = 1000; // 1000 milliseconds // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin unsigned long pressedTime = 0; unsigned long releasedTime = 0; bool isPressing = false; bool isLongDetected = false; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) { // button is pressed pressedTime = millis(); isPressing = true; isLongDetected = false; } else if(lastState == LOW && currentState == HIGH) { // button is released isPressing = false; releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } if(isPressing == true && isLongDetected == false) { long pressDuration = millis() - pressedTime; if( pressDuration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); isLongDetected = true; } } // save the the last state lastState = currentState; }

Pasos R\u00e1pidos

  • Carga el código anterior en Arduino mediante el IDE de Arduino
  • Presiona el botón de forma prolongada y de forma breve.
  • Ver el resultado en el Monitor serie

※ 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 el “fenómeno de rebote”. El problema se solucionará en la última parte de este tutorial.

Pulsación Larga y Pulsación Corta con Antirrebote

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

El anti-rebote es un poco complicado, especialmente cuando se usan varios botones. Para hacerlo mucho más fácil 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 fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-button-long-press-short-press */ #include <ezButton.h> const int SHORT_PRESS_TIME = 1000; // 1000 milliseconds const int LONG_PRESS_TIME = 1000; // 1000 milliseconds ezButton button(7); // create ezButton object that attach to pin 7; unsigned long pressedTime = 0; unsigned long releasedTime = 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()) pressedTime = millis(); if(button.isReleased()) { releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); if( pressDuration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } }

Pasos R\u00e1pidos

  • Instala la biblioteca ezButton. Consulta Cómo hacerlo
  • Carga el código anterior a Arduino mediante el IDE de Arduino
  • Realiza una pulsación larga y una pulsación corta del botón.
  • Consulta el resultado en el Monitor Serial

Pulsación corta y pulsación larga con eliminación de rebote durante la pulsación

/* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-button-long-press-short-press */ #include <ezButton.h> const int SHORT_PRESS_TIME = 1000; // 1000 milliseconds const int LONG_PRESS_TIME = 1000; // 1000 milliseconds ezButton button(7); // create ezButton object that attach to pin 7; unsigned long pressedTime = 0; unsigned long releasedTime = 0; bool isPressing = false; bool isLongDetected = 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()){ pressedTime = millis(); isPressing = true; isLongDetected = false; } if(button.isReleased()) { isPressing = false; releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } if(isPressing == true && isLongDetected == false) { long pressDuration = millis() - pressedTime; if( pressDuration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); isLongDetected = true; } } }

Pasos R\u00e1pidos

  • Instala la biblioteca ezButton. Ver Cómo hacerlo
  • Carga el código anterior a Arduino mediante el IDE de Arduino.
  • Realiza una pulsación larga y una pulsación corta en el botón.
  • Ver el resultado en el Monitor Serial

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 requieren pulsaciones prolongadas y cortas

  • Para reducir la cantidad de botones. Un solo botón puede manejar dos o más funciones. Por ejemplo, una pulsación corta para cambiar el modo de operación y una pulsación larga para apagar el dispositivo.
  • Para evitar pulsaciones cortas accidentales, se utiliza una pulsación larga. Por ejemplo, algunos dispositivos usan el botón para el restablecimiento de fábrica. Si el botón se presiona por accidente, es peligroso. Para evitarlo, el dispositivo está diseñado para realizar un restablecimiento de fábrica solo cuando la pulsación es larga (más de 5 segundos).

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