ESP8266 - Botão - Debounce

Quando um botão é pressionado ou solto, ou uma chave é acionada, os iniciantes costumam achar que o estado muda de LOW para HIGH ou de HIGH para LOW. Na realidade, não é isso que acontece. Por causa de características mecânicas e físicas, o estado do botão (ou da chave) pode oscilar entre LOW e HIGH várias vezes em uma única ação do usuário. Isso é conhecido como chattering. O chattering pode fazer com que um único aperto seja lido como vários apertos, causando mau funcionamento em certas aplicações.

fenômeno de chattering

O método para evitar esse problema é chamado de debouncing ou debounce. Este tutorial ensina você a fazer isso ao usar o botão com o ESP8266. Vamos aprender pelos passos abaixo:

Sobre o Botão

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

Diagrama de Ligação

Diagrama de ligação do botão com ESP8266 NodeMCU

This image is created using Fritzing. Click to enlarge image

Para mais informações, veja Pinagem do ESP8266 e como alimentar o ESP8266 e outros componentes.

Vamos ver o código ESP8266 COM e SEM debounce e comparar o comportamento de cada um.

Lendo o Botão sem Debounce

Antes de explorar o debounce, veja o código sem ele e observe o comportamento.

Passos Rápidos

Para começar com o ESP8266 na Arduino IDE, siga estes passos:

  • Veja o tutorial como configurar o ambiente para ESP8266 na Arduino IDE se esta for a sua primeira vez usando o ESP8266.
  • Ligue os componentes como mostrado no diagrama.
  • Conecte a placa ESP8266 ao seu computador usando um cabo USB.
  • Abra a Arduino IDE no seu computador.
  • Escolha a placa ESP8266 correta, como (ex.: NodeMCU 1.0 (ESP-12E Module)), e a respectiva porta COM.
  • Conecte o seu ESP8266 ao computador usando um cabo USB.
  • Abra a Arduino IDE e selecione a placa e a porta apropriadas.
  • Copie o código abaixo e abra na Arduino IDE.
/* * Este código de ESP8266 NodeMCU foi desenvolvido por pt.newbiely.com * Este código de ESP8266 NodeMCU é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp8266/esp8266-button-debounce */ #define BUTTON_PIN D7 // The ESP8266 pin D7 connected to button int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin void setup() { // Initialize the Serial to communicate with the Serial Monitor. Serial.begin(9600); // Configure the ESP8266 pin as a pull-up input: HIGH when the button is open, LOW when pressed. 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) Serial.println("The button is pressed"); else if (prev_button_state == LOW && button_state == HIGH) Serial.println("The button is released"); // save the the last state prev_button_state = button_state; }
  • Clique no botão Upload na Arduino IDE para compilar e fazer o upload do código para o ESP8266.
Upload de código na Arduino IDE
  • Abra o Serial Monitor.
  • Mantenha o botão pressionado por alguns segundos e depois solte.
  • Confira a saída no Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Nodemcu 1.0 (ESP-12E Module)
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
New Line
9600 baud
The button is pressed The button is pressed The button is pressed The button is released The button is released
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E Module) on COM15
2

Você pode notar que, às vezes, você pressionou e soltou o botão apenas uma vez. Mesmo assim, o ESP8266 percebe como vários apertos e solturas. Esse é o fenômeno de chattering mencionado no início do tutorial. Vamos ver como corrigir isso na próxima parte.

Lendo o Botão com Debounce

O código abaixo aplica o método chamado debounce para evitar o fenômeno de chattering.

/* * Este código de ESP8266 NodeMCU foi desenvolvido por pt.newbiely.com * Este código de ESP8266 NodeMCU é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp8266/esp8266-button-debounce */ #define BUTTON_PIN D7 // The ESP8266 pin D7 connected to button #define DEBOUNCE_TIME 50 // The debounce time in millisecond, increase this time if it still chatters int lastSteadyState = LOW; // The previous steady state from the input pin int lastFlickerableState = LOW; // The previous flickerable state from the input pin int button_state; // The current reading from the input pin // The following variables are unsigned longs because the time, measured in // milliseconds, will quickly become a bigger number than can be stored in an int. unsigned long lastDebounceTime = 0; // The last time the output pin was toggled void setup() { // Initialize the Serial to communicate with the Serial Monitor. Serial.begin(9600); // Configure the ESP8266 pin as a pull-up input: HIGH when the button is open, LOW when pressed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: button_state = digitalRead(BUTTON_PIN); // check to see if you just pressed the button // (i.e. the input went from LOW to HIGH), and you've waited long enough // since the last press to ignore any noise: // If the switch/button changed, due to noise or pressing: if (button_state != lastFlickerableState) { // reset the debouncing timer lastDebounceTime = millis(); // save the the last flickerable state lastFlickerableState = button_state; } if ((millis() - lastDebounceTime) > DEBOUNCE_TIME) { // whatever the reading is at, it's been there for longer than the debounce // delay, so take it as the actual current state: // if the button state has changed: if(lastSteadyState == HIGH && button_state == LOW) Serial.println("The button is pressed"); else if(lastSteadyState == LOW && button_state == HIGH) Serial.println("The button is released"); // save the the last steady state lastSteadyState = button_state; } }

Passos Rápidos

  • Ligue os componentes como mostrado no diagrama.
  • Conecte a placa ESP8266 ao seu computador usando um cabo USB.
  • Abra a Arduino IDE no seu computador.
  • Escolha a placa ESP8266 correta, como (ex.: NodeMCU 1.0 (ESP-12E Module)), e a respectiva porta COM.
  • Copie o código acima e abra com a Arduino IDE.
  • Clique no botão Upload na Arduino IDE para compilar e fazer o upload do código para o ESP8266.
  • Abra o Serial Monitor.
  • Mantenha o botão pressionado por alguns segundos e depois solte.
  • Veja o resultado no Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Nodemcu 1.0 (ESP-12E Module)
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Nodemcu 1.0 (ESP-12E Module)' on 'COM15')
New Line
9600 baud
The button is pressed The button is released
Ln 11, Col 1
Nodemcu 1.0 (ESP-12E Module) on COM15
2

Como você pode observar, você pressionou e soltou o botão apenas uma vez. O ESP8266 consegue detectar isso como um único aperto e uma única soltura, eliminando qualquer chattering desnecessário.

Deixamos Simples - Código de Debounce de Botão para ESP8266 com Biblioteca

Desenvolvemos uma biblioteca, a ezButton, para facilitar a vida de quem está começando, especialmente ao usar vários botões. Saiba mais sobre a biblioteca ezButton aqui.

Código de Debounce de Botão para ESP8266 para um Único Botão

/* * Este código de ESP8266 NodeMCU foi desenvolvido por pt.newbiely.com * Este código de ESP8266 NodeMCU é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp8266/esp8266-button-debounce */ #include <ezButton.h> ezButton button(D7); // create ezButton object for pin D7 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()) Serial.println("The button is pressed"); if(button.isReleased()) Serial.println("The button is released"); }

Código de Debounce de Botão para ESP8266 para Vários Botões

/* * Este código de ESP8266 NodeMCU foi desenvolvido por pt.newbiely.com * Este código de ESP8266 NodeMCU é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/esp8266/esp8266-button-debounce */ #include <ezButton.h> ezButton button1(D5); // create ezButton object for pin D5 ezButton button2(D6); // create ezButton object for pin D6 ezButton button3(D7); // create ezButton object for pin D7 void setup() { Serial.begin(9600); button1.setDebounceTime(50); // set debounce time to 50 milliseconds button2.setDebounceTime(50); // set debounce time to 50 milliseconds button3.setDebounceTime(50); // set debounce time to 50 milliseconds } void loop() { button1.loop(); // MUST call the loop() function first button2.loop(); // MUST call the loop() function first button3.loop(); // MUST call the loop() function first if(button1.isPressed()) Serial.println("The button 1 is pressed"); if(button1.isReleased()) Serial.println("The button 1 is released"); if(button2.isPressed()) Serial.println("The button 2 is pressed"); if(button2.isReleased()) Serial.println("The button 2 is released"); if(button3.isPressed()) Serial.println("The button 3 is pressed"); if(button3.isReleased()) Serial.println("The button 3 is released"); }

O esquema para o código acima:. A ilustração da ligação para o código:. A representação das conexões para o código:

Diagrama de ligação da biblioteca de botão com ESP8266 NodeMCU

This image is created using Fritzing. Click to enlarge image

Vídeo

Conhecimento Adicional

  • O valor de DEBOUNCE_DELAY depende das características físicas do botão. Cada botão pode ter um valor diferente.

Extensibilidade

A técnica de debounce pode ser usada para chaves, sensores de toque e mais.

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