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
  Fehler beim Hochladen auf Atmega 328 delay 17 975 30.07.2019 12:33
Letzter Beitrag: Tommy56
  DCF77 Fehler beim Kompilieren Xwill 5 897 11.06.2019 21:47
Letzter Beitrag: Tommy56
  Auslagern von Code aus einer Bibliothek Blende8 6 669 10.04.2019 20:23
Letzter Beitrag: Tommy56
  Einfache IF-Abfrage....(mir) unerklärlicher Fehler Lite 10 790 24.03.2019 12:36
Letzter Beitrag: Lite
  Fehler in Beispielen MCP23S17 Blende8 0 409 03.03.2019 10:22
Letzter Beitrag: Blende8
  Lokale Variable an loop zurück - Fehler Haukini 3 567 26.02.2019 22:33
Letzter Beitrag: Haukini
  Kompass kalibrieren - GY-271/QMC5883L - Beispiel-Code? Arduinero 0 856 29.01.2019 16:57
Letzter Beitrag: Arduinero
  Code für Würfel korrekt? JanGamer11 13 2.929 18.01.2019 16:30
Letzter Beitrag: Arduinero
  Arduino IDE Fehler beim öffnen des Seriallen Monitors mgm099 6 897 28.12.2018 12:42
Letzter Beitrag: mgm099
  Tonausgabe verursacht einen Fehler Sugar 7 711 13.12.2018 21:44
Letzter Beitrag: Tommy56

Gehe zu:


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