Arduino pulsierende RGB LED?

Hallo liebes Forum. Ich bin gerade dabei eine Beleuchtung aus einer einzelnen RGB-LED selbst zu implementieren. Ich verwende fürs Programmieren die Arduino Software. Nun, die LED beginnt weich zu leuchten und nimmt auch wieder ab. Mein Problem ist allerdings, dass alle RGB Farben gleichzeitig leuchten und ich nicht weiß, wie man zuerst nur rot, dann nur blau und dann nur grün leuchten lässt. Ich danke euch für eure Hilfe!

hi,

der Loop teil, wird ständig wiederholt, wenn das Programm am Ende angekommen ist.

Da du die Variable Helligkeit aber nur einmal verwendest, wird die erste led um 5 erhellt, die zweite um 10 die andere um 15.
dann gehts oben wieder los.

die erste um 20, die zweite um 25 usw…
zudem ist beim Ausgang bei 1024 ende. 255*5 is jedoch mehr. (gewollt, um eine gewisse Dauer auf Maximalkraft zu haben?

du benötigst dafür lieber for

  int i = 0;
  for (i = 0; i < 204; i++) { //hier wirds Hell
    analogWrite(LEDbl, i * fadeschritte);
    delay(100);
  }
  for (i > 0; i--) { //und wieder dunkel
    analogWrite(LEDbl, i * fadeschritte);
    delay(100);
  }
// hier das gleiche dann für die anderen

Dein Beispiel geht bei einer LED.
Bei mehreren müsstest du die LEDs jeweils einzeln ansprechen. Was zwar auch geht, würde ich aber erstmal lassen.

grüße
lipi

1 Like

Sollte dieser Code dann funktionieren? Es leuchtet nämlich erst immer wieder nur blau auf, danach wechselt blau mit grün, jedoch ohne zu pulsieren. Bin mir nicht sicher was falsch ist ://

hi,

die 2. Schleife hat keine Klammer
das ; hinter i-- würde ich lassen, nicht das er das falsch interpretiert. Dann lieber das Semikolon davor.

Drück mal Strg - t, gerade so falsche Klammern sieht man dann deutlich besser.

grüße
lipi

Das hat den Fehler leider nicht behoben. Könnte es daran liegen, dass die RGB common anode oder common cathode ist?

Lg Tim

hi,

da dein Script ja prinzipiell ging, müsstest du gemeinsames Minus haben.

gut möglich, dass irgendwo nen Fehler steckt. ich muss normal alles praktisch prüfen.
Könnt ich morgen mal machen.

grüße
lipi

Vielen Dank, dass wäre sehr nett, wenn du eine Lösung finden würdest :slight_smile:
Gib mir dann bitte Bescheid, danke!

Lg Tim

hi,

schau aber parallel bitte nach, ob du Anode oder Cathode zusammen hast.

oder ob du im ernstfall vielleicht sogar nen Anschluss vertauscht hast.

grüße
lipi

Wie hast du die LED denn an den Arduino angeschlossen?
Skizze?

hi,

bitte entschuldige erstmal.

beim write ist die 1025 natürlich kompletter Unsinn. 255 als Max stimmt.
Ich lese wohl zu viele Werte aus.

Davon abgesehen klappt es bei mir aber.

void loop() {
  int i = 0;
  for (i = 0; i <= 50; i++) { //hier wirds Hell
analogWrite(LEDbl, i * fade);
delay(50);
  }
  for (; i >= 0; i--) { //und wieder dunkel
analogWrite(LEDbl, i * fade);
delay(50);
  }
  for (i = 0; i <= 50; i++) { //hier wirds Hell
analogWrite(LEDrd, i * fade);
delay(50);
  }
  for (; i >= 0; i--) { //und wieder dunkel
analogWrite(LEDrd, i * fade);
delay(50);
  }
  for (i = 0; i <= 5; i++) { //hier wirds Hell
analogWrite(LEDgr, i * fade);
delay(50);
  }
  for (; i >= 0; i--) { //und wieder dunkel
analogWrite(LEDgr, i * fade);
delay(50);
  }

}

Eine Fehlerquelle wäre eventuell, dass bei deinem Bord nicht alle Pins PWM können.
Beim Micro ist 3, 5 und 6 ok.

grüße
lipi

Danke für die Verbesserung. Leider kann ich noch nicht sagen ob ich common cathode oder anode habe. Ich habs bis jetzt nur online by Wowki programmiert.

Bitte noch ein h einfügen, damit der Link vollständig ist.
ttps://wokwi.com/projects/343960845324124755

Vielen Dank für die Hilfe

Ich mache ja nur gelegentlich was mit Arduino und Co. Aber irgendwie fehlt mir in den ganzen Code-Beispielen hier die Initialisierung von fade. Damit müsste fade eigentlich doch immer Null sein und die Multiplikation mit fade immer zu einem Wert für die Helligkeit von Null führen.

BTW: Man kann die Sache mit dem hoch und runter auch etwas eleganter lösen, indem man nur eine Schleife für beides nimmt und die Schleife nicht einfach mit i++ sondern mit einer anderen Variablen zählen lässt, die man bei Überschreiten von 255 durch increment = -increment invertiert und das Spiel bei Unterschreiten von Null ebenso spielt:

if (i <= 0 || i >= 255) {
increment = -increment;
}

Und für eine RGB-LED kann man dann die Dimmerschleife natürlich noch in eine eigene Subroutine verfrachten, die man mit der jeweils anzusteuernden Farbe aufruft.

BTW: Da der Frage eine andere Frage vorausging, dürfte es auch hier um folgende RGB-LEDs gehen: Lumetheus LED 5mm Farbe RGB 25 Stück rot = 400 mcd/grün = 1500 mcd/blau = 700 mcd Leuchtdiode 3V Diode 4 Pin LEDs : Amazon.de: Gewerbe, Industrie & Wissenschaft, die über eine gemeinsame Anode verfügen. Hierbei bitte auch auf die unterschiedlichen Spannungs- und Stromwerte für die einzelnen Farben und die korrekte Beschaltung achten. Hier ist unter B die Variante für gemeinsame Anode beschrieben: Nr.05 RGB LED | Funduino - Kits und Anleitungen für Arduino

Hi!

mach doch erstmal sowas:

void loop(){
    analogWrite(LEDbl, 255);
    delay(1000);
    analogWrite(LEDbl, 0);
    
    analogWrite(LEDrd, 255);
    delay(1000);
    analogWrite(LEDrd, 0);

    analogWrite(LEDgr, 255);
    delay(1000);
    analogWrite(LEDgr, 0);
}

Das schaltet die drei Farben nacheinander hart ein und dann wieder aus.
Das ist so sehr einfacher Code, wodurch sich nicht so leicht fehler einschleichen, und womit du prüfen kannst, ob mit der LED alles OK ist.

In deinem Link ist die Kathode übrigens an RST angeschlossen. Das wird Reset sein. Ich würde die Kathode zur Sicherheit aber an GND anschließen.

Grundsätzlich gibt es gewisse Standards bezüglich der Pin-Belegung der LEDs (und der Kragen ist an einer Seite abgeflacht, um die Pin-Reihenfolge zu kennzeichnen). Das heißt aber nicht, dass manche LEDs sicht nicht daran halten, und ganz andere Pinbelegungen haben.

hi,

Da nimm mal ein Multimeter mit Diodentester und schau nach.
Du hast die Diode doch schon angeschlossen. dafür musst du schon wissen ob du einmal Minus oder einmal Plus hast.

vorauseilend würde ich aber auch damit rechnen, dass du keinen Nulldurchgang bei allen Farben willst, sondern dass Farbe 2 beginnt, wenn Farbe 1 noch nicht ganz aus ist.

Ich glaube es wäre sogar sinnig, direkt einen fixen Wert zu generieren. die letzten 4 Stellen von Millis() etwa.
Dann kannst du ganz frei entscheiden, von wo bis wo jede einzelne LED leuchten soll.

Gestern war ich zum Schluss bei

int LED[] = {3, 5, 6};
void setup() {
  pinMode(LED[0], OUTPUT);
  pinMode(LED[1], OUTPUT);
  pinMode(LED[2], OUTPUT);

}

void loop() {

  for (int pin = 0; pin < 3; pin++) {
int fade = 1;
int fadedown = 0;
for (int i = 1; i <= 510; i++) {
  analogWrite(LED[pin], (i * fade) + fadedown);
  delay(10);
  if (i == 254) { // und dunkel wirds
    fadedown = 510;
    fade = -fade;
  }
}
  }
}

gelandet.

Das ist schon erstmal erheblich übersichtlicher.

war mein Gedanke.
Entweder hatte ich einen Fehler drin und hab ihn nicht gesehen, aber mein Eindruck war, dass er nach dem Starten der Schleife nicht mehr den Wert der Variablen prüft, sondern ihn so nimmt, wie er zum Start war.

Hab es aber nicht nochmal genau überprüft, war nur erstaunt und hab wieder rausgenommen.

grüße
lipi

hätte i += x nehmen müssen, was ich nicht hatte.
Wieder was gelernt.

grüße
lipi