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
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.
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 | }
|
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
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.