Forum: Mikrocontroller und Digitale Elektronik WS2812 LEDs Farbwechsel


von Philipp G. (geiserp01)


Lesenswert?

Hallo Leute

Ich habe ein Problem mit Layer 8. Komme grad nicht so recht weiter.

Aufbau: WS2812 LED Stripe, Atmel 328.

Ich habe eine Funktion geschrieben die zwischen den Farben Übergänge 
macht. Also wenn zuerst RGB255,0,0 und die neue Farbe wäre RGB0,255,0 
dann macht der Code die Übergänge zwischen rot bis grün. Dieser ist wie 
folgt:
1
void RGB_color(int red_light_value, int green_light_value, int blue_light_value, int iBright)
2
{
3
// fader section
4
for (int i = 0; i <= 255; i++)
5
{
6
      if (i >=  iOldRval - red_light_value && iOldRval < red_light_value) {
7
        iRval = iOldRval + i;
8
      }
9
      if (i >= iOldGval - green_light_value && iOldGval < green_light_value) {
10
        iGval = iOldGval + i;
11
      }
12
      if (i >= iOldBval - blue_light_value && iOldBval < blue_light_value) {
13
        iBval = iOldBval + i;
14
      }
15
16
      if (i >= red_light_value - iOldRval && iOldRval > red_light_value) {
17
        iRval = iOldRval - i;
18
      }
19
      if (i >= green_light_value - iOldGval && iOldGval > green_light_value) {
20
        iGval = iOldGval - i;
21
      }
22
      if (i >= blue_light_value - iOldBval && iOldBval > blue_light_value) {
23
        iBval = iOldBval - i;
24
      }
25
      
26
      for (uint16_t l=0; l < strip.numPixels(); l++)
27
        {
28
          strip.setPixelColor(l, iRval, iGval, iBval); 
29
        }
30
31
    delay(25);
32
    strip.show();
33
  }
34
iOldRval = iRval;
35
iOldGval = iGval;
36
iOldBval = iBval;
37
// end fader section
38
strip.setBrightness(iBright);
39
}

Dieser funktioniert tadellos. Noch schöner wäre, wenn Led1 die alte 
Farbe hätte, und die LED am Ende des Strips die neue Farbe hätte, so 
dass Farbe (alt) von links nach rechts zu Farbe (neu) wechselt.

Ich stehe grad auf dem Schlauch wie ich das gescheit anstelle.

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Philipp G. schrieb:
> Ich stehe grad auf dem Schlauch wie ich das gescheit anstelle.

Lege dir ein Array mit so vielen RGB Werten an wie du LEDs hast.

Bei jedem Durchlauf der For-Schleife schiebst du die bestehenden Werte 
im Array eine Position nach hinten und füllst die entstehende Lücke (am 
Anfang bei Index 0) mit dem neu berechneten Wert auf.

Nachdem die for-Schleife den finalen Wert erreicht hat, leuchtet nur die 
erste LED (bei Index 0) mit dem finalen Wert. Angenommen deine 
Lichterkette hat 30 LEDs, dann musst du diesen finalen Wert noch 29 
weitere male in das Array schieben, damit alle LEDs die gleiche Farbe 
haben.

von Wolfgang (Gast)


Lesenswert?

Philipp G. schrieb:
> Ich stehe grad auf dem Schlauch wie ich das gescheit anstelle.

Formuliere deinen Algorithmus rekursiv, d.h. wie leitet sich die neue 
Farbe einer LED aus der vorherigen Farbe ab. Beim Erzeugen der Daten für 
die Stripe gibst du dann erst den alten Wert raus, stößt einmal den 
Algorithmus an, gibst den dadurch erzeugten Wert raus, nimmst diesen 
Wert wieder als Input für den Algorithmus u.s.w

von Stefan F. (Gast)


Lesenswert?

Wolfgang schrieb:
> Formuliere deinen Algorithmus rekursiv

Auch gut. So könnte man RAM sparen.

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Ich würde mal darüber nachdenken, die Farben selbst über das HSV bzw. 
HSB-Farbsystem zu definieren. Das hat den Vorteil, dass man die Farbe 
(hue) vollkommen getrennt von Sättigung (saturation) und Helligkeit 
(value) steuern kann.

Farbverläufe sehen so sehr viel "geschmeidiger" aus.

Natürlich brauchen die LEDs "am Ende" RGB-Werte, aber dafür gibts 
Umrechnungsfunktionen.

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.