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.
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
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
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.