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

Este tutorial ensina como usar o Arduino Nano para detectar a pressão longa e a pressão curta de um botão. Em detalhes, vamos passar pelos seguintes exemplos:

Na última seção, vamos aprender como usar o debounce para detectar pressionamentos de botão em aplicações práticas. Para saber mais sobre por que o debouncing é necessário para botões, consulte este artigo. Sem ele, podemos detectar por engano uma pressão curta do botão.

Hardware Necessário

1×Official Arduino Nano
1×Alternatively, DIYables Nano V3.0 Development Board
1×Cabo USB A para Mini-B
1×Botão para Protoboard com Capa
1×Kit de Botões para Protoboard
1×Botão de Pressão para Painel
1×Módulo de Botão
1×Protoboard
1×Fios Jumper
1×(Recomendado) Placa de Expansão com Bornes de Parafuso para Arduino Nano
1×(Recomendado) Placa de Expansão Breakout para Arduino Nano
1×(Recomendado) Divisor de Alimentação para Arduino Nano

Or you can buy the following kits:

1×DIYables Sensor Kit (18 sensors/displays)
Divulgação: Alguns dos links desta seção são links de afiliado da Amazon. Podemos receber uma comissão pelas compras feitas por meio desses links, sem custo adicional para você. Agradecemos o seu apoio.

Sobre o Botão

Se você não está familiarizado com botões (incluindo pinagens, funcionamento e programação), os tutoriais a seguir podem ajudar você:

Diagrama de Ligação

Diagrama de ligação do Botão com Arduino Nano

This image is created using Fritzing. Click to enlarge image

Veja A melhor forma de alimentar o Arduino Nano e outros componentes.

Neste tutorial, vamos usar o resistor de pull-up interno. Como resultado, o estado do botão é HIGH na condição normal e LOW quando ele é pressionado.

Como Detectar a Pressão Curta

Calculamos o intervalo entre os eventos de pressionar e soltar. Se a duração for menor que um tempo predefinido, o evento de pressão curta é identificado.

Especifique a duração de uma pressão curta.

const int SHORT_PRESS_TIME = 500; // 500 milliseconds
  • Identifique quando o botão foi pressionado e registre o momento em que ele foi apertado.
if(prev_button_state == HIGH && button_state == LOW) time_pressed = millis();
  • Detecte quando o botão é solto e registre o momento da liberação.
if(prev_button_state == LOW && button_state == HIGH) time_released = millis();
  • Pressão
  • Calcule o intervalo de tempo e a quantidade de pressão aplicada.
long press_duration = time_released - time_pressed;
  • Compare a duração do pressionamento com o tempo de pressão curta especificado para identificar uma pressão curta.
if( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected");

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

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

Passos Rápidos

  • Carregue o código no Arduino Nano usando a Arduino IDE.
  • Pressione o botão rapidamente várias vezes.
  • Confira a saída no Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' on 'COM15')
New Line
9600 baud
A short press is detected
Ln 11, Col 1
Arduino Nano on COM15
2

※ Nota:

O Serial Monitor pode exibir várias detecções de pressão curta para um único pressionamento. Esse é o comportamento esperado do botão, conhecido como “fenômeno de chattering”. Vamos tratar desse problema na parte final deste tutorial.

Como Detectar a Pressão Longa

Há dois cenários para detectar uma pressão longa:

  • O evento de pressão longa é identificado depois que o botão é solto
  • O evento de pressão longa é identificado enquanto o botão está sendo mantido pressionado, mesmo antes de ser solto.
  1. Na aplicação inicial, vamos calcular o intervalo de tempo entre os eventos de pressionar e soltar. 2. Se a duração for maior que um tempo predeterminado, o evento de pressão longa é identificado.

No segundo caso de uso, quando o botão é pressionado, o tempo de pressionamento é medido continuamente e o evento de pressão longa é verificado até o botão ser solto. Enquanto o botão está sendo pressionado, se a duração ultrapassar um tempo predefinido, o evento de pressão longa é detectado.

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

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

Passos Rápidos

  • Carregue o código no Arduino Nano usando a Arduino IDE.
  • Espere um segundo e depois pressione e solte o botão.
  • Confira o resultado no Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' on 'COM15')
New Line
9600 baud
A long press is detected
Ln 11, Col 1
Arduino Nano on COM15
2

O evento de pressão longa só é identificado quando o botão é solto.

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

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

Passos Rápidos

  • Carregue o código no Arduino Nano usando a Arduino IDE.
  • Pressione e segure o botão por alguns segundos.
  • Confira a saída no Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Nano
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Nano' on 'COM15')
New Line
9600 baud
A long press is detected
Ln 11, Col 1
Arduino Nano on COM15
2

O evento de pressão longa só é registrado quando o botão não foi solto.

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

Passos Rápidos

  • Carregue o código no Arduino Nano usando a Arduino IDE.
  • Pressione o botão por pouco tempo ou por muito tempo.
  • Confira a saída no Serial Monitor.

※ Nota:

O Serial Monitor pode exibir várias detecções de pressão curta quando é feita uma pressão longa. Esse é o comportamento esperado do botão e é chamado de "fenômeno de chattering". Uma solução para esse problema será apresentada na seção final deste tutorial.

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

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

Passos Rápidos

  • Carregue o código no Arduino Nano usando a Arduino IDE.
  • Pressione o botão por muito tempo e depois por pouco tempo.
  • Confira o resultado no Serial Monitor.

※ Nota:

O Serial Monitor pode exibir várias pressões curtas detectadas quando é feita uma pressão longa. Esse é o comportamento esperado do botão e é chamado de “fenômeno de chattering”. Esse problema será tratado na seção final deste tutorial.

Pressão Longa e Pressão Curta com Debouncing

É essencial implementar o debouncing no botão em inúmeras aplicações.

O debouncing pode ser complicado, principalmente quando há vários botões envolvidos. Para facilitar para os iniciantes, desenvolvemos uma biblioteca, conhecida como ezButton.

Vamos usar essa biblioteca nos códigos abaixo.

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

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

Passos Rápidos

  • Instale a biblioteca ezButton.
  • Consulte Como Fazer para ver as instruções.
  • Carregue o código no Arduino Nano usando a Arduino IDE.
  • Pressione e segure o botão por um período curto ou longo.
  • Confira os resultados no Serial Monitor.

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

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

Passos Rápidos

  • Inclua a biblioteca ezButton no seu projeto. Consulte Como Fazer para ver as instruções.
  • Compile e carregue o código na sua placa Arduino Nano usando a Arduino IDE.
  • Pressione e segure o botão por um período curto ou longo.
  • Confira a saída no Serial Monitor.

Vídeo

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

  • Para reduzir o número de botões, um único botão pode ter várias funções. Por exemplo, uma pressão curta pode ser usada para trocar o modo de operação, enquanto uma pressão longa pode ser usada para desligar o dispositivo.
  • A pressão longa é usada para evitar acionamentos acidentais. Por exemplo, alguns dispositivos usam um botão para a restauração de fábrica. Se ele for pressionado sem querer, isso pode ser perigoso. Para evitar isso, o dispositivo é projetado para que a restauração de fábrica só seja acionada quando o botão é mantido pressionado por um certo tempo (por exemplo, 5 segundos).

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