Arduino - Taste - Langes Drücken Kurzes Drücken

Wir werden lernen:

In den ersten drei Teilen lernen wir im Prinzip, wie man erkennt.

Im letzten Teil lernen wir, wie man in der Praxis mithilfe der Entprellung erkennt, wann der Taster gedrückt wurde. Siehe warum wir für den Taster eine Entprellung benötigen. Ohne Entprellung kann die kurze Betätigung des Tasters möglicherweise falsch erkannt werden.

Erforderliche Hardware

1×Arduino Uno R3
1×USB 2.0 Kabel Typ A/B (für USB-A PC)
1×USB 2.0 Kabel Typ C/B (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×(Empfohlen) Schraubklemmenblock-Shield für Arduino Uno
1×(Empfohlen) Breadboard-Shield für Arduino Uno
1×(Empfohlen) Gehäuse für Arduino Uno
1×(Empfohlen) Prototyping-Grundplatte & Breadboard-Kit für Arduino Uno

Oder Sie können die folgenden Kits kaufen:

1×DIYables STEM V3 Starter-Kit (Arduino 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 Button

Wenn Sie nichts über Taster wissen (Pinbelegung, wie sie funktionieren, wie man sie programmiert ...), informieren Sie sich in den folgenden Tutorials darüber:

Verdrahtungsdiagramm

Arduino-Taster-Schaltplan

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

In diesem Tutorial verwenden wir den internen Pull-up-Widerstand. Daher ist der Zustand des Tasters im Normalzustand HIGH und beim Drücken LOW.

Wie man einen kurzen Tastendruck erkennt

Wir messen die Zeitdauer zwischen dem Drücken und dem Loslassen. Wenn die Dauer kürzer als eine festgelegte Zeit ist, wird das Kurzdruck-Ereignis erkannt.

Schauen wir uns Schritt für Schritt an:

  • Definieren Sie, wie lange der maximale kurze Tastendruck anhält.
const int SHORT_PRESS_TIME = 500; // 500 Millisekunden
  • Erkennen, wann der Knopf gedrückt wird, und den Zeitpunkt des Drucks speichern
if(lastState == HIGH && currentState == LOW) pressedTime = millis();
  • Erkenne, wann der Knopf losgelassen wird, und speichere den Zeitpunkt des Loslassens.
if(lastState == LOW && currentState == HIGH) releasedTime = millis();
  • Berechne Drückdauer und
long pressDuration = releasedTime - pressedTime;
  • Bestimme den kurzen Druck, indem du die Betätigungsdauer mit der definierten kurzen Betätigungszeit vergleichst.
if( pressDuration < SHORT_PRESS_TIME ) Serial.println("A short press is detected");

Arduino-Code zur Erkennung eines kurzen Tastendrucks

/* * 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-long-press-short-press */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin const int 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

  • Lade den obigen Code mit der Arduino IDE auf den Arduino hoch.
  • Drücke den Knopf mehrmals kurz hintereinander.
  • Schau dir das Ergebnis im Serial Monitor an.
COM6
Send
A short press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

※ Notiz:

Der serielle Monitor kann bei einem einzigen Tastendruck mehrere kurze Betätigungen erkennen. Dies ist das normale Verhalten des Tasters. Dieses Verhalten wird als das „Prellen-Phänomen“ bezeichnet. Das Problem wird im letzten Teil dieses Tutorials gelöst.

So erkennen Sie einen langen Druck

Es gibt zwei Anwendungsfälle dafür, einen langen Druck zu erkennen.

  • Der Langdruck wird direkt nach dem Loslassen der Taste erkannt
  • Der Langdruck wird erkannt, während die Taste gedrückt gehalten wird, selbst dann, wenn die Taste noch nicht losgelassen wurde

Im ersten Anwendungsfall messen wir die Zeitdauer zwischen den Druck- und Loslassen-Ereignissen. Wenn die Dauer länger als eine festgelegte Zeit ist, wird ein Langdruck-Ereignis erkannt.

Im zweiten Anwendungsfall wird nach dem Drücken des Knopfs kontinuierlich die Druckdauer gemessen und das Langdruck-Ereignis überprüft, bis der Knopf losgelassen wird. Während der Betätigung des Knopfs wird die Dauer gemessen. Wenn die Dauer länger ist als eine definierte Zeit, wird das Langdruck-Ereignis erkannt.

Arduino-Code zur Erkennung eines langen Tastendrucks beim Loslassen

/* * 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-long-press-short-press */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin const int 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

  • Lade den obigen Code über die Arduino IDE auf den Arduino hoch.
  • Drücke den Knopf nach einer Sekunde und lasse ihn los.
  • Siehe das Ergebnis im seriellen Monitor.
COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Das Langdruck-Ereignis wird erst erkannt, nachdem die Schaltfläche losgelassen wurde.

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

/* * 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-long-press-short-press */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin const int 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

  • Lade den obigen Code über die Arduino IDE auf das Arduino-Board.
  • Drücke nach einigen Sekunden den Knopf und lasse ihn los.
  • Schau das Ergebnis im Serial Monitor an.
COM6
Send
A long press is detected
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Das Langdruck-Ereignis wird nur erkannt, wenn die Taste noch nicht losgelassen wurde.

Wie man sowohl langes Drücken als auch kurzes Drücken erkennt

Kurzer Tastendruck und langer Tastendruck nach dem Loslassen

/* * 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-long-press-short-press */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin const int SHORT_PRESS_TIME = 1000; // 1000 milliseconds const int 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

  • Lade den obigen Code über die Arduino IDE auf den Arduino hoch.
  • Langes und kurzes Drücken des Tasters.
  • Sieh dir das Ergebnis im Serial Monitor an.

※ Notiz:

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

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

/* * 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-long-press-short-press */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin const int SHORT_PRESS_TIME = 1000; // 1000 milliseconds const int 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

  • Lade den obigen Code mit der Arduino IDE auf den Arduino hoch.
  • Drücke den Knopf lang oder kurz.
  • Sieh das Ergebnis im Serial Monitor.

※ Notiz:

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

Langes Drücken und Kurzes Drücken mit Entprellung

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

Die Entprellung ist etwas kompliziert, insbesondere wenn mehrere Taster verwendet werden. Um es Anfängern deutlich leichter 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 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-long-press-short-press */ #include <ezButton.h> const int SHORT_PRESS_TIME = 1000; // 1000 milliseconds const int LONG_PRESS_TIME = 1000; // 1000 milliseconds ezButton button(7); // create ezButton object that attach to pin 7; 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

  • Installieren Sie die ezButton-Bibliothek. Siehe Wie man sie installiert
  • Laden Sie den obigen Code über die Arduino IDE auf den Arduino hoch.
  • Langer und kurzer Druck auf den Knopf.
  • Siehe das Ergebnis im Serial Monitor.

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

/* * 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-long-press-short-press */ #include <ezButton.h> const int SHORT_PRESS_TIME = 1000; // 1000 milliseconds const int LONG_PRESS_TIME = 1000; // 1000 milliseconds ezButton button(7); // create ezButton object that attach to pin 7; 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

  • Installiere die ezButton-Bibliothek. Siehe Anleitung zur Installation
  • Lade den obigen Code über die Arduino-IDE auf das Arduino-Board hoch.
  • Drücke den Taster sowohl lang als auch kurz.
  • Sieh das Ergebnis im seriellen Monitor.

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 nötig sind

  • Um die Anzahl der Tasten zu reduzieren. Eine einzige Taste kann zwei oder mehr Funktionen übernehmen. Zum Beispiel: Ein kurzer Druck ändert den Betriebsmodus, ein langer Druck schaltet das Gerät aus.
  • Durch längeres Drücken wird ein unbeabsichtigter kurzer Druck vermieden. Zum Beispiel verwenden einige Gerätetypen die Taste für einen Werksreset. Wenn die Taste versehentlich gedrückt wird, ist das gefährlich. Um dies zu vermeiden, ist das Gerät so implementiert, dass der Werksreset nur erfolgt, wenn die Taste lange gedrückt wird (z. B. über 5 Sekunden).

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