Wenn ein Knopf gedrückt/losgelassen wird oder wenn ein Schalter umgelegt wird, denken Anfänger normalerweise einfach, dass sein Zustand von LOW zu HIGH oder HIGH zu LOW geändert wird. In der Praxis ist es nicht ganz so. Aufgrund der mechanischen und physikalischen Eigenschaften könnte der Zustand des Knopfs (oder Schalters) mehrmals zwischen LOW und HIGH umgeschaltet werden. Dieses Phänomen wird als Prellen bezeichnet. Dieses Phänomen kann dazu führen, dass ein einzelner Druck als mehrere Drucke gelesen wird, was in einigen Anwendungen zu Fehlfunktionen führt. Dieses Tutorial zeigt, wie man dieses Phänomen beseitigt (das Eingangsentprellen).
Offenlegung: Einige der in diesem Abschnitt bereitgestellten Links sind Amazon-Affiliate-Links. Wir können eine Provision für Käufe erhalten, die über diese Links getätigt werden, ohne zusätzliche Kosten für Sie. Wir schätzen Ihre Unterstützung.
Über Button
Wenn Sie nichts über den Button (Pinbelegung, Funktionsweise, Programmierung ...) wissen, informieren Sie sich in den folgenden Tutorials darüber:
Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.
Schauen wir uns den Arduino-Code ohne Entprellung und mit Entprellung an und vergleichen dessen Verhalten.
Auslesen eines Buttons ohne Entprellung
Bevor Sie etwas über die Entprellung lernen, sehen Sie sich einfach den Code ohne Entprellung und dessen Verhalten an.
Schnelle Schritte
Schließe den Arduino über ein USB-Kabel an den PC an
Öffne die Arduino IDE, wähle das richtige Board und den richtigen Port
Kopiere den untenstehenden Code und öffne ihn mit der Arduino IDE
/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/arduino/arduino-button-debounce*/// constants won't change. They're used here to set pin numbers:constint BUTTON_PIN = 7; // the number of the pushbutton pin// Variables will change:int lastState = LOW; // the previous state from the input pinint currentState; // the current reading from the input pinvoidsetup() {// initialize serial communication at 9600 bits per second:Serial.begin(9600);// initialize the pushbutton pin as an pull-up input// the pull-up input pin will be HIGH when the switch is open and LOW when the switch is closed.pinMode(BUTTON_PIN, INPUT_PULLUP);}voidloop() {// read the state of the switch/button: currentState = digitalRead(BUTTON_PIN);if(lastState == HIGH && currentState == LOW)Serial.println("The button is pressed");elseif(lastState == LOW && currentState == HIGH)Serial.println("The button is released");// save the the last state lastState = currentState;}
Klicken Sie auf die Schaltfläche Hochladen in der Arduino IDE, um Code auf Arduino hochzuladen
Öffnen Sie den seriellen Monitor.
Halten Sie die Taste mehrere Sekunden lang gedrückt und lassen Sie sie dann los.
Sehen Sie das Ergebnis auf dem seriellen Monitor.
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' 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 on COM15
2
⇒ Wie Sie sehen können, haben Sie den Knopf nur einmal gedrückt und losgelassen. Allerdings erkennt Arduino ihn als mehrere Betätigungen und Loslassenvorgänge.
Lesetaste mit Entprellung
Schnelle Schritte
Kopieren Sie den untenstehenden Code und öffnen Sie ihn mit der Arduino IDE.
/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/arduino/arduino-button-debounce*/// constants won't change. They're used here to set pin numbers:constint BUTTON_PIN = 7; // the number of the pushbutton pinconstint DEBOUNCE_DELAY = 50; // the debounce time; increase if the output flickers// Variables will change:int lastSteadyState = LOW; // the previous steady state from the input pinint lastFlickerableState = LOW; // the previous flickerable state from the input pinint currentState; // 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.unsignedlong lastDebounceTime = 0; // the last time the output pin was toggledvoidsetup() {// initialize serial communication at 9600 bits per second:Serial.begin(9600);// initialize the pushbutton pin as an pull-up input// the pull-up input pin will be HIGH when the switch is open and LOW when the switch is closed.pinMode(BUTTON_PIN, INPUT_PULLUP);}voidloop() {// read the state of the switch/button: currentState = 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 (currentState != lastFlickerableState) {// reset the debouncing timer lastDebounceTime = millis();// save the the last flickerable state lastFlickerableState = currentState; }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 && currentState == LOW)Serial.println("The button is pressed");elseif (lastSteadyState == LOW && currentState == HIGH)Serial.println("The button is released");// save the the last steady state lastSteadyState = currentState; }}
Klicken Sie auf die Schaltfläche Hochladen in der Arduino-IDE, um den Code auf den Arduino hochzuladen.
Öffnen Sie den seriellen Monitor.
Halten Sie die Taste mehrere Sekunden gedrückt und lassen Sie sie dann los.
Sehen Sie das Ergebnis im seriellen Monitor.
Newbiely | Arduino IDE 2.3.8
──
☐
✕
File
Edit
Sketch
Tools
Help
Arduino Uno
Newbiely.ino
···
8Serial.println("Hello World!");
Output
Serial Monitor
Message (Enter to send message to 'Arduino Uno' on 'COM15')
New Line
9600 baud
The button is pressed
The button is released
Ln 11, Col 1
Arduino Uno on COM15
2
⇒ Wie Sie sehen können, haben Sie den Knopf nur einmal gedrückt und losgelassen. Arduino erkennt dies als den einzigen Druck- und Loslassvorgang. Das Prellen wird eliminiert.
Wir haben es einfach gemacht - Arduino-Tasten-Entprellungs-Code mit einer Bibliothek
Um Anfängern das Leben deutlich zu erleichtern, insbesondere beim Verwenden mehrerer Tasten, haben wir eine Bibliothek namens ezButton erstellt. Sie können hier Mehr über die ezButton-Bibliothek erfahren.
Arduino-Entprellungscode für einen einzelnen Button
/* * 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>ezButtonbutton(7); // create ezButton object that attach to pin 7;voidsetup() {Serial.begin(9600);button.setDebounceTime(50); // set debounce time to 50 milliseconds}voidloop() {button.loop(); // MUST call the loop() function firstif(button.isPressed())Serial.println("The button is pressed");if(button.isReleased())Serial.println("The button is released");}
Arduino-Entprellcode für mehrere Tasten
/* * Dieser Arduino Code wurde von newbiely.de entwickelt * Dieser Arduino Code wird der Öffentlichkeit ohne jegliche Einschränkung zur Verfügung gestellt. * Für vollständige Anleitungen und Schaltpläne besuchen Sie bitte: * https://newbiely.de/tutorials/arduino/arduino-button-debounce*/#include <ezButton.h>ezButtonbutton1(6); // erstelle ein ezButton-Objekt, das an Pin 6 angeschlossen ist;ezButtonbutton2(7); // erstelle ein ezButton-Objekt, das an Pin 7 angeschlossen ist;ezButtonbutton3(8); // erstelle ein ezButton-Objekt, das an Pin 8 angeschlossen ist;voidsetup() {Serial.begin(9600);button1.setDebounceTime(50); // Entprellzeit auf 50 Millisekunden setzenbutton2.setDebounceTime(50); // Entprellzeit auf 50 Millisekunden setzenbutton3.setDebounceTime(50); // Entprellzeit auf 50 Millisekunden setzen}voidloop() {button1.loop(); // MUSS die loop()-Funktion zuerst aufrufenbutton2.loop(); // MUSS die loop()-Funktion zuerst aufrufenbutton3.loop(); // MUSS die loop()-Funktion zuerst aufrufenif(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");}
Der Schaltplan zum obigen Code:
Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.
Video Tutorial
Wir erwägen die Erstellung von Video-Tutorials. Wenn Sie Video-Tutorials für wichtig halten, abonnieren Sie bitte unseren YouTube-Kanal , um uns zu motivieren, die Videos zu erstellen.
Zusätzliches Wissen
DEBOUNCE_DELAY Der Wert hängt von den Anwendungen ab. Unterschiedliche Anwendungen können unterschiedliche Werte verwenden.
Erweiterbarkeit
Die Entprellmethode kann bei Schaltern und Berührungssensoren angewendet werden.
Sie können gerne den Link zu diesem Tutorial teilen. Bitte verwenden Sie jedoch unsere Inhalte nicht auf anderen Websites. Wir haben viel Mühe und Zeit in die Erstellung der Inhalte investiert, bitte respektieren Sie unsere Arbeit!