Hi zusammen,
ich bin blutiger Anfänger und hab eine Frage zum Arduino. Der
nachfolgende Code aktiviert die Led für 5 Sekunden bei Tastendruck. Wie
schreibe ich das Programm um, damit erst beim Loslassen des Tasters
geschaltet wird? Bei gedrückthalten soll nämlich nichts schalten.
Keiner erbarmt sich? Ok.
Setz mal in deine IF-Schleife nach der ersten Klammer eine komplette
weitere IF-Schleife, in der du den unbetätigten Schalterzustand
abfragst, bei dir vermutlich tasterstatus == LOW.
Etwa so:
if taster==1
{if taster==0
{led ein
warte 5s}}
Du vermischt hier Loop mit Eventbasiert/Task. Das ist eine Sackgasse,
aber für einen Anfänger zum üben OK.
Du wirst diesen Code nie erweitern können und was anderes parallel
machen (zweite Taste auswerten oder LED-Blinken lassen). Für sowas
brauchst Du eine Loop mit Statemachine und/oder eine Tastenentprellung.
Wenn Du Dir dessen bewusst bist, dann kannst Du Deinen Code gerne für
erste Schritte nutzen.
z.B.:
Günther schrieb:> Kannst du mir das vielleicht einmal in den Code einfügen? Bei mir gibts> einen Fehler :(
Welchen Fehler? Das ist Dein Code, nur erweitert um "flag". Wenn das
Token schon belegt ist, nenne es tast_flg oder wie auch immer.
Wenn Du doch in Richtung Statemachine willst, ohne Tastenentprellen fürs
erste, dann geht auch:
1
inttst_flg=0;
2
voidloop()
3
{
4
tasterstatus=digitalRead(taster);
5
if(tasterstatus==HIGH)
6
{
7
tst_flg=1000;// An-Zeit im ms
8
digitalWrite(LED,LOW);
9
}
10
elseif(tst_flg==0)
11
{
12
digitalWrite(LED,LOW);
13
}
14
else
15
{
16
digitalWrite(LED,HIGH);
17
tst_flg--;
18
}
19
delay(1);// jeder Durchlauf etwa 1 ms
20
}
Hier wird tst_flg auf die Anzahl von ms gesetzt, die die LED an bleiben
soll. Und nur wenn eingeschaltet (tst_flg >0) und noch nicht fert, geht
die LED an.
Das ist noch ohne Entprellen, dafür aber eine Loop.
Günther schrieb:> Es geht, riesen Danke!!!
Ah, ok. Wenn es geht, kannst Du auch gleich noch eine perfekte
Entprellung (für Deine Aufgabe) mit einbauen. Dabei dann doch lieber
noch ein Flag für die LED einführen und die Zeit umdrehen (0..999 ist
an)
1
inttst_flg=10000;/* höher als maximal */
2
voidloop()
3
{
4
intled_flg=0;// default ist aus!
5
6
tasterstatus=digitalRead(taster);
7
if(tasterstatus==HIGH)
8
{
9
tst_flg=-20;/* Entprellzeit */
10
}
11
if(tst_flag<1000)// an-Zeit
12
{
13
tst_flg++;/* Zeitdauer */
14
if(tst_flag>0)
15
{
16
led_flg=1;/* LED ist nur an zwischen 0 und 1000 */
17
}
18
}
19
if(led_flg){digitalWrite(LED,HIGH);}
20
else{digitalWrite(LED,Low);}
21
22
delay(1);// jeder Durchlauf etwa 1 ms
23
}
Damit ist das auch entprellt.
Hier könntest Du auf gleiche Weise noch 10 andere Tasten und LEDs
einlesen oder steuern.
A. S. schrieb:> Hier könntest Du auf gleiche Weise noch 10 andere Tasten und LEDs> einlesen oder steuern.
Naja, vorher solltest Du vielleicht Taster und LED trennen.
Beim Taster (tst_flg) die ms zum Entprellen zählen, bei der LED
(led_flg) die zum An-Sein:
if(tst_flg==0)/* keine Entprellung aktiv, nicht gedrückt */
11
{
12
tst_flg=20;/* Entprellzeit beim Drücken */
13
}
14
}
15
else/* losgelassen */
16
{
17
if(tst_flg==1)/* nur bei 1 ist das ein Tastenwechsel! */
18
{
19
led_flg=1000;/* An-Zeit der LED */
20
tst_flg=-15;/* Entprellzeit beim Loslassen */
21
}
22
}
23
/* Tastentimer: Zählen zu 0 bzw. 1 */
24
if(tst_flg>1)tst_flg--;/* Entprellen beim Drücken */
25
if(tst_flg<0)tst_flg++;/* Entprellen beim Loslassen */
26
27
if(led_flg){digitalWrite(LED,HIGH);led_flg--;}
28
else{digitalWrite(LED,Low);}
29
30
delay(1);// jeder Durchlauf etwa 1 ms
31
}
Solange die Loop in 1ms durchläuft, dürfte das schon sehr gut sein. Der
Trigger kommt schnellstmöglich (mit der ersten Loslass-Flanke) und ist
trotzdem in beide Richtungen individuell entprellt. Es fehlt noch die
Eliminierung von Spikes/Störungen/EMV. Ist keine Mehraufwand, wären hier
aber unübersichtlicher.