Mehrere Tastenzustände abfragen

Gast #5882040
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!
Gast
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.
Gast
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.
Gast
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
}
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.
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
Gast
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!
Gast
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
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 7 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.