ESP32 - Taster - Langes Drücken, Kurzes Drücken

Diese Anleitung zeigt Ihnen, wie Sie mit dem ESP32 den langen Druck und den kurzen Druck erkennen. Im Detail werden wir lernen:

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 die Schaltfläche

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

Verdrahtungsdiagramm

  • Verdrahtungsdiagramm zwischen ESP32 und PCB-Montage-Taster
ESP32-Taster-Schaltplan

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.

  • Verdrahtungsdiagramm zwischen ESP32 und Panelmontage-Taster
ESP32-Zweipin-Drucktaster-Schaltplan

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

In diesem Tutorial wird der interne Pull-Up-Widerstand verwendet. Der Zustand des Tasters ist HIGH, wenn er normal ist, und LOW, wenn er gedrückt wird.

Wie man einen kurzen Knopfdruck erkennt

  • Die Zeit zwischen dem Drücken und dem Loslassen messen.
  • Wenn die Dauer kürzer ist als eine vordefinierte Zeit, wird ein kurzer Tastendruck erkannt.

Schauen wir es Schritt für Schritt an:

  • Definieren Sie, wie lange ein Knopfdruck maximal anhält
#define SHORT_PRESS_TIME 500 // 500 Millisekunden
  • Erkennen, dass der Knopf gedrückt wird, und den Zeitpunkt des Drückens speichern
if(lastState == HIGH && currentState == LOW) pressedTime = millis();
  • Erkennen, dass der Knopf losgelassen wurde, und den Zeitpunkt des Loslassens speichern
if(lastState == LOW && currentState == HIGH) releasedTime = millis();
  • Berechne Druckdauer und
long pressDuration = releasedTime - pressedTime;
  • Bestimme den kurzen Druck, indem du die Druckdauer mit der definierten kurzen Druckzeit vergleichst.
if( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected");

ESP32-Code zur Erkennung eines kurzen Tastendrucks

/* * 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-long-press-short-press */ #define BUTTON_PIN 21 // GPIO21 pin connected to button #define SHORT_PRESS_TIME 500 // 500 milliseconds // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin unsigned long pressedTime = 0; unsigned long releasedTime = 0; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if (lastState == HIGH && currentState == LOW) // button is pressed pressedTime = millis(); else if (lastState == LOW && currentState == HIGH) { // button is released releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if ( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } // save the the last state lastState = currentState; }

Schnelle Schritte

  • Wenn Sie ESP32 zum ersten Mal verwenden, sehen Sie wie man die Umgebung für ESP32 in der Arduino IDE einrichtet.
  • Laden Sie den obigen Code über die Arduino IDE auf den ESP32 hoch.
  • Drücken Sie den Knopf mehrmals kurz hintereinander.
  • Sehen Sie das Ergebnis im seriellen Monitor. Es sieht wie folgt aus:
COM6
Send
A short press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ Notiz:

Der serielle Monitor kann mehrere kurze Drücke für einen einzelnen Druck ausgeben. Dies ist ein normales Verhalten des Knopfes. Dieses Verhalten wird als das „Prellen-Phänomen“ bezeichnet. Wir werden später in diesem Tutorial lernen, wie man dieses Problem beseitigt.

So erkennen Sie einen langen Druck

Es gibt zwei Anwendungsfälle für das Erkennen eines langen Drucks.

  • Das Langdruck-Ereignis wird unmittelbar nach dem Loslassen der Taste erkannt.
  • Das Langdruck-Ereignis wird erkannt, während die Taste gedrückt wird.

Im ersten Fall:

  • Miss die Zeitdauer zwischen dem Drücken der Taste und dem Loslassen der Taste.
  • Wenn die Dauer länger ist als eine vorgegebene Zeit, wird ein Langdruck-Ereignis erkannt.

Im zweiten Fall: Während der Knopf gedrückt wird, führen Sie den folgenden Prozess wiederholt aus:

  • Messen Sie die Drückdauer.
  • Wenn die Dauer länger als die vordefinierte Zeit ist, wird das Langdruck-Ereignis erkannt.
  • Andernfalls wiederholen Sie den Vorgang, bis die Taste losgelassen wird.

ESP32-Code zur Erkennung eines langen Tastendrucks beim Loslassen

/* * 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-long-press-short-press */ #define BUTTON_PIN 21 // GPIO21 pin connected to button #define LONG_PRESS_TIME 1000 // 1000 milliseconds // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin unsigned long pressedTime = 0; unsigned long releasedTime = 0; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) // button is pressed pressedTime = millis(); else if(lastState == LOW && currentState == HIGH) { // button is released releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if( pressDuration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } // save the the last state lastState = currentState; }

Schnelle Schritte

COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

ESP32-Code zur Erkennung eines langen Tastendrucks während des Drückens

/* * 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-long-press-short-press */ #define BUTTON_PIN 21 // GPIO21 pin connected to button #define LONG_PRESS_TIME 1000 // 1000 milliseconds // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin unsigned long pressedTime = 0; bool isPressing = false; bool isLongDetected = false; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) { // button is pressed pressedTime = millis(); isPressing = true; isLongDetected = false; } else if(lastState == LOW && currentState == HIGH) { // button is released isPressing = false; } if(isPressing == true && isLongDetected == false) { long pressDuration = millis() - pressedTime; if( pressDuration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); isLongDetected = true; } } // save the the last state lastState = currentState; }

Schnelle Schritte

  • Wenn Sie ESP32 zum ersten Mal verwenden, sehen Sie wie Sie die Umgebung für ESP32 in der Arduino IDE einrichten.
  • Laden Sie den obigen Code über die Arduino IDE auf den ESP32 hoch
  • Drücken Sie den Knopf und lassen Sie ihn nach einigen Sekunden los.
  • Sehen Sie das Ergebnis im Serial Monitor. Es sieht wie folgt aus:
COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Wie man sowohl einen langen als auch einen kurzen Druck erkennt

Kurzer Druck und langer Druck nach dem Loslassen

/* * 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-long-press-short-press */ #define BUTTON_PIN 21 // GPIO21 pin connected to button #define SHORT_PRESS_TIME 1000 // 1000 milliseconds #define LONG_PRESS_TIME 1000 // 1000 milliseconds // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin unsigned long pressedTime = 0; unsigned long releasedTime = 0; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if (lastState == HIGH && currentState == LOW) // button is pressed pressedTime = millis(); else if (lastState == LOW && currentState == HIGH) { // button is released releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if ( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); if ( pressDuration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } // save the the last state lastState = currentState; }

Schnelle Schritte

  • Falls dies das erste Mal ist, dass Sie ESP32 verwenden, sehen Sie wie man die Umgebung für ESP32 in der Arduino IDE einrichtet.
  • Laden Sie den obigen Code über die Arduino IDE auf den ESP32 hoch.
  • Drücken Sie den Knopf sowohl lange als auch kurz.
  • Sehen Sie das Ergebnis im Serial Monitor. Es sieht so aus wie unten dargestellt:

※ Notiz:

Der Serial Monitor kann bei langem Drücken mehrere kurze Tastendrücke erkennen. Dies ist das normale Verhalten des Knopfes. Dieses Verhalten wird als „Prellen-Phänomen“ bezeichnet. Das Problem wird im letzten Teil dieses Tutorials gelöst.

Kurzer Tastendruck und langer Tastendruck während des Drückens

/* * 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-long-press-short-press */ #define BUTTON_PIN 21 // GPIO21 pin connected to button #define SHORT_PRESS_TIME 1000 // 1000 milliseconds #define LONG_PRESS_TIME 1000 // 1000 milliseconds // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin unsigned long pressedTime = 0; unsigned long releasedTime = 0; bool isPressing = false; bool isLongDetected = false; void setup() { Serial.begin(9600); pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if (lastState == HIGH && currentState == LOW) { // button is pressed pressedTime = millis(); isPressing = true; isLongDetected = false; } else if (lastState == LOW && currentState == HIGH) { // button is released isPressing = false; releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if ( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } if (isPressing == true && isLongDetected == false) { long pressDuration = millis() - pressedTime; if ( pressDuration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); isLongDetected = true; } } // save the the last state lastState = currentState; }

Schnelle Schritte

Langes Drücken und Kurzes Drücken mit Entprellung

Es ist in vielen Anwendungen sehr wichtig, den Taster zu entprellen.

Das Entprellen ist etwas kompliziert, insbesondere bei der Verwendung mehrerer Taster. Um es Anfängern einfacher zu machen, haben wir eine Bibliothek entwickelt, die ezButton heißt.

Wir werden diese Bibliothek in den unten stehenden Codes verwenden.

Kurzer Tastendruck und Langer Tastendruck mit Entprellung nach dem Loslassen

/* * 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-long-press-short-press */ #include <ezButton.h> #define SHORT_PRESS_TIME 1000 // 1000 milliseconds #define LONG_PRESS_TIME 1000 // 1000 milliseconds ezButton button(21); // create ezButton object that attach to pin GPIO21 unsigned long pressedTime = 0; unsigned long releasedTime = 0; 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()) pressedTime = millis(); if (button.isReleased()) { releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if ( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); if ( pressDuration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } }

Schnelle Schritte

Kurzer Tastendruck und langer Tastendruck mit Entprellung während des Drückens

/* * 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-long-press-short-press */ #include <ezButton.h> #define SHORT_PRESS_TIME 1000 // 1000 milliseconds #define LONG_PRESS_TIME 1000 // 1000 milliseconds ezButton button(21); // create ezButton object that attach to pin GPIO21 unsigned long pressedTime = 0; unsigned long releasedTime = 0; bool isPressing = false; bool isLongDetected = false; 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()) { pressedTime = millis(); isPressing = true; isLongDetected = false; } if (button.isReleased()) { isPressing = false; releasedTime = millis(); long pressDuration = releasedTime - pressedTime; if ( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } if (isPressing == true && isLongDetected == false) { long pressDuration = millis() - pressedTime; if ( pressDuration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); isLongDetected = true; } } }

Schnelle Schritte

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.

Warum Langdrücken und Kurzdrücken erforderlich sind

  • Um die Anzahl der Tasten und digitalen Eingänge zu reduzieren. Eine einzelne Taste kann zwei oder mehr Funktionen übernehmen. Zum Beispiel ein kurzer Druck zum Einschalten des Lichts, ein langer Druck zum Einschalten des Ventilators.
  • Verwenden Sie den langen Druck statt des kurzen Drucks, um versehentliches Drücken zu vermeiden. Zum Beispiel verwenden einige Geräte den Knopf zum Zurücksetzen auf Werkseinstellungen. Wenn der Knopf versehentlich gedrückt wird, ist das gefährlich.

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