Langer Tastendruck

Hallo liebe Gemeinde,

bastele mir gerade ein Midi Controller. Soweit alles im grünen Bereich.

Nun möchte ich aber Tasten mit doppelten Funktionen belegen.

D.h., drückt man einen Taster länger, kommt man in eine andere Funktionsebene.

Beispiele für das Auswerten eines langen Tastendrucks habe ich bereits viele gefunden, alle haben jedoch gemeinsam dass man den Taster erst loslassen muss, damit eine Auswertung möglich ist.

Kennt jemand den Trick wie man es ermöglicht, den Taster ca. 3 Sekunden gedrückt zu halten so dass er eine neue Funktion aufruft und erst dann den Taster loslässt ;-)

Gruß

Ein Versuch:

#include <Bounce2.h>
#define pinT 2
uint32_t aktMillis, altMillis, drueckMillis = 1000;
bool status;
Bounce debouncer = Bounce();

void setup() {
  Serial.begin(9600);
  Serial.println("Anfang");
  pinMode(pinT, INPUT_PULLUP);
  debouncer.attach(pinT);
  debouncer.interval(30);
}

void loop() {
  debouncer.update();
  aktMillis = millis();
  if ( debouncer.fell()  ) {    // Taste gedrückt
    altMillis = aktMillis;
    status = true;
  }
  if ( debouncer.rose()  ) {    // Taste losgelassen
    status = false;
    if (aktMillis - altMillis < drueckMillis) {
      Serial.println("Kurz");
    }
  }
  if (status && (aktMillis - altMillis >= drueckMillis)) {
    status = false;
    Serial.println("Lang");
  }
}

Kennt jemand den Trick wie man es ermöglicht, den Taster ca. 3 Sekunden gedrückt zu halten so dass er eine neue Funktion aufruft und erst dann den Taster loslässt ;-)

Das ist leider ein Widerspruch in sich. Wenn Du die Funktion aufrufen willst, bevor Du die Taste losgelassen hast, dann musst Du die Funkion sofort aufrufen, wenn die notwendige Zeit des Drückens erreicht ist. Somit wird die erste Belegung des Tasters sofort beim Drücken ausgelöst und nach 3 Sekunden dann die Zweitbelegung. Wenn das in Deinem Fall erwünscht ist oder zumindest nicht nachteilig ist, dann kannst Du Deine Idee verwicklichen, andernfalls nicht und musst auf die Variante mit dem Loslassen ausweichen (welche übrigens auch der Code von agmue implementiert).

Ich habe mir agmues Beispiel nicht angesehen, aber pylons Einwand ist natürlich richtig.

Daraus folgt: Beide Aktionen können/dürfen/müssen erst nach Loslassen des Tasters ausgeführt werden. Denn zu diesem Zeitpunkt ist erst klar, wie lange gedrückt wurde.

Klaus_ww: Ich habe mir agmues Beispiel nicht angesehen, ...

Schade, denn es funktioniert.

Der kurze Tastendruck kann nur nach dem Loslassen erkannt werden, das ist logisch. Der lange wird nach Ablauf einer Zeit festgestellt.

Ob es das ist, was der TO möchte, wird sich herausstellen. Nur ein Trick ist es nicht, bin kein Illusionist :)

agmue: Schade, denn es funktioniert.

Ich hab's mir nur deshalb nicht weiter angesehen, weil ich a) Deinen Künsten vertraue :sunglasses: b) ich ein fauler Hund bin :smiling_imp: c) einfach mal meine Binsenweisheit loswerden wollte - und natürlich hast Du recht, langes Drücken geht auch ohne loslassen. Siehste, doch wieder was gelernt.

Hallo,

Einspruch, der Taster muss nicht erst losgelassen werden um die Aktion auszuführen. Man kennt ja die Zeit die abgelaufen ist für das entprellen. Wenn die um ist, wurde das drücken Entprellsicher erkannt und es kann sofort ohne loslassen etwas gemacht werden.

Und wie unterscheidest Du dann zwischen kurzdrück und langdrück? Die Aktion bei kurzdrück soll ja bei langdrück NICHT ausgeführt werden.

Hallo,

erst mal vielen Dank für Eure Mühen. Besonders Agmue. Leider funktioniert der Sketch nicht so wie erhofft. Ich kann meinen Taster gedrückt lassen bis zum Sankt Nimmerleinstag. Es passiert nix ;-). Hmmm. Vielleicht muss ich das doch Hardwareseitig lösen. ;-(

Gruß

Klaus_ww: Und wie unterscheidest Du dann zwischen kurzdrück und langdrück? Die Aktion bei kurzdrück soll ja bei langdrück NICHT ausgeführt werden.

stimmt, mein Denkfehler :o :(

keybi:
Vielleicht muss ich das doch Hardwareseitig lösen. ;-(

Irgendwie schon, denn mein Taster schaltet gegen GND. Und Deiner?

Ich verwende den internen PullUp-Widerstand. Ungedrückt ist der Eingang damit auf HIGH. Bei gedrücktem Taster wird der Eingang gegen GND geschaltet. Dank 50 kOhm PullUp gibt es keinen Kurzschluß, sondern es fließt ein kleiner Strom.

Klaus_ww:
Ich hab’s mir nur deshalb nicht weiter angesehen, weil ich
a) Deinen Künsten vertraue :sunglasses:
b) ich ein fauler Hund bin :smiling_imp:
c) einfach mal meine Binsenweisheit loswerden wollte - und natürlich hast Du recht, langes Drücken geht auch ohne loslassen. Siehste, doch wieder was gelernt.

Zu a) dann kann ich ja getrost Träumen gehen :sleeping:
Zu b) ich sowieso :smiley:
Zu c) ich lerne hier auch immer was :slight_smile:

:o Oh Mann, Schande über mich. Am Ende des Tages soll man einfach nur noch TV schauen. Habe zum Testen ein Taster eines Miniprototyps genutzt der mit PullDown gegen 5 Volt schaltet.

Jetzt klappt es prima. Tausend Dank.

Einen Pulldown gegen +5V schalten ist sehr schwierig. Da muß man teuflisch aufpassen daß da kein Pullup rauskommt. ;) ;)

uwefed: Einen Pulldown gegen +5V schalten ist sehr schwierig. Da muß man teuflisch aufpassen daß da kein Pullup rauskommt. ;) ;)

Manchmal kommt ein Genie um die Ecke und schafft das was bisher nicht für möglich schien. :grin:

keybi:
Jetzt klappt es prima. Tausend Dank.

Freut mich!

Dein Bild wird bei mir nicht angezeigt, darum hier für die Tablet-Nutzer:

Knut.png

;-)

Aber noch ne Frage zum PULL UP.

Das Brettchen hatte schon Pulldown Widerstände verlötet. Das Gros der Schalter ist mir einem 4051 an den Inputpin angeschlossen. Wenn ich nun die Widerstände umgehe und diesen Eingang HIGH schalte, geht das wunderbar. Aber nur solange ich digitalRead(pin) != HIGH abfrage.

Wenn ich nun stattdessen den Bounce Befehl " taste2.fell() " benutze, geht das nicht. " taste2.fell() " geht jedoch wenn ich den INPUT wieder auf LOW setzte und den Taster gegen 5 Volt schalte.

Hmmmm :o

keybi: Das Brettchen hatte schon Pulldown Widerstände verlötet.

Dann INPUT_PULLUP durch INPUT ersetzen und rose und fell vertauschen, damit sich die Logik zugunsten der PullDowns dreht. (ungetestet)