Mehrere RGBs individuell dimmen

Gast #3337471
Lesenswert?

Hey zusammen,

bisher habe ich einen Farbdurchgang einer einzelnen RGB LED etwa so 
umgesetzt:

for(int i=0;i<240;i++)
Anteil_Rot=i;
Anteil_Gruen=240-i;
delay(5)

das jeweils für die 3 durchgänge. Klappt ja soweit wunderbar.

Aber wie kann ich nun mehrere RGB LEDs diese sequenzen durchlaufen 
lassen, wobei jede LED der vorherigen ein bisschen voreilt/nacheilt in 
der Farbe.

Meine Lösung ging bisher in diese Richtung:

for(int i=0;i<240;i++)
Anteil_Rot1=i;
Anteil_Gruen1=240-i;
Anteil_Rot2=Anteil_Rot1+60;
if(Anteil_Rot2>240)Anteil_Rot2-=240;
Anteil_Gruen2=240-Anteil_Rot2;
delay(5)

wie fast schon erwartet habe ich nette sprünge in der Farbe bei den 
nachgeführten LEDs drin.

Wundert mich auch eigntl nicht, aber dennoch komm ich im Moment nicht 
dahinter, wie ich die schleifen sinnvoller aufbaue, damit diese 
übergänge sauber sind.

Habe auch schon versucht die RGBs erst in der ISR nachzuführen, aber 
hatte ähnliche ergebisse.

Ich mein:

RGB Strips wurden schon zu hauf gebaut. Einzelne LEDs einsteuern oder 
auch mehrere ist kein Problem. Nur diese permanente Farbwechsel mit 
mehreren Nachgeführten RGBs macht mir etwas Probleme.

habt ihr ein Tipp, wo ich mir so Algos ansehen kann?
Wird der Algo leichter, wenn ich im HSV-Raum nachführe? Denn dort hätte 
ich nur einen Parameter für die Farbe, anstatt 3. Die 3 Parameter 
ordentlich nachzuführen macht mir echt Probleme...

LG

Peter
#3337577
Lesenswert?

Formel von LED 1 - LED n ist gleich! Startwert nicht!

Zum Beispiel so: (Der Übersichtlichkeit halber hier nicht optimiert.)
1
Anteil_Gruen1 = 0;
2
Anteil_Gruen2 = 10;
3
Anteil_Gruen3 = 20;          // Startwerte versetzt
4
 
5
while(1)
6
{
7
Anteil_Gruen1=240-Anteil_Rot1;
8
Anteil_Gruen1 ++;
9
if(Anteil_Gruen1 == 240)
10
{Anteil_Gruen1 = 0;}
11

12
Anteil_Gruen2=240-Anteil_Rot2;
13
Anteil_Gruen2 ++;
14
if(Anteil_Gruen2 == 240)
15
{Anteil_Gruen2 = 0;}
16

17
Anteil_Gruen3=240-Anteil_Rot3;          // alle 3 bis auf Variabelnamen gleich
18
Anteil_Gruen3 ++;
19
if(Anteil_Gruen3 == 240)
20
{Anteil_Gruen3 = 0;}
21
}
#3337632
Lesenswert?

Wenns nur darum geht, dass eine LED einer anderen in der Farbe folgt, 
würde ich das so machen
1
  for(int i=0;i<240;i++)
2
  {
3
    Anteil_Rot2 = Anteil_Rot1;
4
    Anteil_Gruen2 = Anteil_Gruen1;
5

6
    Anteil_Rot1 = i;
7
    Anteil_Gruen1 = 240-i;
8

9
    delay(5);
10
  }

d.h. die 2.te LED übernimmt einfach die Farbe der 1.ten LED, noch ehe 
die erste LED eine andere Farbe bekommt.
Wenn dann eine 3.te LED im Spiel ist, dann eben eine Stufe weiter. Die 
3.te kriegt die Farbe der 2.ten, die 2.te die der 1.ten und die der 
1.ten wird neu ausgerechnet.

Was immer dann die erste LED macht, wirkt sich verzögert auf die 2.te 
und nochmal verzögert auf die 3.te aus.

Wenn der Zeitversatz nicht reicht, könnte man noch eine Queue zwischen 
die jeweiligen LED schalten, die den Zeitversatz vergrößert, indem die 
neuen Werte dann einfach n Takte brauchen um die Queue zu durchlaufen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren