Forum: Mikrocontroller und Digitale Elektronik Arduino: Taster als Schalter


von L. M. (lightman)


Lesenswert?

Hallo,

ich steuere eine RGB-LED mit einem Arduino.

Ich will folgendes Projekt realisieren:
Zunächst soll eine Led Pulsieren; sobald ein Taster gedrück wird, soll 
ein bestimmtes Fade-Muster der anderen Farben einsetzen.

Das Pulsieren und auch das Fade-Muster für sich habe ich alles 
hinbekommen.

Mein Problem ist allerdings, dass ich den Taster bis zum Ende des 
Pulsierens gedrück halten muss, um dann das Faden der anderen Farben 
auszulösen. Ich will aber, dass sofort beim Drücken des Tasters das 
Fade-Muster der anderen Farben ausgelöst wird.

Im Prinzip lässt sich das mMn. auf das Problem herunter brechen, wie man 
einen Taster als Schalter programmieren kann. Ich habe bereits alle 
möglichen do-, while- und for-schleifen ausprobiert, kommen aber zu 
keinem befriedigendem Ergebnis.

Könnt Ihr mir hierbei helfen?

Viele Grüße

von A.G. (Gast)


Lesenswert?

L. M. schrieb:
> Mein Problem ist allerdings, dass ich den Taster bis zum Ende des
> Pulsierens gedrück halten muss, um dann das Faden der anderen Farben
> auszulösen.

Das wird an der Ablaufsteuerung in deinem Programm liegen.

von L. M. (lightman)


Lesenswert?

Hier der Ausschnitt aus dem Programmcode:


1
for (int i4 = 255; i4 > 0; i4--){
2
    if(switchState == HIGH){
3
      goto fade;
4
    }
5
    
6
    else{
7
      blueValue = i4;
8
      analogWrite(bluePin, blueValue);
9
      delay(12);
10
    }
11
12
  }
13
14
  for (int i5 = 0; i5 < 255; i5++){
15
    if(switchState == HIGH){
16
      goto fade;
17
    }
18
    else{
19
      blueValue = i5;
20
      analogWrite(bluePin, blueValue);
21
      delay(10);
22
    }  
23
      
24
  }
25
     
26
  
27
  fade:
28
    for (int i2 = 0; i2 < 255; i2++){
29
        redValue = i2;
30
        analogWrite(redPin, redValue);
31
        greenValue = 255 - i2;
32
        analogWrite(greenPin, greenValue);
33
        delay(40);
34
     }
35
36
     delay(50);
37
  
38
      for (int i3 = 0; i3 < 255; i3++){
39
        greenValue = i3;
40
        analogWrite(greenPin, greenValue);
41
        delay(10);
42
      }
43
44
      delay(50);
45
    
46
}

von asterix (Gast)


Lesenswert?

aufgrund des gezeigten Quellcodes empfehle ich dir erstmal klein 
anzufangen. Dein Programm hat mehrere Stellen an denen es mir übel wird 
;-)

warum fading? bringe erstmal eine LED zum leuchten, zum blinken, zum 
faden... und das anschließend mit Tasterabfrage... dann hast du nach und 
nach für die kleinen Baustellen eine Lösung und kannst mit deinem 
Vorhaben hier weiter machen

von asterix (Gast)


Lesenswert?

ps: der Threadname ist auch etwas komisch gewählt oder nicht?!

von Wolfgang E. (Firma: janeeisklar) (whattheheck)


Lesenswert?

Wenn der Taster gedrückt wird, eine boolesche Variable auf High setzen. 
fade nicht mit goto aufrufen, sondern als Subroutinen-Aufruf in loop(), 
wenn die Variable auf High gesetzt ist. In der fade-Subroutine die 
Variable dann auf Low setzen, wenn das Faden abgeschlossen ist.

von Karl H. (kbuchegg)


Lesenswert?

Der ganze Ansatz krankt schon an den for-Schleifen.

Du musst von diesen weg!

Deine Denkweise muss sich umstellen von "ich muss 255 mal den Wert in 
einer Schleife erhöhen/erniedrigen", hin zu

"Ich schlafe die ganze Zeit vor mich hin. Gerade jetzt, in diesem Moment 
bin ich aufgewacht, sehe mich um und entscheide, was ich jetzt in dieser 
Sekunde zu tun habe. Was in der vergangenen Sekunde war, das hab ich mir 
selbst in Variablen hinterlassen, so dass ich meine Entscheidungen 
darauf begründen kann. Was in der nächsten Sekunde sein wird, 
interessiert mich erst, wenn ich das nächste mal aufwache"

Das ganze nennt sich 'Event-getriebenes Programmieren'. Das Ereignis, 
das bei dir anliegt, besteht darin, dass loop() nach einer gewissen Zeit 
wieder aufgerufen wird. Anhand von Variablen, die du dir selbst gesetzt 
hast, entscheidest du was in diesem EINEN Durchlauf durch loop() zu 
geschehen hat. Nicht mehr und nicht weniger.

Am Beispiel einer blinkend fadenden roten LED:
1
boolean  FadeDir = TRUE;   // TRUE ist: Werte nehmen zu
2
int      FadeLevel;        // 0 bis 255
3
4
5
void loop()
6
{
7
  if( FadeDir )               // soll nach oben gefadet werden ?
8
  {
9
    FadeLevel++;              //   dann erhöhe die Stufe
10
11
    if( FadeLevel >= 255 )    //   Maximum erreicht?
12
      FadeDir = FALSE;        //   -> dann wird beim nächsten AUfruf von loop
13
                              // nach unten gefaded
14
15
    analogWrite( redPin, FadeLevel );
16
  }
17
18
  else                        // nicht nach oben faden, also nach unten
19
  {
20
    FadeLevel--;              //    ergo die Stufe verringern
21
22
    if( FadeLevel <= 0 )      //    Minimum erreicht?
23
      FadeDir = TRUE;         //    -> dann beim nächsten mal wieder nach oben
24
25
    analogWrite( redPin, FadeLevel );
26
  }
27
28
  delay( 10 );                // fuers erste mal do um die Geschwindigkeit zu verlangsamen
29
}

Die Wertänderungen verteilen sich sukzessive auf entsprechende Aufrufe 
von loop.
Jeder Aufruf von loop entspricht einem 'Aufwachen'. Die Funktion 'sieht 
sich um' indem es anhand der Variablen feststellt, was es bei genau 
diesem einen Aufruf zu tun gibt. Für den nächsten AUfruf von loop 
hinterlässt es sich entsprechende Variablen (FadeDir), die es abhängig 
von den Maximalwerten entsprechend setzt, so dass beim nächsten Aufruf 
von loop wieder das richtige passiert.


Dann klappt das auch, dass du dir einen Modus einbauen kannst und du mit 
Tastendruck jederzeit (in den Grenzen des delay) in einen anderen Modus 
umschalten kannst (alles ein, alles aus, blinkend, fadend blinkend). 
Selbst dann, wenn das Faden noch nicht einen der Maximalwerte erreicht 
hat.

: Bearbeitet durch User
von L. M. (lightman)


Lesenswert?

Hallo,

vielen Dank für eure zahlreichen Hilfestellungen.
Vor allem die Erklärung zum Event-getriebenen Programmieren hat mir sehr 
weiter geholfen. Jetzt klappt alles, wie es soll.

Viele Grüße

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.