Arduino UNO R4 - Button - Debounce
Bij het programmeren van de Arduino Uno R4 om een button press event te detecteren, kunt u merken dat een enkele druk meerdere keren wordt gedetecteerd. Dit gebeurt omdat, vanwege mechanische factoren, de button of schakelaar snel meerdere keren kan schakelen tussen LOW en HIGH. Dit wordt "chattering" genoemd. Chattering kan ertoe leiden dat één button press wordt gedetecteerd als meerdere presses, wat fouten kan veroorzaken in sommige toepassingen. Deze tutorial legt uit hoe u dit probleem kunt oplossen, een proces dat bekend staat als het debounce van de button.
Of u kunt de volgende kits kopen:
Openbaarmaking: Sommige van de links in deze sectie zijn Amazon-affiliate links. We kunnen een commissie ontvangen voor aankopen die via deze links worden gedaan, zonder extra kosten voor u. We waarderen uw steun.
Leer over buttons (pinout, werking, programmering) in de volgende tutorials als u er niet bekend mee bent:

This image is created using Fritzing. Click to enlarge image
Laten we de Arduino UNO R4 code zonder en met debounce onderzoeken en vergelijken, en hun gedrag observeren.
Voordat we leren over debouncing, laten we kijken naar de code zonder debounce en zien hoe deze zich gedraagt.
#define BUTTON_PIN 7
int button_state;
int prev_button_state = LOW;
void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
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");
prev_button_state = button_state;
}
Volg deze instructies stap voor stap:
Sluit de componenten aan volgens het meegeleverde diagram.
Verbind het Arduino Uno R4 board met uw computer via een USB-kabel.
Start de Arduino IDE op uw computer.
Selecteer het juiste Arduino Uno R4 board (bijv. Arduino Uno R4 WiFi) en COM-poort.
Kopieer de bovenstaande code en open deze in de Arduino IDE.
Klik op de Upload knop in Arduino IDE om code naar Arduino UNO R4 te sturen.
Open de Serial Monitor.
Druk en houd de button enkele seconden ingedrukt, laat vervolgens los.
Controleer de Serial Monitor voor het resultaat.
The button is pressed
The button is pressed
The button is pressed
The button is released
The button is released
Zoals u kunt zien, hebt u de button slechts eenmaal ingedrukt en losgelaten. De Arduino herkent het echter als meerdere presses en releases.
※ Notiz:
De waarde van DEBOUNCE_TIME varieert per toepassing. Elke toepassing kan een unieke waarde gebruiken.
#define BUTTON_PIN 7
#define DEBOUNCE_TIME 50
int last_steady_state = LOW;
int last_flickerable_state = LOW;
int current_state;
unsigned long last_debounce_time = 0;
void setup() {
Serial.begin(9600);
pinMode(BUTTON_PIN, INPUT_PULLUP);
}
void loop() {
current_state = digitalRead(BUTTON_PIN);
if (current_state != last_flickerable_state) {
last_debounce_time = millis();
last_flickerable_state = current_state;
}
if ((millis() - last_debounce_time) > DEBOUNCE_TIME) {
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");
last_steady_state = current_state;
}
}
Kopieer de bovenstaande code en open deze in Arduino IDE.
Druk op de Upload knop in de Arduino IDE om de code naar de Arduino UNO R4 te sturen.
Open de Serial Monitor.
Houd de button enkele seconden ingedrukt voordat u loslaat.
Bekijk de Serial Monitor.
The button is pressed
The button is released
Zoals u kunt zien, hebt u de button eenmaal ingedrukt en losgelaten. De Arduino detecteert dit correct als één enkele press en release, waarmee alle chattering wordt weggenomen.
We maakten een eenvoudigere manier voor beginners die veel buttons gebruiken door een library te maken genaamd ezButton. U kunt hier meer over de ezButton library lezen.
Laten we enkele voorbeeldcodes bekijken.
#include <ezButton.h>
ezButton button(7);
void setup() {
Serial.begin(9600);
button.setDebounceTime(50);
}
void loop() {
button.loop();
if(button.isPressed())
Serial.println("The button is pressed");
if(button.isReleased())
Serial.println("The button is released");
}
Laten we debounce toepassen voor 3 buttons. Hier is het bedradingsdiagram tussen Arduino UNO R4 en drie buttons:

This image is created using Fritzing. Click to enlarge image
Zie De beste manier om Arduino Uno R4 en andere componenten van stroom te voorzien.
#include <ezButton.h>
ezButton button_1(6);
ezButton button_2(7);
ezButton button_3(8);
void setup() {
Serial.begin(9600);
button_1.setDebounceTime(50);
button_2.setDebounceTime(50);
button_3.setDebounceTime(50);
}
void loop() {
button_1.loop();
button_2.loop();
button_3.loop();
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");
}
We overwegen het maken van videotutorials. Als u videotutorials belangrijk vindt, abonneer u dan op ons YouTube-kanaal om ons te motiveren de video's te maken.