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?
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!
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.
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.
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
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.
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 | }
|
TotoMitHarry schrieb: > lastshot[0]=true; > lastshot[1]=true; > lastshot[2]=true; muss lastshot[0]=false; lastshot[1]=false; lastshot[2]=false; heissen.
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.
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.
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.
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? !!!
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
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!
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.
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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.