Arduino Nano ESP32 - Knopf - Langes Drücken Kurzes Drücken

Dieses Tutorial gibt Anweisungen dazu, wie man den Arduino Nano ESP32 verwendet, um den langen Tastendruck und den kurzen Tastendruck zu erkennen. Genauer gesagt lernen wir Folgendes:

Erforderliche Hardware

1×Arduino Nano ESP32
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 Arduino Nano
1×(Empfohlen) Breakout-Erweiterungsboard für Arduino Nano
1×(Empfohlen) Stromverteiler für Arduino Nano ESP32

Oder Sie können die folgenden Kits kaufen:

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 Button

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

Verdrahtungsdiagramm

Arduino Nano ESP32 Taster-Verdrahtungsdiagramm

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

Dieses Tutorial verwendet den internen Pull-Up-Widerstand. Der Zustand des Tasters ist im Normalzustand HIGH und bei Betätigung LOW.

So erkennen Sie einen kurzen Druck

  • Messen Sie die Zeit zwischen dem Drücken und dem Loslassen.
  • Wenn die Dauer kürzer als eine vorab festgelegte Zeit ist, wird das kurze Drücken erkannt.

Schauen wir uns Schritt für Schritt an:

  • Definieren Sie, wie lange die maximale Dauer eines kurzen Drucks anhält.
#define SHORT_PRESS_TIME 500 // 500 Millisekunden
  • Erkennen, dass der Knopf gedrückt wurde, und die Zeit des Drückens speichern.
if(prev_state == HIGH && button_state == LOW) pressed_time = millis();
  • Erkenne, wenn die Taste losgelassen wird, und speichere die Zeit des Loslassens
if(prev_state == LOW && button_state == HIGH) released_time = millis();
  • Berechne die Pressdauer und
long press_duration = released_time - pressed_time;
  • Bestimme den kurzen Druck, indem du die Druckdauer mit der definierten kurzen Druckzeit vergleichst.
if( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected");

Arduino Nano ESP32-Code zur Erkennung eines kurzen Tastendrucks

/* * Dieser Arduino Nano ESP32 Code wurde von newbiely.de entwickelt * Dieser Arduino Nano 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/arduino-nano-esp32/arduino-nano-esp32-button-long-press-short-press */ #define BUTTON_PIN D2 // Arduino Nano ESP32 pin D2 pin connected to button #define SHORT_PRESS_TIME 500 // 500 milliseconds int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin unsigned long pressed_time = 0; unsigned long released_time = 0; void setup() { Serial.begin(9600); 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) // button is pressed pressed_time = millis(); else if (prev_button_state == LOW && button_state == HIGH) { // button is released released_time = millis(); long press_duration = released_time - pressed_time; if ( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } // save the the last state prev_button_state = button_state; }

Schnelle Schritte

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

※ Notiz:

Der serielle Monitor kann für einen einzelnen Knopfdruck mehrere kurze Betätigungen ausgeben. Dies ist ein normales Verhalten des Tasters. Dieses Verhalten wird als „Prellphänomen“ bezeichnet. Wir werden in diesem Tutorial später lernen, wie man dieses Problem beseitigt.

Wie man einen langen Druck erkennt

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

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

Im ersten Fall:

  • Messen Sie die Zeitdauer zwischen dem Drücken- und dem Loslassen-Ereignis.
  • Wenn die Dauer länger als eine vordefinierte Zeit ist, wird das Long-Press-Ereignis erkannt.

Im zweiten Fall: Solange der Knopf gedrückt wird, führen Sie den untenstehenden Prozess wiederholt aus:

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

Arduino Nano ESP32-Code zur Erkennung eines langen Tastendrucks beim Loslassen

/* * Dieser Arduino Nano ESP32 Code wurde von newbiely.de entwickelt * Dieser Arduino Nano 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/arduino-nano-esp32/arduino-nano-esp32-button-long-press-short-press */ #define BUTTON_PIN D2 // Arduino Nano ESP32 pin D2 pin connected to button #define LONG_PRESS_TIME 1000 // 1000 milliseconds int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin unsigned long pressed_time = 0; unsigned long released_time = 0; void setup() { Serial.begin(9600); 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) // button is pressed pressed_time = millis(); else if(prev_button_state == LOW && button_state == HIGH) { // button is released released_time = millis(); long press_duration = released_time - pressed_time; if( press_duration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } // save the the last state prev_button_state = button_state; }

Schnelle Schritte

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

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

/* * Dieser Arduino Nano ESP32 Code wurde von newbiely.de entwickelt * Dieser Arduino Nano 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/arduino-nano-esp32/arduino-nano-esp32-button-long-press-short-press */ #define BUTTON_PIN D2 // Arduino Nano ESP32 pin D2 pin connected to button #define LONG_PRESS_TIME 1000 // 1000 milliseconds int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin unsigned long pressed_time = 0; bool is_pressing = false; bool is_long_detected = false; void setup() { Serial.begin(9600); 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) { // button is pressed pressed_time = millis(); is_pressing = true; is_long_detected = false; } else if(prev_button_state == LOW && button_state == HIGH) { // button is released is_pressing = false; } if(is_pressing == true && is_long_detected == false) { long press_duration = millis() - pressed_time; if( press_duration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); is_long_detected = true; } } // save the the last state prev_button_state = button_state; }

Schnelle Schritte

  • Falls dies das erste Mal ist, dass Sie den Arduino Nano ESP32 verwenden, sehen Sie sich [wie man die Umgebung für Arduino Nano ESP32 in der Arduino IDE einrichtet] an.
  • Laden Sie den obigen Code über die Arduino IDE auf den Arduino Nano ESP32 hoch.
  • Drücken Sie den Knopf und lassen Sie ihn nach einigen Sekunden wieder los.
  • Prüfen Sie das Ergebnis im Serial Monitor. Es sieht folgendermaßen aus:
COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

So erkennen Sie sowohl langes Drücken als auch kurzes Drücken

Kurzer Tastendruck und langer Tastendruck nach dem Loslassen

/* * Dieser Arduino Nano ESP32 Code wurde von newbiely.de entwickelt * Dieser Arduino Nano 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/arduino-nano-esp32/arduino-nano-esp32-button-long-press-short-press */ #define BUTTON_PIN D2 // Arduino Nano ESP32 pin D2 pin connected to button #define SHORT_PRESS_TIME 1000 // 1000 milliseconds #define LONG_PRESS_TIME 1000 // 1000 milliseconds int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin unsigned long pressed_time = 0; unsigned long released_time = 0; void setup() { Serial.begin(9600); 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) // button is pressed pressed_time = millis(); else if (prev_button_state == LOW && button_state == HIGH) { // button is released released_time = millis(); long press_duration = released_time - pressed_time; if ( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); if ( press_duration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } // save the the last state prev_button_state = button_state; }

Schnelle Schritte

※ Notiz:

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

Kurzer Druck und langer Druck beim Drücken

/* * Dieser Arduino Nano ESP32 Code wurde von newbiely.de entwickelt * Dieser Arduino Nano 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/arduino-nano-esp32/arduino-nano-esp32-button-long-press-short-press */ #define BUTTON_PIN D2 // Arduino Nano ESP32 pin D2 pin connected to button #define SHORT_PRESS_TIME 1000 // 1000 milliseconds #define LONG_PRESS_TIME 1000 // 1000 milliseconds int prev_button_state = LOW; // The previous state from the input pin int button_state; // The current reading from the input pin unsigned long pressed_time = 0; unsigned long released_time = 0; bool is_pressing = false; bool is_long_detected = false; void setup() { Serial.begin(9600); 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) { // button is pressed pressed_time = millis(); is_pressing = true; is_long_detected = false; } else if (prev_button_state == LOW && button_state == HIGH) { // button is released is_pressing = false; released_time = millis(); long press_duration = released_time - pressed_time; if ( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } if (is_pressing == true && is_long_detected == false) { long press_duration = millis() - pressed_time; if ( press_duration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); is_long_detected = true; } } // save the the last state prev_button_state = button_state; }

Schnelle Schritte

Langes Drücken und Kurzes Drücken mit Entprellung

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

Entprellen ist etwas kompliziert, insbesondere wenn mehrere Tasten verwendet werden. Um es Anfängern einfacher zu machen, haben wir eine Bibliothek erstellt, die ezButton heißt.

Wir werden diese Bibliothek in den untenstehenden Codes verwenden.

Kurzer Tastendruck und langer Tastendruck mit Entprellung nach dem Loslassen

/* * Dieser Arduino Nano ESP32 Code wurde von newbiely.de entwickelt * Dieser Arduino Nano 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/arduino-nano-esp32/arduino-nano-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(D2); // create ezButton object for pin Arduino Nano ESP32 pin D2 unsigned long pressed_time = 0; unsigned long released_time = 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()) pressed_time = millis(); if (button.isReleased()) { released_time = millis(); long press_duration = released_time - pressed_time; if ( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); if ( press_duration > LONG_PRESS_TIME ) Serial.println("A long press is detected"); } }

Schnelle Schritte

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

/* * Dieser Arduino Nano ESP32 Code wurde von newbiely.de entwickelt * Dieser Arduino Nano 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/arduino-nano-esp32/arduino-nano-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(D2); // create ezButton object for pin Arduino Nano ESP32 pin D2 unsigned long pressed_time = 0; unsigned long released_time = 0; bool is_pressing = false; bool is_long_detected = 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()) { pressed_time = millis(); is_pressing = true; is_long_detected = false; } if (button.isReleased()) { is_pressing = false; released_time = millis(); long press_duration = released_time - pressed_time; if ( press_duration < SHORT_PRESS_TIME ) Serial.println("A short press is detected"); } if (is_pressing == true && is_long_detected == false) { long press_duration = millis() - pressed_time; if ( press_duration > LONG_PRESS_TIME ) { Serial.println("A long press is detected"); is_long_detected = 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 Lang- und Kurzdrücken benötigt werden

  • Um die Anzahl der Tasten und digitalen Eingangs-Pins zu verringern. Eine einzige Taste kann zwei oder mehr Funktionen übernehmen. Zum Beispiel kurzes Drücken zum Einschalten des Lichts, langes Drücken zum Einschalten des Ventilators.
  • Verwenden Sie den langen Druck statt des kurzen Drucks, um versehentliches Drücken zu vermeiden. Zum Beispiel verwenden einige Gerätemodelle 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!