Tutorial: Kurzen vom langen Tastendruck unterscheiden



  • In einem Projekt von mir - Mister T - habe ich einen Button mit grundlegend zwei Funktionen ausgestattet:

    1. mit kurzem Druck auf den Button kann man durch das Menü tabben

    2. mit langem Tastendruck wird eine andere Aktion basierend auf dem Menü ausgeführt

    Wie man ein einfaches Menü für einen Button erstellen kann, habe ich bereits erklärt.
    Re: Code: Einfaches Menü mit Button.

    In diesem Post möchte ich die Frage klären, wie man allgemein einen kurzen von einem langen Tastendruck unterscheiden kann.

    Ihr solltet die Grundlagen von Inputs / Variablen / … kennen. Ich werde das hier nicht mit einbeziehen.


    Disclaimer

    Wie immer führen 1000 Wege nach Rom und meine ist mit Sicherheit nicht die beste Lösung. Es wird keinen Code geben den man 1:1 anwenden kann. Es geht hier rein um die Verständnisfrage.


    Ich hab für meine Methode eine Funktion des D1 Mini verwendet. Und zwar die Funktion

    millis()
    

    Die Funktion millis()gibt die Anzahl von Millisekunden zurück, seit der D1 Mini das aktuelle Programm gestartet hat. Sobald der D1 Mini mit Strom versorgt wird, startet also auch der Zähler der Funktion millis().

    Diese Funktion kann man sich zu nutzen machen, um Zeit-Differenzen zu berechnen.
    Die Definition bleibt einem immer selber überlassen. In einem Beispiel könnte das so aussehen:

    int kurzer_tastendruck = 10;
    int langer_tastendruck = 500; 
    

    Ein kurzer Tastendruck wird hier im Beispiel mit 10ms definiert. Ein langer Tastendruck mit 500ms.


    Um unterscheiden zu können, ob der Taster kurz oder lang gedrückt worden ist muss folgendes beachtet werden.


    1.

    die Funktion millis() muss in einer Variable gespeichert, und in Dauerschleife immer aktuell gehalten wird.

    int kurzer_tastendruck = 10;
    int langer_tastendruck = 500;
    
    unsigned long time;
    
    void loop() {
      time = millis();
    }
    

    Der Typ unsigned long ist wichtig.

    Die Variable timeläuft nach etwa 50 Tagen über und geht auf 0 zurück. Jeder andere Datentyp wie int, long, … verkürzt diese Zeit drastisch und kann zu Fehlern im Programm führen.


    2.

    Die Variable time kann jetzt dazu verwendet werden, um die Dauer des Tastendrucks auszulesen. Dazu brauchen wir zwei weitere Variablen.

    int button_hold_time;
    

    Diese Variable speichert, wie lange der Knopf gedrückt ist.


    int button_active;
    

    Und diese Variable speichert, ob der Knopf aktiv gedrückt ist. Diese Variable brauchen wir, damit button_press_time nicht ständig aktualisiert wird, sondern nur einmal.

    if(button == HIGH && button_active == 0){
       button_press_time = time;
       button_active = 1;
    }
    
    if(button == LOW && button_active == 1){
       button_release_time = time;
       button_active = 0;
    }
    
    button_hold_time = (button_release_time - button_press_time);
    

    Die Variable button_hold_time kann dann dazu verwendet werden, um sie mit den Zeiten unserer Definitionen zu vergleichen.

    if(button_hold_time <= kurzer_tastendruck){
       // Der Tastendruck war kurz
    }
    
    if(button_hold_time >= langer_tastendruck){
       // Der Tastendruck ist lang
    }
    

    Im Programm anwenden

    In einem Programm könnte das dann so aussehen:

    int kurzer_tastendruck = 10;
    int langer_tastendruck = 500;
    
    unsigned long time;
    
    int button_hold_time;
    
    int button_active;
    
    void setup() {
      button_active = digitalRead(button);
    }
    
    void loop() {
    
      time = millis();
    
      if(button == HIGH && button_active == 0){
          button_press_time = time;
          button_active = 1;
       }
    
       if(button == LOW && button_active == 1){
          button_release_time = time;
          button_active = 0;
       }
    
       button_hold_time = (button_release_time - button_press_time);
    
       if(button_hold_time <= kurzer_tastendruck){
          // Der Tastendruck war kurz
       }
    
       if(button_hold_time >= langer_tastendruck){
          // Der Tastendruck ist lang
       }
    
    }
    

    Anregungen und Verbesserungsvorschläge / Korrekturen bitte mitteilen. thx