Arduino Nano - Botón - Pulsación Larga y Pulsación Corta

Este tutorial te enseña cómo usar Arduino Nano para detectar el pulsado largo y el pulsado corto del botón. En detalle, veremos los siguientes ejemplos:

En la última sección, aprenderemos cómo usar la técnica de anti-rebote para detectar pulsaciones de botones en aplicaciones prácticas. Para obtener más información sobre por qué es necesario el anti-rebote en los botones, consulte este artículo. Sin él, podríamos detectar erróneamente una pulsación corta del botón.

Hardware Requerido

1×Official Arduino Nano
1×Alternatively, DIYables ATMEGA328P Nano Development Board
1×Cable USB A a Mini-B
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 Arduino Nano
1×(Recomendado) Placa de Expansión Breakout para Arduino Nano
1×(Recomendado) Divisor de Alimentación para Arduino Nano

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á familiarizado con los botones (incluidos los pinouts, la funcionalidad y la programación), los siguientes tutoriales pueden ayudarle:

Diagrama de Cableado

Diagrama de cableado del botón de Arduino Nano

This image is created using Fritzing. Click to enlarge image

Ver La mejor forma de alimentar Arduino Nano y otros componentes.

En este tutorial, utilizaremos la resistencia pull-up interna. Como resultado, el estado del botón es ALTO en su estado normal y BAJO cuando se presiona.

Cómo detectar pulsación corta

Calculamos el intervalo entre los eventos de pulsación y liberación. Si la duración es menor que un tiempo predefinido, entonces se identifica el evento de pulsación corta.

Especifica la duración de una pulsación corta.

const int SHORT_PRESS_TIME = 500; // 500 milliseconds
  • Identificar cuándo se ha pulsado el botón y registrar la hora en que se pulsó.
if(prev_button_state == HIGH && button_state == LOW) time_pressed = millis();
  • Detectar cuándo se suelta el botón y registrar el momento de la liberación.
if(prev_button_state == LOW && button_state == HIGH) time_released = millis();
  • Presión
  • Calcule la duración y la cantidad de presión aplicada.
long press_duration = time_released - time_pressed;
  • Compara la duración de la pulsación con el tiempo de pulsación corto especificado para identificar una pulsación corta.
if( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected");

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

/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-button-long-press-short-press */ const int BUTTON_PIN = 2; // The number of the pushbutton pin const int 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 time_pressed = 0; unsigned long time_released = 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 time_pressed = millis(); else if(prev_button_state == LOW && button_state == HIGH) { // button is released time_released = millis(); long press_duration = time_released - time_pressed; 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

  • Carga el código al Arduino Nano usando el IDE de Arduino.
  • Presiona el botón brevemente varias veces.
  • Verifica la salida en el monitor serie.
COM6
Send
A short press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ Nota:

El Monitor Serial puede mostrar múltiples detecciones de pulsaciones cortas para una sola pulsación. Este es el comportamiento esperado del botón, conocido como el “fenómeno de rebote”. Abordaremos este problema en la parte final de este tutorial.

Cómo detectar una pulsación larga

Hay dos escenarios para detectar una pulsación larga:

  • El evento de pulsación larga se identifica una vez que el botón ha sido soltado.
  • El evento de pulsación larga se identifica mientras el botón está presionado, incluso antes de que haya sido soltado.
  • I. Para la aplicación inicial, calcularemos el período de tiempo entre los eventos de pulsación y liberación. 2. Si la duración es mayor que una cantidad predeterminada de tiempo, entonces se identifica el evento de pulsación larga.

En el segundo caso de uso, cuando se pulsa el botón, el tiempo de pulsación se mide de forma continua y se verifica el evento de pulsación prolongada hasta que se suelte el botón. Mientras se mantiene pulsado el botón, si la duración excede un tiempo predefinido, se detecta el evento de pulsación prolongada.

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

/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-button-long-press-short-press */ const int BUTTON_PIN = 2; // The number of the pushbutton pin const int 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 time_pressed = 0; unsigned long time_released = 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 time_pressed = millis(); else if(prev_button_state == LOW && button_state == HIGH) { // button is released time_released = millis(); long press_duration = time_released - time_pressed; 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

  • Sube el código al Arduino Nano usando el IDE de Arduino.
  • Espera un segundo y luego pulsa y suelta el botón.
  • Consulta 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 identifica cuando se suelta el botón.

Código de Arduino Nano para detectar pulsación prolongada durante la pulsación

/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-button-long-press-short-press */ const int BUTTON_PIN = 2; // The number of the pushbutton pin const int 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 time_pressed = 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 time_pressed = 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() - time_pressed; 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

  • Sube el código al Arduino Nano usando el IDE de Arduino.
  • Presiona y mantén presionado el botón durante unos segundos.
  • Verifica la salida en el Monitor Serial.
COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

El evento de mantener pulsado solo se registra cuando el botón no ha sido liberado.

Cómo Detectar Tanto una Pulsación Larga como una Pulsación Corta

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

/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-button-long-press-short-press */ const int BUTTON_PIN = 2; // The number of the pushbutton pin const int SHORT_PRESS_TIME = 1000; // 1000 milliseconds const int 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 time_pressed = 0; unsigned long time_released = 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 time_pressed = millis(); else if(prev_button_state == LOW && button_state == HIGH) { // button is released time_released = millis(); long press_duration = time_released - time_pressed; 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

  • Sube el código al Arduino Nano usando el IDE de Arduino.
  • Presiona el botón durante un corto o un largo periodo de tiempo.
  • Verifica la salida en el Monitor Serial.

※ Nota:

El Monitor Serial puede mostrar múltiples detecciones de pulsaciones cortas cuando se realiza una pulsación larga. Este es el comportamiento esperado del botón y se le conoce como el "fenómeno de rebote". Una solución a este problema se proporcionará en la sección de conclusiones de este tutorial.

Pulsación corta y pulsación larga durante la pulsación

/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-button-long-press-short-press */ const int BUTTON_PIN = 2; // The number of the pushbutton pin const int SHORT_PRESS_TIME = 1000; // 1000 milliseconds const int 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 time_pressed = 0; unsigned long time_released = 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 time_pressed = millis(); is_pressing = true; is_long_detected = false; } else if(prev_button_state == LOW && button_state == HIGH) { // button is released is_pressing = false; time_released = millis(); long press_duration = time_released - time_pressed; 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() - time_pressed; 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

  • Carga el código al Arduino Nano usando el IDE de Arduino.
  • Mantén pulsado el botón durante un tiempo largo y luego durante un tiempo corto.
  • Consulta el resultado en el Monitor Serial.

※ Nota:

El Monitor Serial puede detectar múltiples pulsaciones cortas cuando se realiza una pulsación prolongada. Este es el comportamiento esperado del botón y se conoce como el “fenómeno de rebote”. Este problema se abordará en la sección final de este tutorial.

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

Es esencial implementar el antirrebote en el botón en numerosas aplicaciones.

La eliminación del rebote puede ser complicada, especialmente cuando hay varios botones involucrados. Para hacerlo más sencillo para los principiantes, hemos desarrollado una biblioteca, conocida como ezButton.

Usaremos esta biblioteca en los códigos que aparecen a continuación.

Pulsación corta y pulsación larga con eliminación de rebote tras soltar

/* * Este código de Arduino Nano fue desarrollado por es.newbiely.com * Este código de Arduino Nano se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino-nano/arduino-nano-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(2); // create ezButton object for pin 2 unsigned long time_pressed = 0; unsigned long time_released = 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()) time_pressed = millis(); if(button.isReleased()) { time_released = millis(); long press_duration = time_released - time_pressed; 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

  • Instala la biblioteca ezButton.
  • Consulta Cómo hacerlo para obtener instrucciones.
  • Carga el código en Arduino Nano usando el IDE de Arduino.
  • Presiona y mantén presionado el botón durante un período corto o largo.
  • Consulta los resultados en el Monitor Serial.

Pulsación corta y pulsación larga con antirrebote durante la pulsación

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

Pasos R\u00e1pidos

  • Incluye la biblioteca ezButton en tu proyecto. Consulta Cómo para instrucciones.
  • Compila y sube el código a tu placa Arduino Nano usando el IDE de Arduino.
  • Mantén pulsado el botón durante un periodo corto o prolongado.
  • Consulta la salida 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 necesita la pulsación larga y la pulsación corta

  • Para minimizar la cantidad de botones, un solo botón puede tener múltiples funciones. Por ejemplo, una pulsación corta se puede usar para cambiar el modo de operación, mientras que una pulsación larga se puede usar para apagar el dispositivo.
  • La pulsación prolongada se utiliza para evitar activaciones accidentales. Por ejemplo, algunos dispositivos usan un botón para el restablecimiento de fábrica. Si se pulsa involuntariamente, podría ser peligroso. Para evitar esto, el dispositivo está diseñado para que el restablecimiento de fábrica solo se active cuando el botón se mantiene presionado durante un tiempo determinado (p. ej. 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!