Arduino Mikrocontroller Tutorials - Softwaretechnik

Taster auf Klick, Doppelklick oder Langklick auswerten

Mit diesem Programm kann man die Art des Tastendrucks auswerten. Wie beim Entprellen wird nach 50ms ein zweites Mal geprüft ob Taster noch gedrückt ist. Ab dann wird die Zeit berechnet wie lange die Taste betätigt bleibt. Größer 400ms wird sofort als "langer Tastendruck" gewertet. Wenn der Tastendruck kürzer war wird noch einmal 500ms weiter geprüft ob ein zweiter Tastendruck nachkommt. Wird dieser erkannt, handelt es sich um einen "Doppelklick". Kommt dieser zweite Tastendruck innerhalb der Zeitspann nicht, wird ein "kurzer Tastendruck" ausgegeben.
Im weiteren Programmablauf wird anhand des erkannten Tasten-Status eine entsprechende Meldung an den seriellen Monitor ausgegeben.

Schaltung und Programmcode

Schaltplan Taster
void setup() { pinMode(2, INPUT_PULLUP); Serial.begin(9600); } void loop() { // Rückgabewert der Taste 1=Klick, 2=Doppelklick, 3=Longklick byte tastenModus = 0 // Tastereingang 2x abfragen if (digitalRead(2) == LOW) { delay(50); if (digitalRead(2) == LOW) { long startZeit = millis(); do { /*nichts tun*/ } while (digitalRead(2) == LOW) // Dauer des Tastendrucks berechnen long dauer = millis() - startZeit + 50 // Betätigungsdauer auswerten if (dauer > 400) { tastenModus = 3; // langer Tastendruck >400ms } else { // bei kurzem Tastendruck nochmal 500ms auf Doppelklick prüfen long zeitStempel = millis(); while (millis() < zeitStempel + 500) { // Tastereingang wieder 2x abfragen if (digitalRead(2) == LOW) { delay(50); if (digitalRead(2) == LOW) { do { /*nichts tun*/ } while (digitalRead(2) == LOW); tastenModus = 2; // Doppelklick erkannt } } } // Überprüfen ob bereits ein Doppelklick erkannt wurde if (tastenModus == 0) { tastenModus = 1; // dann einfacher Tastendruck } } // Ausgeben des erkannten Tastendrucks auf dem Seriellen Monitor if (tastenModus == 1) { Serial.println("kurzer Tastendruck"); } else if (tastenModus == 2) { Serial.println("Doppelklick"); } else if (tastenModus == 3) { Serial.println("langer Tastendruck"); } else { Serial.println("undefiniert"); } } }