Forum: Mikrocontroller und Digitale Elektronik Mehrere Tastenzustände abfragen


von Bastler (Gast)


Lesenswert?

Hallo Leute,

ich suche eine Möglichkeit die Drückdauer eines Tastendrucks abzufragen.

Dabei wären 3 Zustände für mich wichtig:

1. Taste 0-1 Sekunde gedrückt
2. Taste 1-3 Sekunden gedrückt
3. Taste länger als 3 Sekunden gedrückt


Die Entprellroutine von Peter Dannegger kenne ich bereits.
Allerdings fragt diese nur zwei Zustände ab. Kann mir jemand einen Tipp 
geben?

von Rainer U. (r-u)


Lesenswert?

Falls es auf die Pausen dazwischen nicht so sehr ankommt, probier dies:


erste steigende Flanke erkennen
10ms warten
wenn 0 -> prellen, war nix, fertig
990 ms warten
wenn 0 -> < 1 Sekunden gedrückt, fertig
2 Sekunden warten
wenn 0 -> < 3 Sekunden gedrückt, fertig
sonst -> > 3 Sekunden gedrückt. Warten auf fallende Flanke, fertig

Das ist zwar nicht die reine Lehre, aber wenn es nicht auf die ms 
ankommt, und der Schalter nur bei an/aus prellt, funktioniert das ganz 
gut.

Versuch macht kluch!

von Wolfgang (Gast)


Lesenswert?

Bastler schrieb:
> Kann mir jemand einen Tipp geben?

Du musst die Zeit zwischen Drücken der Taste und Wiederloslassen messen. 
Zusätzlich prüfst du noch, ob nach dem Drücken der Taste mehr als 3s 
verstrichen sind, ohne dass die Taste wieder losgelassen wurde.

von Karl M. (Gast)


Lesenswert?

Bastler schrieb:
> Hallo Leute,
>
> ich suche eine Möglichkeit die Drückdauer eines Tastendrucks abzufragen.
>
> Dabei wären 3 Zustände für mich wichtig:
>
> 1. Taste 0-1 Sekunde gedrückt
> 2. Taste 1-3 Sekunden gedrückt
> 3. Taste länger als 3 Sekunden gedrückt
>
> Die Entprellroutine von Peter Dannegger kenne ich bereits.
> Allerdings fragt diese nur zwei Zustände ab. Kann mir jemand einen Tipp
> geben?

Das stimmt fast, in der Entwicklungsgeschichte wurden Erweiterungen 
veröffentlicht, die auch die Zeitdauer umfasst.

von Ben (Gast)


Lesenswert?

Falls du mit der Arduino IDE arbeitest, könntest du folgende Bibliothek 
verwenden. Da gibt es eine Methode (getHoldTime), die dir die Zeit des 
Gedrückt-Haltens zurückgibt.
https://github.com/TOLDOTECHNIK/TTBOUNCE#getholdtime

von Peter D. (peda)


Lesenswert?

Bastler schrieb:
> Die Entprellroutine von Peter Dannegger kenne ich bereits.

Du kannst z.B. im Main mit get_key_rpt() eine Variable hochzählen. Wird 
die Taste losgelassen (Bit in key_state = 0), wertet man die Variable 
aus, ob lang oder sehr lang gedrückt wurde.

von TotoMitHarry (Gast)


Lesenswert?

Ist ja kein Hexenwerk, eine Library??????

Hoffe ich habe hier jetzt ungetestet keinen Fehler eingebaut. kann man 
auch ohne Arduino so machen.
1
int buttonPin=5;
2
int laststate= LOW;
3
unsigned long lastpush=0;
4
int lastshot[3]={false,false,false};
5
void setup() {
6
     pinMode(buttonPin, INPUT_PULLUP);
7
    Serial.begin(19200);
8
}
9
10
unsigned long gethold(){
11
unsigned long mymillis=millis();
12
 if(digitalRead(buttonPin)==HIGH)
13
   {
14
    lastpush=mymillis;
15
    lastshot[0]=true;
16
    lastshot[1]=true;
17
    lastshot[2]=true;
18
   }
19
   return mymillis-lastpush;  
20
} 
21
22
void loop() {
23
unsigned long getTime=gethold();
24
if(getTime>0) 
25
if(getTime>3000&&!lastshot[2]){
26
Serial.println("3000");
27
lastshot[2]=true;
28
}else 
29
if(getTime>2000&&!lastshot[1]){
30
Serial.println("2000");
31
  lastshot[1]=true;
32
}else
33
if(getTime>1000&&!lastshot[0]){
34
Serial.println("1000");
35
  lastshot[0]=true;
36
}
37
38
  
39
}

von TotoMitHarry (Gast)


Lesenswert?

TotoMitHarry schrieb:
>     lastshot[0]=true;
>     lastshot[1]=true;
>     lastshot[2]=true;

muss
    lastshot[0]=false;
    lastshot[1]=false;
    lastshot[2]=false;

heissen.

von GEKU (Gast)


Lesenswert?

Peter D. schrieb:
> eine Variable hochzählen

Man auch die Variable im Systemticker hochzählen (z.B. alle 100ms), dann 
hat man den Zählerstand mit einer Dauer bewertet.

von Peter D. (peda)


Lesenswert?

TotoMitHarry schrieb:
> kann man
> auch ohne Arduino so machen.

Du meintest wohl mit, denn da sind ja ne Menge Arduino-Aufrufe drin.
Entprellen sollte man die Tasten aber auch.

von Axel S. (a-za-z0-9)


Lesenswert?

Bastler schrieb:
> ich suche eine Möglichkeit die Drückdauer eines Tastendrucks abzufragen.
> Dabei wären 3 Zustände für mich wichtig:
>
> 1. Taste 0-1 Sekunde gedrückt
Das kannst du erst erkennen, wenn die Taste losgelassen wurde.

> 2. Taste 1-3 Sekunden gedrückt
Das kannst du erst erkennen, wenn die Taste losgelassen wurde.

> 3. Taste länger als 3 Sekunden gedrückt
Das willst du möglicherweise erkennen, bevor die Taste losgelassen 
wurde.

> Die Entprellroutine von Peter Dannegger kenne ich bereits.
Gut. Da hast du doch einen Punkt, wo du starten kannst.

> Kann mir jemand einen Tipp geben?
Das Hirn einschalten? Für die ersten beiden Fälle brauchst du 
offensichtlich eine Art Zeitmessung, die mit dem Drücken der Taste 
losläuft und wo du die Zeitdauer beim Loslassen der Taste abliest. Für 
den dritten Fall brauchst du eine Möglichkeit, die Zeitdauer periodisch 
abzufragen. Der Entprell-Interrupt drängt sich doch für beide 
Aufgabenstellungen geradezu auf.

von Teo D. (teoderix)


Lesenswert?

Axel S. schrieb:
>> 1. Taste 0-1 Sekunde gedrückt
> Das kannst du erst erkennen, wenn die Taste losgelassen wurde.

Axel S. schrieb:
>> Kann mir jemand einen Tipp geben?
> Das Hirn einschalten?

!!!

von Philipp G. (geiserp01)


Lesenswert?

Teo D. schrieb:
>>> 1. Taste 0-1 Sekunde gedrückt
>> Das kannst du erst erkennen, wenn die Taste losgelassen wurde.

Noe, eigentlich gar nicht. Taste 0 Sekunden gedrückt wird sehr schwierig 
zu erfassen sein.

Mach es einfach so:

If Flanke == 1
  Zähler start
   If Zeit > 100ms
       Taste ist gedrückt
       If Zeit > 1000ms
         Taste ist länger 1s gedrückt

: Bearbeitet durch User
von TotoMitHarry (Gast)


Lesenswert?

Peter D. schrieb:
> Du meintest wohl mit, denn da sind ja ne Menge Arduino-Aufrufe drin.
> Entprellen sollte man die Tasten aber auch.

Nee.. also millis und pinabfrage sind ja jetzt nicht DIE große 
änderung.. entprellt ist der so automatisch!

von W.S. (Gast)


Lesenswert?

Bastler schrieb:
> Die Entprellroutine von Peter Dannegger kenne ich bereits.

Und warum kannst du so etwas nicht aus eigener Kraft?

Sowas ist doch kinderleicht und mit fast jedem Timertick-Handler in fast 
jedem µC zu erledigen.

Man braucht dazu nur wenige Zustände zu beachten:

0. nix war bisher gedrückt, entspricht Zeitzähler ist 0 -> ende

1. Taste ist jetzt gedrückt, war vorher nicht gedrückt -> Zeitzähler auf 
1 setzen

2. Zeitzähler hochzählen. Wenn größer als etwa 10 ms -> Zustand 3. 
(hängt vom Timertick ab, recht üblich sind so etwa 10 ms pro Timertick)

3. Zeitzähler hochzählen. Taste losgelassen? dann { Zeitzähler bewerten, 
dann löschen und Ende mit Kategorie Zeit < 1Sek oder Zeit 1Sek..3Sek.}
'else' wenn Zeit > 3.1 Sek -> Zustand 4. und Ende mit Zeit > 3Sek.

4. nix tun, bis Taste losgelassen. Dann Zeitzähler löschen.

Man braucht dafür nur eine einzige Hochzähl-Variable.
Also stell dich nicht so an.

W.S.

von Karl B. (gustav)


Lesenswert?

Hi,

hier findest Du ein asm-File
https://s-huehn.de/elektronik/wohnuhr/wohnuhr.htm

  wohnuhr-v115-std.zip
Durchscrollen bis Kommentar:
;  - Aktionen bei Erkennung eines Tastendrucks

das kommt @Pedas Idee nahe und:

GEKU schrieb:
> Man auch die Variable im Systemticker hochzählen (z.B. alle 100ms), dann
> hat man den Zählerstand mit einer Dauer bewertet.

Der Clou: An denselben Port, mit dem der DCF77 High/Low Pegel bewertet 
wird, kann auch ein Taster drangeklemmt werden.

ciao
gustav

: Bearbeitet durch User
von Peter D. (peda)


Lesenswert?

TotoMitHarry schrieb:
> Nee.. also millis und pinabfrage sind ja jetzt nicht DIE große
> änderung..

Ohne Arduino Lib hagelt es tonnenweise Fehler.


TotoMitHarry schrieb:
> entprellt ist der so automatisch!

Nö, da ist nix entprellt. Kurze Störungen (Drücker oder Loslasser) 
können als Taste erkannt werden.

von TotoMitHarry (Gast)


Lesenswert?

Peter D. schrieb:
> Nö, da ist nix entprellt. Kurze Störungen (Drücker oder Loslasser)
> können als Taste erkannt werden.

In dieser Anwendung für diese 'Anforderung ist 1 Sekunde Entprellung ja 
wohl genug.

Der ist voll entprellt oder sehe ich hier was nicht? Alles kürzer 1 
Sekunde wird nicht erkannt.. wenn man noch 1 Stufe if mit 50-100ms 
einbaut ist der sogar für einen normalen Tasterdruck ansprechbar.

Ja na klar.. es geht ja um den Sinn des ganzen. Man muss halt Variablen, 
digitalread und millis gegen AVR eigenes Tauschen. War mir als Beispiel 
auch zu aufwendig.

von Peter D. (peda)


Lesenswert?

TotoMitHarry schrieb:
> In dieser Anwendung für diese 'Anforderung ist 1 Sekunde Entprellung ja
> wohl genug.

Die sehe ich nicht.
Es reicht eine Störung zwischen 2 Abtastungen und die erfolgen mit 
maximaler Geschwindigkeit, wenn die Mainloop nichts anderes zu tun hat, 
geschätzt alle 10µs.

TotoMitHarry schrieb:
> wenn man noch 1 Stufe if mit 50-100ms
> einbaut

Das würde es etwas entschärfen, aber auch nur die Störungen, wenn 
losgelassen.
Störungen können aber auch beim gedrückt halten einkoppeln bzw. Kontakte 
können kratzen (Schmutz, Oxidschicht, lahme Federn).
Ich weiß, Geräte testet man immer mit fabrikneuen Tasten. Was nach 
Ablauf der 2 Jahre Garantie dann beim Kunden passiert, interessiert 
nicht mehr.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.