ESP32 - Taster - Entprellung

Wenn ein Knopf gedrückt oder losgelassen wird oder wenn ein Schalter zwischen EIN und AUS umgeschaltet wird, ändert sich sein Zustand einmal von LOW zu HIGH (oder von HIGH zu LOW). Ist das richtig?

⇒ Nein, das ist nicht der Fall. Das liegt daran, dass in der physischen Welt, wenn man einen einzigen Druck auf einen Knopf ausführt, der Zustand des Knopfes schnell mehrmals zwischen LOW und HIGH umgeschaltet wird, statt nur einmal. Dies ist die mechanische und physikalische Eigenschaft. Dieses Phänomen ist unter dem Namen: Prellen. Das Prellen-Phänomen bewirkt, dass ein Mikrocontroller (z. B. ESP32) mehrere Tastendrücke als Reaktion auf einen einzigen tatsächlichen Druck liest. Dies führt zu einer Fehlfunktion. Der Prozess, dieses Phänomen zu beseitigen, wird als Entprellung bezeichnet. Dieses Tutorial zeigt, wie man das macht.

ESP32 Kontaktprellen-Phänomen

Dieses Tutorial bietet:

Erforderliche Hardware

1×ESP32 ESP-WROOM-32 Entwicklungsmodul
1×USB-Kabel Typ-A zu Typ-C (für USB-A PC)
1×USB-Kabel Typ-C zu Typ-C (für USB-C PC)
1×Breadboard-Taster mit Kappe
1×Breadboard-Taster-Kit
1×Panel-Drucktaster
1×Taster-Modul
1×Breadboard
1×Verbindungskabel
1×(Optional) DC-Stromanschluss
1×(Empfohlen) Schraubklemmen-Erweiterungsboard für ESP32
1×(Empfohlen) Breakout Expansion Board for ESP32
1×(Empfohlen) Stromverteiler für ESP32

Oder Sie können die folgenden Kits kaufen:

1×DIYables ESP32 Starter-Kit (ESP32 enthalten)
1×DIYables Sensor-Kit (30 Sensoren/Displays)
1×DIYables Sensor-Kit (18 Sensoren/Displays)
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-Schaltfläche

Wir haben spezielle Tutorials zum Button. Das Tutorial enthält detaillierte Informationen und Schritt-für-Schritt-Anleitungen zur Hardware-Pinbelegung, zum Funktionsprinzip, zur Verkabelung zum ESP32 und zum ESP32-Code... Erfahren Sie mehr darüber unter den folgenden Links:

Verdrahtungsdiagramm

ESP32-Taster-Verdrahtungsdiagramm

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

Wenn Sie nicht wissen, wie Sie ESP32 und andere Komponenten mit Strom versorgen, finden Sie Anleitungen im folgenden Tutorial: Wie man ESP32 mit Strom versorgt.

Um es deutlich zu machen, lassen Sie uns ESP32-Code OHNE und MIT Entprellung ausführen und deren Ergebnisse vergleichen

Taste ohne Entprellung auslesen

Schnelle Schritte

  • Wenn Sie ESP32 zum ersten Mal verwenden, sehen Sie sich wie man die Umgebung für ESP32 in der Arduino IDE einrichtet an.
  • Schließen Sie die Verkabelung wie im obigen Bild.
  • Schließen Sie das ESP32-Board über ein Micro-USB-Kabel an Ihren PC an.
  • Öffnen Sie die Arduino IDE auf Ihrem PC.
  • Wählen Sie das richtige ESP32-Board (z. B. ESP32 Dev Module) und den COM-Port aus.
  • Kopieren Sie den untenstehenden Code und fügen Sie ihn in die Arduino IDE ein.
/* * Dieser ESP32 Code wurde von newbiely.de entwickelt * Dieser ESP32 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/esp32/esp32-button-debounce */ #define BUTTON_PIN 21 // GIOP21 pin connected to button // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin void setup() { // 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); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if (lastState == HIGH && currentState == LOW) Serial.println("The button is pressed"); else if (lastState == LOW && currentState == HIGH) Serial.println("The button is released"); // save the the last state lastState = currentState; }
  • Kompiliere und lade den Code auf das ESP32-Board hoch, indem du in der Arduino IDE auf die Schaltfläche Hochladen klickst
Arduino IDE Code hochladen
  • Öffne den seriellen Monitor in der Arduino-IDE
Wie öffnet man den seriellen Monitor in der Arduino IDE?
  • Drücken Sie den Knopf einmal, halten Sie ihn dabei einige Sekunden lang gedrückt und lassen Sie ihn dann los.
  • Sehen Sie das Ergebnis im seriellen Monitor. Es sieht wie folgt aus:
COM6
Send
The button is pressed The button is pressed The button is pressed The button is released The button is released
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

⇒ Wie du sehen kannst, hast du nur einen einzigen Tastendruck und das Loslassen gemacht, aber der ESP32 liest mehrere Tastendrücke und Loslassvorgänge.

※ Notiz:

Das Klapperphänomen tritt nicht ständig auf. Falls es nicht auftritt, versuchen Sie bitte den oben genannten Test mehrmals.

Auslesen einer Taste mit Entprellung

Schnelle Schritte

/* * Dieser ESP32 Code wurde von newbiely.de entwickelt * Dieser ESP32 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/esp32/esp32-button-debounce */ #define BUTTON_PIN 21 // GIOP21 pin connected to button #define DEBOUNCE_TIME 50 // the debounce time in millisecond, increase this time if it still chatters // Variables will change: int lastSteadyState = LOW; // the previous steady state from the input pin int lastFlickerableState = LOW; // the previous flickerable state from the input pin int 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. unsigned long lastDebounceTime = 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 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); } void loop() { // 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_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 && currentState == LOW) Serial.println("The button is pressed"); else if(lastSteadyState == LOW && currentState == HIGH) Serial.println("The button is released"); // save the the last steady state lastSteadyState = currentState; } }
  • Den Code für das ESP32-Board kompilieren und hochladen, indem Sie in der Arduino-IDE auf die Hochladen-Schaltfläche klicken
  • Öffnen Sie den Seriellen Monitor in der Arduino-IDE
Wie öffnet man den seriellen Monitor in der Arduino IDE?
  • Drücken Sie den Knopf mehrere Sekunden lang fest und lassen Sie ihn dann los.
  • Sehen Sie das Ergebnis im seriellen Monitor. Es sieht unten so aus:
COM6
Send
The button is pressed The button is released
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

⇒ Wie Sie sehen können, haben Sie einen Tastendruck betätigt und losgelassen. Der ESP32 hat einen Tastendruck erfasst und losgelassen. Das Prellen ist eliminiert.

Wir haben es einfach gemacht - ESP32-Taster-Entprellcode mit Bibliothek

Um Anfängern den Einstieg zu erleichtern, insbesondere beim Entprellen mehrerer Tasten, haben wir eine Button-Bibliothek namens ezButton erstellt. Du kannst hier Hier kannst du mehr über die ezButton-Bibliothek erfahren.

ESP32-Entprellungscode für eine einzelne Taste

/* * Dieser ESP32 Code wurde von newbiely.de entwickelt * Dieser ESP32 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/esp32/esp32-button-debounce */ #include <ezButton.h> #define DEBOUNCE_TIME 50 // Die Entprellzeit in Millisekunden, erhöhen Sie diese Zeit, falls sie noch prellt ezButton button(21); // Erzeuge ein ezButton-Objekt, das an Pin GPIO21 angeschlossen wird void setup() { Serial.begin(9600); button.setDebounceTime(DEBOUNCE_TIME); // setze die Entprellzeit auf 50 Millisekunden } void loop() { button.loop(); // MUSS zuerst die loop()-Funktion aufgerufen werden if (button.isPressed()) Serial.println("The button is pressed"); if (button.isReleased()) Serial.println("The button is released"); }

ESP32 Entprellungs-Code für mehrere Tasten

Schreiben wir Debounce-Code für drei Tasten.

Der Schaltplan

ESP32-Taster-Bibliothek Verdrahtungsdiagramm

Dieses Bild wurde mit Fritzing erstellt. Klicken Sie, um das Bild zu vergrößern.

/* * Dieser ESP32 Code wurde von newbiely.de entwickelt * Dieser ESP32 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/esp32/esp32-button-debounce */ #include <ezButton.h> #define DEBOUNCE_TIME 50 // Die Entprellzeit in Millisekunden; erhöhen Sie diesen Wert, falls es weiterhin prellt ezButton button1(21); // Erzeuge ein ezButton-Objekt, das an Pin GPIO21 angeschlossen wird; ezButton button2(22); // Erzeuge ein ezButton-Objekt, das an Pin GPIO22 angeschlossen wird; ezButton button3(23); // Erzeuge ein ezButton-Objekt, das an Pin GPIO23 angeschlossen wird; void setup() { Serial.begin(9600); button1.setDebounceTime(DEBOUNCE_TIME); // Entprellzeit auf 50 Millisekunden setzen button2.setDebounceTime(DEBOUNCE_TIME); // Entprellzeit auf 50 Millisekunden setzen button3.setDebounceTime(DEBOUNCE_TIME); // Entprellzeit auf 50 Millisekunden setzen } void loop() { button1.loop(); // MÜSSEN zuerst die loop()-Funktion aufgerufen werden button2.loop(); // MÜSSEN zuerst die loop()-Funktion aufgerufen werden button3.loop(); // MÜSSEN zuerst die loop()-Funktion aufgerufen werden 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"); }

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_TIME-Wert hängt von der Hardware ab. Unterschiedliche Hardware kann unterschiedliche Werte verwenden.
  • Die Entprellzeit sollte auch für Ein/Aus-Schalter, Endschalter, Reed-Schalter, Berührungssensoren gelten...

※ UNSERE NACHRICHTEN

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