Drucktaster, Unterscheidung zwischen 1-mal Drücken und Festhalten.

Hallo,

für mein Projekt benutzer ich einen Taster. Dieser Taster incrementiert eine Integer-Variable. Derzeit ist es so, dass wenn mam einmal drückt, dann wird diese Zahl um +1 erhöht. Damit beim Drücken der Taste nicht gleich +24 (usw.) addiert wird, habe ich ein delay(200) eingesetzt. Auch beim längerem Drücken der Taste wird in der gleichen Geschwindigkeit addiert. Wie könnte ich, beim langem Drücken der Taste, die Delay-Zeit verkürzen damit man auch mal auf 30.000 und mehr kommen kann, ohne dass der Finger abstirbt. Ich denke, Eine Erkennung, wie lange man die Taste Drückt sollte sein.

void loop()
{ 
  buttonGedrueckt1 = digitalRead(buttonPin1);  //Status des Buttons 1 wird eingelesen
  if (buttonGedrueckt1 == HIGH)
     {
      EndZaehler += 1;
      lcd.setCursor(11, 0);
      lcd.print("       ");
      lcd.setCursor(11, 0);
      lcd.print(EndZaehler);
         
      delay(200);    
     }

Danke, Luckner

Indem man statt der 200 eine Variable nimmt ?
Oder indem man nach einer gewissen Zeit mehr als 1 addiert?

Was fehlt wirklich fehlt: Diese Variablen wieder auf 1 bzw. 200 setzen, wenn der Taster losgelassen wurde.

Und nicht über den int-Bereich hinauslaufen :wink:

Das mit der Variablen habe ich mir auch schon überlegt. Aber wie stelle ich fest, wie lange die Taste gedrückt worden ist?

2 Möglichkeiten:
a) mit delay() und zählen
b) mit millis(): Erkennen, dass der Taster jetzt neu gedrückt ist und die Zeit merken.

Ich bremse mich mal mit einer Musterlösung. Viel Spaß.

Hallo michael_x,

danke für die Hinweise. Werde mich damit beschäftigen. Mal schauen, ob mir da was einfällt.

Gruß, Luckner

Luckner:
Das mit der Variablen habe ich mir auch schon überlegt. Aber wie stelle ich fest, wie lange die Taste gedrückt worden ist?

Du nimmst eine zusätzliche Zählvariable z.B. i. Wenn i z.B. 20 erreicht, wird die Delay Zeit (Variable) drastisch verkürzt. i sollte einen nicht zu kleinen Zahlenbereich haben. Es würde sich vielleicht unsigned long anbieten.

Die Zahlvariable i wird in einer zweiten if-Abfrage auf Null gesetzt, wenn die Taste losgelassen wird.

Oder du addierst, je nach Größe der zu inkrementierenden Zahl, mehr als nur +1.

z.B.
Zahl 10 .. 99: +1
Zahl 100 .. 990: +10
Zahl 1000 .. 9900: +100
...

guntherb:
je nach Größe der zu inkrementierenden Zahl

Und wie willst du da z.B. eine "1987" einstellen ?
Man sollte schon, nach loslassen und neu drücken, wieder langsam und mit +1 anfangen.
(Und mit einem zweiten Taster auch rückwärts korrigieren können, wo wir schonmal dabei sind).

Mit 3 bis 4 Tastern kann man auch einzelne Dezimalziffern auswählen (links rechts) und diese jeweils einzeln hochsetzen (rauf mit 8->9->0 oder rauf/runter mit 2 Tasten) .

Also ich habe es so gelöst und bin erst mal zufrieden.

void loop()
{
buttonGedrueckt1 = digitalRead(buttonPin1); //Status des Buttons 1 wird eingelesen
if (buttonGedrueckt1 == HIGH)
{
if (buttonStatus1 < 3)
{
buttonStatus1 += 1;
delayZeit = 200;
}
else
{
delayZeit = 10;
}

EndZaehler += 1;
lcd.setCursor(11, 0);
lcd.print(" ");
lcd.setCursor(11, 0);
lcd.print(EndZaehler);

delay(delayZeit);
}
else
{
buttonStatus1 = 0;
}

Danke für die Anregungen.

michael_x:
Und wie willst du da z.B. eine "1987" einstellen ?

Mit meiner Methode?
Garnicht.

Es kommt, wie so oft, auf die Anforderungen an.

Wenn nur irgendwelche Faktoren einstellen will (z.B. ki-Parameter) die sich über einen größeren Einstellbereich erstrecken, reicht das. Auch bei Zeiten reicht es oft. (Ob das Ei 5 min oder 6 min kocht ist wichtig.
Ob der Braten 120min oder 121min im Ofen ist, ist egal.

Ich habe eine von vielen Möglichkeiten skizziert, die Aufgrund der sehr offenen Aufgabenstellung durchaus hätte die Lösung sein können.