Arduino - Botão - Pressionamento Longo e Curto

Vamos aprender:

Nas três primeiras partes, aprendemos a detectar em teoria.

Na última parte, aprendemos a detectar na prática aplicando o debounce. Veja por que precisamos fazer o debounce do botão. Sem o debounce, podemos detectar errado o pressionamento curto do botão.

Sobre o Botão

Se você ainda não conhece o botão (pinagem, como funciona, como programar ...), aprenda sobre ele nos seguintes tutoriais:

Diagrama de Ligação

Diagrama de ligação do botão com Arduino

This image is created using Fritzing. Click to enlarge image

Neste tutorial, vamos usar o resistor de pull-up interno. Por isso, o estado do botão é HIGH normalmente e LOW quando ele está pressionado.

Como Detectar o Pressionamento Curto

Medimos o tempo entre os eventos de pressionar e soltar. Se esse tempo for menor que um tempo definido, o evento de pressionamento curto é detectado.

Vamos ver passo a passo:

  • Defina a duração máxima de um pressionamento curto
const int SHORT_PRESS_TIME = 500; // 500 milliseconds
  • Detecte que o botão foi pressionado e salve o momento do pressionamento
if(lastState == HIGH && currentState == LOW) pressedTime = millis();
  • Detecte que o botão foi solto e salve o momento em que foi solto
if(lastState == LOW && currentState == HIGH) releasedTime = millis();
  • Calcule a duração do pressionamento
long pressDuration = releasedTime - pressedTime;
  • Identifique o pressionamento curto comparando a duração do pressionamento com o tempo definido para o pressionamento curto.
if( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected");

Código Arduino para detectar o pressionamento curto

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

Passos Rápidos

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

※ Nota:

O Serial Monitor pode mostrar várias detecções de pressionamento curto para um único pressionamento. Esse é o comportamento normal do botão. Esse comportamento é chamado de “fenômeno de trepidação”. O problema será resolvido na última parte deste tutorial.

Como Detectar o Pressionamento Longo

Há dois casos de uso para detectar o pressionamento longo.

  • O evento de pressionamento longo é detectado logo depois que o botão é solto
  • O evento de pressionamento longo é detectado enquanto o botão está sendo pressionado, mesmo que o botão ainda não tenha sido solto.

No primeiro caso de uso, medimos o tempo entre os eventos de pressionar e soltar. Se esse tempo for maior que um tempo definido, o evento de pressionamento longo é detectado.

No segundo caso de uso, depois que o botão é pressionado, medimos continuamente o tempo de pressionamento e verificamos o evento de pressionamento longo até o botão ser solto. Isso acontece durante o tempo em que o botão está sendo pressionado. Se esse tempo for maior que um tempo definido, o evento de pressionamento longo é detectado.

Código Arduino para detectar o pressionamento longo ao soltar

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

Passos Rápidos

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

O evento de pressionamento longo só é detectado logo depois que o botão é solto

Código Arduino para detectar o pressionamento longo durante o pressionamento

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

Passos Rápidos

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

O evento de pressionamento longo só é detectado enquanto o botão ainda não foi solto

Como Detectar Tanto o Pressionamento Longo Quanto o Curto

Pressionamento Curto e Longo depois de soltar

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

Passos Rápidos

  • Carregue o código acima no Arduino pelo Arduino IDE
  • Faça pressionamentos longos e curtos no botão.
  • Veja o resultado no Serial Monitor

※ Nota:

O Serial Monitor pode mostrar várias detecções de pressionamento curto durante um pressionamento longo. Esse é o comportamento normal do botão. Esse comportamento é chamado de “fenômeno de trepidação”. O problema será resolvido na última parte deste tutorial.

Pressionamento Curto e Longo durante o pressionamento

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

Passos Rápidos

  • Carregue o código acima no Arduino pelo Arduino IDE
  • Faça pressionamentos longos e curtos no botão.
  • Veja o resultado no Serial Monitor

※ Nota:

O Serial Monitor pode mostrar várias detecções de pressionamento curto durante um pressionamento longo. Esse é o comportamento normal do botão. Esse comportamento é chamado de “fenômeno de trepidação”. O problema será resolvido na última parte deste tutorial.

Pressionamento Longo e Curto com Debounce

É muito importante fazer o debounce do botão em muitas aplicações.

O debounce é um pouco complicado, principalmente ao usar vários botões. Para facilitar muito para os iniciantes, criamos uma biblioteca chamada ezButton.

Vamos usar essa biblioteca nos códigos abaixo

Pressionamento Curto e Longo com debounce depois de soltar

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

Passos Rápidos

  • Instale a biblioteca ezButton. Veja Como Fazer
  • Carregue o código acima no Arduino pelo Arduino IDE
  • Faça pressionamentos longos e curtos no botão.
  • Veja o resultado no Serial Monitor

Pressionamento Curto e Longo com debounce durante o pressionamento

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

Passos Rápidos

  • Instale a biblioteca ezButton. Veja Como Fazer
  • Carregue o código acima no Arduino pelo Arduino IDE
  • Faça pressionamentos longos e curtos no botão.
  • Veja o resultado no Serial Monitor

Vídeo

Por Que Precisamos do Pressionamento Longo e Curto

  • Para economizar botões. Um único botão pode ter duas ou mais funções. Por exemplo, pressionamento curto para mudar o modo de operação e pressionamento longo para desligar o dispositivo.
  • Usar o pressionamento longo para reduzir pressionamentos curtos acidentais. Por exemplo, alguns tipos de dispositivos usam o botão para restaurar as configurações de fábrica. Se o botão for pressionado por acidente, isso é perigoso. Para evitar isso, o dispositivo é programado para só restaurar as configurações de fábrica quando o botão recebe um pressionamento longo (por exemplo, mais de 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!