Arduino Nano ESP32 - Botão - Pressão Longa e Pressão Curta

Este tutorial mostra como usar o Arduino Nano ESP32 para detectar a pressão longa e a pressão curta. Em detalhes, vamos aprender:

Sobre o Botão

Temos tutoriais específicos sobre o botão. Cada tutorial contém informações detalhadas e instruções passo a passo sobre a pinagem do hardware, o princípio de funcionamento, a ligação ao ESP32, o código do Arduino Nano ESP32... Saiba mais sobre eles nos links a seguir:

Diagrama de Ligação

Diagrama de Ligação do Botão com o Arduino Nano ESP32

This image is created using Fritzing. Click to enlarge image

Este tutorial usará o resistor pull-up interno. O estado do botão é HIGH em repouso e LOW quando pressionado.

Como Detectar a Pressão Curta

  • Meça o tempo entre os eventos de pressionado e solto.
  • Se a duração for menor que um tempo predefinido, o evento de pressão curta é detectado.

Vamos ver passo a passo:

  • Defina quanto tempo dura, no máximo, uma pressão curta
#define SHORT_PRESS_TIME 500 // 500 milliseconds
  • Detecte que o botão foi pressionado e salve o instante do pressionamento
if(prev_state == HIGH && button_state == LOW) pressed_time = millis();
  • Detecte que o botão foi solto e salve o instante da soltura
if(prev_state == LOW && button_state == HIGH) released_time = millis();
  • Calcule a duração do pressionamento
long press_duration = released_time - pressed_time;
  • Determine a pressão curta comparando a duração do pressionamento com o tempo de pressão curta definido.
if( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected");

Código do Arduino Nano ESP32 para detectar a pressão curta

/* * Este código de Arduino Nano ESP32 foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.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; }

Passos Rápidos

  • Se esta é a primeira vez que você usa o Arduino Nano ESP32, veja como configurar o ambiente do Arduino Nano ESP32 na Arduino IDE.
  • Faça o upload do código acima para o Arduino Nano ESP32 pela Arduino IDE
  • Pressione o botão rapidamente várias vezes.
  • Veja o resultado no Serial Monitor. Ele se parece com o abaixo:
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano ESP32
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
New Line
9600 baud
A short press is detected
Ln 11, Col 1
Arduino Nano ESP32 on COM15
2

※ Nota:

O Serial Monitor pode imprimir várias pressões curtas para um único pressionamento. Esse é um comportamento normal do botão. Esse comportamento é chamado de “fenômeno de chattering”. Vamos aprender como eliminar esse problema mais adiante neste tutorial.

Como Detectar a Pressão Longa

Existem dois casos de uso para detectar a pressão longa.

  • O evento de pressão longa é detectado logo depois que o botão é solto
  • O evento de pressão longa é detectado enquanto o botão está sendo pressionado.

No primeiro caso:

  • Meça a duração entre o evento de pressionado e o evento de solto.
  • Se a duração for maior que um tempo predefinido, o evento de pressão longa é detectado.

No segundo caso: enquanto o botão está sendo pressionado, faça o processo abaixo repetidamente:

  • Meça o tempo de pressionamento.
  • Se a duração for maior que o tempo predefinido, o evento de pressão longa é detectado.
  • Caso contrário, repita o processo até o botão ser solto

Código do Arduino Nano ESP32 para detectar a pressão longa ao soltar

/* * Este código de Arduino Nano ESP32 foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.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; }

Passos Rápidos

  • Se esta é a primeira vez que você usa o Arduino Nano ESP32, veja como configurar o ambiente do Arduino Nano ESP32 na Arduino IDE.
  • Faça o upload do código acima para o Arduino Nano ESP32 pela Arduino IDE
  • Pressione e solte o botão depois de um segundo.
  • Veja o resultado no Serial Monitor. Ele se parece com o abaixo:
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano ESP32
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
New Line
9600 baud
A long press is detected
Ln 11, Col 1
Arduino Nano ESP32 on COM15
2

Código do Arduino Nano ESP32 para detectar a pressão longa durante o pressionamento

/* * Este código de Arduino Nano ESP32 foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.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; }

Passos Rápidos

  • Se esta é a primeira vez que você usa o Arduino Nano ESP32, veja como configurar o ambiente do Arduino Nano ESP32 na Arduino IDE.
  • Faça o upload do código acima para o Arduino Nano ESP32 pela Arduino IDE
  • Pressione e solte o botão depois de vários segundos.
  • Veja o resultado no Serial Monitor. Ele se parece com o abaixo:
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano ESP32
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano ESP32' on 'COM15')
New Line
9600 baud
A long press is detected
Ln 11, Col 1
Arduino Nano ESP32 on COM15
2

Como Detectar a Pressão Longa e a Pressão Curta

Pressão Curta e Pressão Longa após soltar

/* * Este código de Arduino Nano ESP32 foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.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; }

Passos Rápidos

  • Se esta é a primeira vez que você usa o Arduino Nano ESP32, veja como configurar o ambiente do Arduino Nano ESP32 na Arduino IDE.
  • Faça o upload do código acima para o Arduino Nano ESP32 pela Arduino IDE
  • Pressione o botão de forma longa e de forma curta.
  • Veja o resultado no Serial Monitor. Ele se parece com o abaixo:

※ Nota:

O Serial Monitor pode mostrar várias detecções de pressão curta durante uma pressão longa. Esse é o comportamento normal do botão. Esse comportamento é chamado de “fenômeno de chattering”. O problema será resolvido na última parte deste tutorial.

Pressão Curta e Pressão Longa Durante o pressionamento

/* * Este código de Arduino Nano ESP32 foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.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; }

Passos Rápidos

  • Se esta é a primeira vez que você usa o Arduino Nano ESP32, veja como configurar o ambiente do Arduino Nano ESP32 na Arduino IDE.
  • Faça o upload do código acima para o Arduino Nano ESP32 pela Arduino IDE
  • Pressione o botão de forma longa e de forma curta.
  • Veja o resultado no Serial Monitor. Ele se parece com o abaixo:

Pressão Longa e Pressão Curta com Debounce

Em muitas aplicações, é muito importante fazer o debounce do botão.

O debounce é um pouco complicado, especialmente ao usar vários botões. Para deixar tudo simples para os iniciantes, criamos uma biblioteca chamada ezButton.

Vamos usar essa biblioteca nos códigos abaixo

Pressão Curta e Pressão Longa com debounce após soltar

/* * Este código de Arduino Nano ESP32 foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.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"); } }

Passos Rápidos

  • Se esta é a primeira vez que você usa o Arduino Nano ESP32, veja como configurar o ambiente do Arduino Nano ESP32 na Arduino IDE.
  • Instale a biblioteca ezButton. Veja Como Fazer
  • Faça o upload do código acima para o Arduino Nano ESP32 pela Arduino IDE
  • Pressione o botão de forma longa e de forma curta.
  • Veja o resultado no Serial Monitor. Ele se parece com o abaixo:

Pressão Curta e Pressão Longa com debounce Durante o Pressionamento

/* * Este código de Arduino Nano ESP32 foi desenvolvido por pt.newbiely.com * Este código de Arduino Nano ESP32 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.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; } } }

Passos Rápidos

  • Se esta é a primeira vez que você usa o Arduino Nano ESP32, veja como configurar o ambiente do Arduino Nano ESP32 na Arduino IDE.
  • Instale a biblioteca ezButton. Veja Como Fazer
  • Faça o upload do código acima para o Arduino Nano ESP32 pela Arduino IDE
  • Pressione o botão de forma longa e de forma curta.
  • Veja o resultado no Serial Monitor. Ele se parece com o abaixo:

Vídeo

Por Que Precisamos de Pressão Longa e Pressão Curta

  • Para economizar o número de botões e de pinos de entrada digital. Um único botão pode ter duas ou mais funções. Por exemplo, pressão curta para ligar a luz, pressão longa para ligar o ventilador.
  • Use a pressão longa em vez da pressão curta para evitar pressionamentos acidentais. Por exemplo, alguns tipos de dispositivos usam o botão para restaurar os padrões de fábrica. Se o botão for pressionado por acidente, isso é perigoso.

※ NOSSAS MENSAGENS

  • Fique à vontade para compartilhar o link deste tutorial. Porém, por favor, não use nosso conteúdo em outros sites. Investimos muito esforço e tempo para criar este conteúdo, por favor respeite nosso trabalho!