Forum: Mikrocontroller und Digitale Elektronik Sketch-Ebike


von Günther (Gast)


Lesenswert?

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.

1
int LED = 6;
2
int taster = 7;
3
int tasterstatus = 0;
4
5
void setup()
6
{
7
pinMode(LED, OUTPUT);
8
pinMode(taster, INPUT);
9
}
10
11
void loop()
12
{
13
tasterstatus = digitalRead(taster);
14
if (tasterstatus == HIGH)
15
{
16
digitalWrite(LED, HIGH);
17
delay (1000);// Hier soll die Wartezeit rein!
18
digitalWrite(LED, LOW);
19
}
20
else
21
{
22
digitalWrite(LED, LOW);
23
}
24
}

: Verschoben durch Moderator
von Sketch nur im TV (Gast)


Lesenswert?

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

von nicht Gast (Gast)


Lesenswert?

Sketch nur im TV schrieb:
> deine IF-Schleife nach der ersten Klammer eine komplette
> weitere IF-Schleife

http://www.if-schleife.de/

von Sketch nur im TV (Gast)


Lesenswert?

Recht hat er!

von A. S. (Gast)


Lesenswert?

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.:
1
int flag = 0;
2
void loop()
3
{
4
   tasterstatus = digitalRead(taster);
5
   if (tasterstatus == HIGH)
6
   {
7
      flag=1;
8
   }
9
   else
10
   {
11
      if(flag==1) 
12
      {
13
         digitalWrite(LED, HIGH);
14
         delay (1000);// Hier soll die Wartezeit rein!
15
         digitalWrite(LED, LOW);
16
         flag=0;
17
      }
18
   }
19
   digitalWrite(LED, LOW);
20
}

Sketch nur im TV schrieb:
> IF-Schleife

http://if-schleife.de/

von Günther (Gast)


Lesenswert?

Kannst du mir das vielleicht einmal in den Code einfügen? Bei  mir gibts 
einen Fehler :(

von Günther (Gast)


Lesenswert?

Es geht, riesen Danke!!!

von A. S. (Gast)


Lesenswert?

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
int tst_flg = 0;
2
void loop()
3
{
4
   tasterstatus = digitalRead(taster);
5
   if (tasterstatus == HIGH)
6
   {
7
      tst_flg=1000;  // An-Zeit im ms
8
      digitalWrite(LED, LOW);
9
   }
10
   else if(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.

von A. S. (Gast)


Lesenswert?

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
int tst_flg = 10000; /* höher als maximal */
2
void loop()
3
{
4
int led_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.

von A. S. (Gast)


Lesenswert?

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:

1
int tst_flg = 0; // tasten-timer, >0 gedrückt, <=0 losgelassen 
2
int led_flg = 0; // LED-Timer, 0 ist aus!
3
4
void loop()
5
{
6
   tasterstatus = digitalRead(taster);
7
8
   if (tasterstatus == HIGH) /* gedrückt! */
9
   {
10
       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.

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.