Forum: Mikrocontroller und Digitale Elektronik Mehrere RGBs individuell dimmen


von Dell (Gast)


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

von Sean G. (atmega318)


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
}

von Karl H. (kbuchegg)


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.

: Bearbeitet durch User
von Dell (Gast)


Lesenswert?

Super. Genau so einen Denkanstoß habe ich gebraucht. Danke!

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
Noch kein Account? Hier anmelden.