Arduino UNO R4 - Botão - Debounce

Ao programar o Arduino Uno R4 para detectar um evento de pressionamento de botão, você pode perceber que um único pressionamento é detectado várias vezes. Isso acontece porque, devido a fatores mecânicos, o botão ou a chave pode alternar rapidamente entre LOW e HIGH várias vezes. Isso é chamado de "chattering". O chattering pode fazer um único pressionamento de botão ser detectado como vários pressionamentos, o que pode causar erros em algumas aplicações. Este tutorial explica como corrigir esse problema, um processo conhecido como debounce do botão.

Fenômeno de chattering no Arduino UNO R4

Sobre o Botão

Se você não está familiarizado com botões, aprenda sobre eles (pinagem, funcionamento, programação) nos tutoriais a seguir:

Diagrama de Ligação

Diagrama de Ligação do Botão com Arduino UNO R4

This image is created using Fritzing. Click to enlarge image

Vamos examinar e comparar o código do Arduino UNO R4 sem e com debounce, e observar o comportamento de cada um.

Arduino Uno R4 - Botão sem Debounce

Antes de aprendermos sobre debounce, vamos olhar o código sem ele e ver como ele se comporta.

/* * Este código de Arduino UNO R4 foi desenvolvido por pt.newbiely.com * Este código de Arduino UNO R4 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-button-debounce */ #define BUTTON_PIN 7 // The Arduino UNO R4 pin connected to the button int button_state; // the current state of button int prev_button_state = LOW; // the previous state of button void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as a pull-up input 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 last state prev_button_state = button_state; }

Passos Rápidos

Siga estas instruções passo a passo:

  • Se esta é a primeira vez que você usa o Arduino Uno R4 WiFi/Minima, consulte o tutorial sobre como configurar o ambiente para o Arduino Uno R4 WiFi/Minima na Arduino IDE.
  • Faça a ligação dos componentes de acordo com o diagrama fornecido.
  • Conecte a placa Arduino Uno R4 ao seu computador usando um cabo USB.
  • Abra a Arduino IDE no seu computador.
  • Selecione a placa Arduino Uno R4 apropriada (por exemplo, Arduino Uno R4 WiFi) e a porta COM.
  • Copie o código acima e abra-o na Arduino IDE.
  • Clique no botão Upload na Arduino IDE para enviar o código ao Arduino UNO R4.
Arduino IDE Upload do Código
  • Abra o Serial Monitor.
  • Pressione e segure o botão por alguns segundos, depois solte-o.
  • Confira o resultado no Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' 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 Uno R4 WiFi on COM15
2

Como você pode ver, você pressionou e soltou o botão apenas uma vez. No entanto, o Arduino o reconhece como vários pressionamentos e liberações.

※ Nota:

O valor de DEBOUNCE_TIME varia conforme a aplicação. Cada aplicação pode usar um valor próprio.

Arduino Uno R4 - Botão com Debounce

/* * Este código de Arduino UNO R4 foi desenvolvido por pt.newbiely.com * Este código de Arduino UNO R4 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-button-debounce */ #define BUTTON_PIN 7 // The Arduino UNO R4 pin connected to the button #define DEBOUNCE_TIME 50 // The debounce time; increase if the output flickers int last_steady_state = LOW; // the previous steady state from the input pin int last_flickerable_state = LOW; // the previous flickerable state from the input pin int current_state; // the current reading from the input pin unsigned long last_debounce_time = 0; // the last time the output pin was toggled void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as a pull-up input pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: current_state = digitalRead(BUTTON_PIN); // If the switch/button changed, due to noise or pressing: if (current_state != last_flickerable_state) { // reset the debouncing timer last_debounce_time = millis(); // save the the last flickerable state last_flickerable_state = current_state; } if ((millis() - last_debounce_time) > DEBOUNCE_TIME) { // if the button state has changed: if (last_steady_state == HIGH && current_state == LOW) Serial.println("The button is pressed"); else if (last_steady_state == LOW && current_state == HIGH) Serial.println("The button is released"); // save the the last steady state last_steady_state = current_state; } }

Passos Rápidos

  • Copie o código acima e abra-o na Arduino IDE.
  • Pressione o botão Upload na Arduino IDE para enviar o código ao Arduino UNO R4.
  • Abra o Serial Monitor.
  • Mantenha o botão pressionado por alguns segundos antes de soltá-lo.
  • Confira o Serial Monitor.
∞
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno R4 WiFi
Newbiely.ino
···
8 Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno R4 WiFi' on 'COM15')
New Line
9600 baud
The button is pressed The button is released
Ln 11, Col 1
Arduino Uno R4 WiFi on COM15
2

Como você pode ver, você pressionou e soltou o botão uma vez. O Arduino o detecta corretamente como um único pressionamento e uma única liberação, eliminando qualquer chattering.

Tornamos Simples: Código de Debounce de Botão para Arduino UNO R4 Usando uma Biblioteca

Criamos uma forma mais simples para iniciantes que usam muitos botões, por meio de uma biblioteca chamada ezButton. Você pode saber mais sobre a biblioteca ezButton aqui.

Vamos ver alguns códigos de exemplo.

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

/* * Created by ArduinoGetStarted.com * * This example code is in the public domain * * Tutorial page: https://arduinogetstarted.com/tutorials/arduino-button-library * * This example reads the state of a button with debounce and print it to Serial Monitor. */ #include <ezButton.h> ezButton button(7); // create ezButton object that attach to pin 7; 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 UNO R4 com Vários Botões

Vamos fazer o debounce de 3 botões. Este é o diagrama de ligação entre o Arduino UNO R4 e três botões:

Diagrama de Ligação da Biblioteca de Botões com Arduino UNO R4

This image is created using Fritzing. Click to enlarge image

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

/* * Este código de Arduino UNO R4 foi desenvolvido por pt.newbiely.com * Este código de Arduino UNO R4 é disponibilizado ao público sem nenhuma restrição. * Para tutoriais completos e diagramas de ligação, visite: * https://pt.newbiely.com/tutorials/arduino-uno-r4/arduino-uno-r4-button-debounce */ #include <ezButton.h> ezButton button_1(6); // initialize ezButton object connected to pin 6 ezButton button_2(7); // initialize ezButton object connected to pin 7 ezButton button_3(8); // initialize ezButton object connected to pin 8 void setup() { Serial.begin(9600); button_1.setDebounceTime(50); // configure debounce time for button_1 to 50ms button_2.setDebounceTime(50); // configure debounce time for button_2 to 50ms button_3.setDebounceTime(50); // configure debounce time for button_3 to 50ms } void loop() { button_1.loop(); // update button_1 state button_2.loop(); // update button_2 state button_3.loop(); // update button_3 state if(button_1.isPressed()) Serial.println("The button 1 is pressed"); if(button_1.isReleased()) Serial.println("The button 1 is released"); if(button_2.isPressed()) Serial.println("The button 2 is pressed"); if(button_2.isReleased()) Serial.println("The button 2 is released"); if(button_3.isPressed()) Serial.println("The button 3 is pressed"); if(button_3.isReleased()) Serial.println("The button 3 is released"); }

Vídeo

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