Arduino Nano - Botão - Debounce

Quando um botão é pressionado ou solto, ou um interruptor é acionado, os iniciantes costumam supor que o estado muda de LOW para HIGH ou de HIGH para LOW. Na realidade, nem sempre é assim. Devido às características mecânicas e físicas, o estado do botão (ou interruptor) pode alternar rapidamente entre LOW e HIGH várias vezes em resposta a um único evento. Esse fenômeno é conhecido como chattering (trepidação). O chattering pode fazer com que um único acionamento seja lido como vários, causando mau funcionamento em certas aplicações.

fenômeno de chattering

O método para eliminar esse problema é chamado de debouncing ou debounce. Este tutorial ensina como fazer isso ao usar o botão com o Arduino Nano. Vamos aprender pelos passos abaixo:

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 (pinagem, funcionamento, programação etc.), os tutoriais a seguir podem ajudar:

Diagrama de Ligação

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

This image is created using Fritzing. Click to enlarge image

Vamos observar e comparar o código do Arduino Nano COM e SEM debounce, bem como o comportamento de cada um.

Lendo o Botão sem Debounce

Antes de mergulhar no conceito de debouncing, dê uma olhada no código sem debouncing e observe o comportamento dele.

Passos Rápidos

  • Conecte um cabo USB ao Arduino Nano e ao seu PC.
  • Abra a Arduino IDE e escolha a placa e a porta corretas.
  • Copie o código abaixo e abra-o na Arduino IDE.
/* * 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-debounce */ #define BUTTON_PIN 2 // The number of the pushbutton pin 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 Arduino Nano pin as a pull-up input // The pull-up input pin is HIGH when the button is open and 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 carregar o código na placa Arduino Nano.
Carregar código pela Arduino IDE
  • Abra o Serial Monitor.
  • Pressione e segure o botão por alguns segundos e depois solte-o.
  • Tente várias vezes.
  • 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
The button is pressed The button is pressed The button is pressed The button is released The button is released
Ln 11, Col 1
Arduino Nano on COM15
2

Às vezes, você pressionou e soltou o botão apenas uma vez. Mesmo assim, o Arduino Nano interpreta isso como vários pressionamentos e liberações. Esse é o fenômeno de chattering mencionado no início do tutorial. Vamos ver como corrigi-lo 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 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-debounce */ #define BUTTON_PIN 2 // The number of the pushbutton pin const int DEBOUNCE_DELAY = 50; // The debounce time; increase if the output flickers 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 Arduino Nano pin as a pull-up input // The pull-up input pin is HIGH when the button is open and 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_DELAY) { // 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

  • Copie o código acima e abra-o com a Arduino IDE.
  • Clique no botão Upload na Arduino IDE para compilar e carregar o código no Arduino Nano.
  • Abra o Serial Monitor.
  • Continue pressionando o botão por alguns segundos e depois solte-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
The button is pressed The button is released
Ln 11, Col 1
Arduino Nano on COM15
2

Como você pode observar, você pressionou e soltou o botão apenas uma vez. O Arduino Nano detecta isso como um único pressionamento e uma única liberação. O ruído foi eliminado.

Fizemos Isso Ficar Simples - Código de Debounce de Botão para Arduino Nano com Biblioteca

Criamos uma biblioteca, a ezButton, para facilitar a vida de quem está começando, principalmente ao lidar com vários botões. Você pode saber mais sobre a biblioteca ezButton aqui.

Código de Debounce de Botão para Arduino Nano com Um Único Botão

#include <ezButton.h> ezButton button(2); // create ezButton object for pin 2; 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 Arduino Nano com Vários Botões

/* * 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-debounce */ #include <ezButton.h> ezButton button1(6); // create ezButton object for pin 6; ezButton button2(7); // create ezButton object for pin 7; ezButton button3(8); // create ezButton object for pin 8; 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 visual da ligação para o código:

Diagrama de ligação de vários botões 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.

Vídeo

Conhecimento Adicional

  • O valor de DEBOUNCE_DELAY varia conforme as características físicas de cada botão. É possível que botões diferentes usem valores diferentes.

Extensibilidade

A técnica de debounce pode ser usada com um interruptor, um sensor 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!