INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
RGB-LED faden [Fehler im Code]
01.09.2019, 10:18
Beitrag #1
Photo RGB-LED faden [Fehler im Code]
Hallo zusammen,
ich bin ungeübt neu im Umgang mit dem Arduino und wollte eine RGB-LED programmieren, dass sie einfadet, eine Zeit lang hell bleibt und dann eine andere Farbe einfadet. Ich wollte damit anfangen, erst mal eine der LEDs zum Faden zu bringen, die restlichen Farben einfügen geht ja schnell, wenn man das Prinzip verstanden hat.
Ich habe folgenden Code geschrieben, um meine Grüne LED langsam heller werden zu lassen, eine Zeit lang leuchten zu lassen und dann wieder auszufaden:

Zitat:int var = 0 ; //Variable Helligkeit
int LEDrot = 2; //Port 2 = Farbe rot
int LEDgruen = 3; //Port 3 = Farbe grün
int LEDblau = 4; //Port 4 = Farbe blau
int p = 2000; //Dauer der Pause (hier: 2 Sekunden)
int d = 50 ; //Dauer der Phase, bevor die LED um eine Helligkeitsstufe geändert wird

void setup()
{
pinMode (LEDrot,OUTPUT) ; //LEDrot ist eingestellt als Output
pinMode (LEDgruen,OUTPUT) ; //LEDgruen ist eingestellt als Output
pinMode (LEDblau,OUTPUT) ; //LEDblau ist eingestellt als Output
}

void loop()
{

var=0 ; //die Helligkeit (/die Variable) ist eingestellt auf 0 (= aus)
while (var <= 200) //diese Loop-Klammer wird so lange wiederholt, bis die Helligkeit nicht mehr unter Stufe 200 ist
{
analogWrite(LEDgruen, var); //die Helligkeit von LEDgruen wird auf die Variable "var" gesetzt
var+5 ; //die Variable "var" wird um fünf erhöht
delay (d) ; //Verzögerung von "d" (hier: 50ms)
}

delay (p); //LEDgruen bleibt an, bis dieser Delay vorbei ist

var=200 ; //die Helligkeit (/die Variable) ist immernoch eingestellt auf 200 (= ein)
while (var >= 0) //diese Loop-Klammer wird so lange wiederholt, bis die Helligkeit nicht mehr über Stufe 0 ist (läuft also so lange, bis das Licht ausgefadet ist)
{
analogWrite(LEDgruen, var); //die Helligkeit von LEDgruen wird auf die Variable "var" gesetzt
var-5 ; //die Variable "var" wird um fünf gesenkt
delay (d) ; //Verzögerung von "d" (hier: 50ms)
}
} //alles wird wiederholt


Wenn ich den Code starte, leuchtet die LED jedoch die ganze Zeit durch, und ich kann den Grund dafür nicht finden.

Wisst ihr, was ich falsch mache?


Ich habe mal im Internet geschaut und diesen Code gefunden:


Zitat:const int rotPin = 2; // Rote LED an Pin 10 angeschlossen
const int gruenPin = 3; // Gruene LED an Pin 9 angeschlossen
const int blauPin = 4; // Blaue LED an Pin 11 angeschlossen


// Variablen
int r = 0; // Variable Rot für die Farbmischung
int g = 0; // Variable Grün für die Farbmischung
int b = 0; // Variable Blau für die Farbmischung
int fadeZeit = 5; // Ein höherer Wert verlangsamt den Farbwechsel
boolean ersterLauf = true; // Wird benötigt um den ersten Durchlauf des Programms zu erkennen


void setup()
{
pinMode(rotPin, OUTPUT); // Setzt LEDPin als Ausgang
pinMode(gruenPin, OUTPUT); // Setzt LEDPin als Ausgang
pinMode(blauPin, OUTPUT); // Setzt LEDPin als Ausgang
}


void loop()
{
// Fragt ab, ob das der erste Durchlauf des Programms ist.
// Wenn ja, wird die blaue LED hochgefahren
if (ersterLauf == true)
{
// Start mit Blau
for (b = 0; b < 255; b++)
{
analogWrite(blauPin, b);
delay(fadeZeit);
}
}

ersterLauf = false; // Speichert, dass der erste Durchlauf volzogen ist

// Wechsel von Blau zu Lila
for (r = 0; r < 255; r++)
{
analogWrite(rotPin, r);
delay(fadeZeit);
}

Jedoch verstehe ich ihn nicht ganz.


Also: Wisst ihr, was ich falsch gemacht habe und kann mir jemand eventuell den zweiten Code erklären?

Vielen Dank im Voraus Smile
Ben
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.09.2019, 10:27 (Dieser Beitrag wurde zuletzt bearbeitet: 01.09.2019 10:28 von Tommy56.)
Beitrag #2
RE: RGB-LED faden [Fehler im Code]
Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [*code] davor und [*/code] dahinter ohne *), nit als Zitat (quote).
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.

Du hast doch schon eine Schleife (loop), also brauchst Du keine weiteren Schleifen (for/while).
Merke Dir den aktuellen Wert in einer globalen Variable und ändere ihn nach einiger Zeit. Die Zeit am Besten mit millis() (BlinkWithoutDelay in den Beispielen) gestalten.

Was an dem 2. Code hast Du konkret nicht verstanden?

Welchen Arduino verwendest Du?

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.09.2019, 10:31
Beitrag #3
RE: RGB-LED faden [Fehler im Code]
Es ist immer schlecht, einen Sketch aus dem Web von dritten erklären zu lassen.

Warum fragst du nicht einfach den Autor des Sketches, der muss doch seinen Sketch sehr gut kennen. Wir müssen uns da genauso hineinarbeiten, wie du.

Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. Cool
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
01.09.2019, 13:00 (Dieser Beitrag wurde zuletzt bearbeitet: 01.09.2019 13:09 von MicroBahner.)
Beitrag #4
RE: RGB-LED faden [Fehler im Code]
Mal unabhängig davon, dass der Code nicht optimal ist ( wie dir Tommy schon geschrieben hat), da Du ja schon mit loop eine Schleife hast.

Die Ursache für dein Problem liegt in diesen Zeilen:
Code:
var+5 ; //die Variable "var" wird um fünf erhöht
...
    var-5 ; //die Variable "var" wird um fünf gesenkt
Damit wird die variabel eben nicht erhöht bzw erniedrigt. Du berechnest zwar den entsprechenden Wert, schmeißt ihn dann aber wieder weg, denn er wird nirgends zugewiesen. Richtig wäre
Code:
var = var+5 ; //die Variable "var" wird um fünf erhöht
...
   var = var-5 ; //die Variable "var" wird um fünf gesenkt
oder in verkürzter Schreibweise:
Code:
var+=5 ; //die Variable "var" wird um fünf erhöht
...
    var-=5 ; //die Variable "var" wird um fünf gesenkt
Wenn Du in der IDE unter 'Voreinstellungen' die Warnungen einschaltest, macht dich der Compiler auf solche Dinge aufmerksam. Sie sind zwar syntaktisch korrekt ( deshalb keine Fehlermeldung ) aber sinnlos ( deshalb 'nur' eine Warnung ).

N.B. Du solltest deinen Code nicht als Zitat einstellen, sondern mit Codetags ( das '#' ooben rechts im Editor )

Edit: der 2. Code ist im Prinzip genauso aufgebaut wie deiner, nur verwendet er statt eine while-Schleife eine for-Schleife. Die for-Schleife erledigt das incrementieren der Variablen automatisch, da musst Du dich dann nicht selbst drum kümmern.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
02.09.2019, 14:42 (Dieser Beitrag wurde zuletzt bearbeitet: 02.09.2019 15:02 von Botographic.)
Beitrag #5
RE: RGB-LED faden [Fehler im Code]
(01.09.2019 10:31)hotsystems schrieb:  Es ist immer schlecht, einen Sketch aus dem Web von dritten erklären zu lassen.

Warum fragst du nicht einfach den Autor des Sketches, der muss doch seinen Sketch sehr gut kennen. Wir müssen uns da genauso hineinarbeiten, wie du.

Stimmt, das könnte ich auch machen, danke für den Tipp Big Grin

(01.09.2019 13:00)MicroBahner schrieb:  Mal unabhängig davon, dass der Code nicht optimal ist ( wie dir Tommy schon geschrieben hat), da Du ja schon mit loop eine Schleife hast.

Die Ursache für dein Problem liegt in diesen Zeilen:
Code:
var+5 ; //die Variable "var" wird um fünf erhöht
...
    var-5 ; //die Variable "var" wird um fünf gesenkt
Damit wird die variabel eben nicht erhöht bzw erniedrigt. Du berechnest zwar den entsprechenden Wert, schmeißt ihn dann aber wieder weg, denn er wird nirgends zugewiesen. Richtig wäre
Code:
var = var+5 ; //die Variable "var" wird um fünf erhöht
...
   var = var-5 ; //die Variable "var" wird um fünf gesenkt
oder in verkürzter Schreibweise:
Code:
var+=5 ; //die Variable "var" wird um fünf erhöht
...
    var-=5 ; //die Variable "var" wird um fünf gesenkt
Wenn Du in der IDE unter 'Voreinstellungen' die Warnungen einschaltest, macht dich der Compiler auf solche Dinge aufmerksam. Sie sind zwar syntaktisch korrekt ( deshalb keine Fehlermeldung ) aber sinnlos ( deshalb 'nur' eine Warnung ).

N.B. Du solltest deinen Code nicht als Zitat einstellen, sondern mit Codetags ( das '#' ooben rechts im Editor )

Edit: der 2. Code ist im Prinzip genauso aufgebaut wie deiner, nur verwendet er statt eine while-Schleife eine for-Schleife. Die for-Schleife erledigt das incrementieren der Variablen automatisch, da musst Du dich dann nicht selbst drum kümmern.

Ich habe mal versucht, mich in die for/while-Schleifen einzudenken und jetzt auch verstanden, wie der zweite Code funktioniert. Meinen ersten Entwurf habe ich auch mal nach dem "var = var+5"-Prinzip umgebaut und er klappt tatsächlich. Danke für deine Hilfe! Smile

(01.09.2019 10:27)Tommy56 schrieb:  Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [*code] davor und [*/code] dahinter ohne *), nit als Zitat (quote).
So ist er auch auf portablen Geräten lesbar. Das kannst Du auch noch nachträglich ändern.

Du hast doch schon eine Schleife (loop), also brauchst Du keine weiteren Schleifen (for/while).
Merke Dir den aktuellen Wert in einer globalen Variable und ändere ihn nach einiger Zeit. Die Zeit am Besten mit millis() (BlinkWithoutDelay in den Beispielen) gestalten.

Was an dem 2. Code hast Du konkret nicht verstanden?

Welchen Arduino verwendest Du?

Gruß Tommy

Zitat:Welchen Arduino verwendest Du?
Ich benutze den MEGA 2560

Zitat:Setze Deinen Code bitte in Codetags (</>-Button oben links im Forumseditor oder [*code] davor und [*/code] dahinter ohne *), nit als Zitat (quote).
Werde ich in Zukunft machen, jedoch sind die 600 Minuten Bearbeitungszeit schon vorbei.

Zitat:Du hast doch schon eine Schleife (loop), also brauchst Du keine weiteren Schleifen (for/while).
Mein Gedanke war, dass der Abschnitt so oft wiederholt wird, bis die Variable/die Helligkeit eine bestimmte Stufe erreicht hat.

Zitat:Merke Dir den aktuellen Wert in einer globalen Variable und ändere ihn nach einiger Zeit. Die Zeit am Besten mit millis() (BlinkWithoutDelay in den Beispielen) gestalten.
Was ist eine globale Variable? Mit millis() habe ich mich leider noch nicht befasst bzw. die meisten Artikel darüber nicht verstanden.

Zitat:Was an dem 2. Code hast Du konkret nicht verstanden?
Ich hatte die Kopfzeile nicht verstanden, aber dank dem Internet und einem Kommentar unter meinem Thread habe ich ihn nun doch verstanden.


LG Ben.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Question Wie html code der " und ' enthält in eine Stringvariable bringen? Triax16 2 91 Gestern 09:26
Letzter Beitrag: Triax16
  ASCII code in Dezimalzahl umwandeln acca500 8 287 15.05.2020 11:34
Letzter Beitrag: acca500
  Fehler bei delay über 32767 Kleingärtner 5 277 07.05.2020 18:51
Letzter Beitrag: Kleingärtner
  Asembler-Code langsamer als C? GuaAck 0 230 06.05.2020 23:40
Letzter Beitrag: GuaAck
  Fehler bei eigener Library Samu_wo 4 266 20.04.2020 15:51
Letzter Beitrag: Samu_wo
  Fehler beim Kompilieren Lunge 6 363 09.04.2020 14:07
Letzter Beitrag: MicroBahner
  Undefined reference-Fehler beim Kompilieren MdE 9 517 24.03.2020 21:39
Letzter Beitrag: Tommy56
  Stepper Motor mit zwei Taster bedienen / Fehler ohne Fehlermeldung Milano 6 475 21.03.2020 16:06
Letzter Beitrag: MicroBahner
  Fehler bei Kompilieren ak68 6 757 21.03.2020 13:12
Letzter Beitrag: Tommy56
Question "Bobbycar LED" - 2 Fragen (Mehrere Taster: Unterprog. Abbrechen / Einfacher "Code" ?) KlausGuenther 13 965 19.03.2020 14:09
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste