LED WS2812 - individuelle Helligkeit

Hallo,

ich habe mal ne Frage wie Ihr das macht.

Hintergrund:
Umsetzung einer Aquarienbeleuchtung mit 2 LED Stripes. Davon eine normale RGB-Leiste und eine WS2812. Diese sollen für die Aquarien den Tagesablauf simulieren. Hier ein kleiner Auszug meines aktuellen Sketches zur Verdeutlichung welcher alle paar Sekunden durchlaufen wird/soll:

  byte brightnessW2812, brightnessRGB;
  CRGB colorW2812 = CRGB::Black;
  int colorR     = 0;
  int colorG     = 0;
  int colorB     = 0;
  int brightWS   = 0;

  brightnessRGB     = brightness(now(), SunDown-2800UL, SunDown+800UL)*100/255; //RGB
  if (brightnessRGB) 
  {
    // red[3]      = { 100, 0, 0 };
    colorR = brightnessRGB;
    colorG = 0;
    colorB = 0;
  }

  brightnessW2812 = brightnessW2812_T = brightness_T(now(), SunDown, SunDown+4800UL)*100/255;//W2812
  if (brightnessW2812) 
  {
    colorW2812 = CRGB::Blue; //W2812
    brightWS = brightnessW2812;
  }
  colorW2812 = CRGB::Blue;

  // RGB-LED ist an
  analogWrite(_AQUA_RED, colorR);   // Write current values to LED pins
  analogWrite(_AQUA_GREEN, colorG);      
  analogWrite(_AQUA_BLUE, colorB);

  // W2812-LED ist an
  for(int x = 0; x < NUM_STRIPS; x++) 
  {
    for (unsigned int i = 0; i < NUM_LEDS_PER_STRIP; i++)
    {
      leds[x][i] = colorW2812;
    }
  }
  FastLED.setBrightness( brightWS );
  FastLED.show();

Die Umsetzung ist sicherlich nicht perfekt aber für mich vorerst funktional.

Nun meine Frage:

Wie würdet Ihr das langsame Einschalten/Ausschalten der WS2812 umsetzen?
Wie schaffe ich es einzelne Segmente (Aqua1, Aqua2) des WS2812 Stripes in unterschiedlicher Helligkeit darzustellen? setBrightness macht diese ja nur komplett! Geht das nur über Farbpaletten und den Befehl ColorFromPalette?

Wie würdet Ihr am besten die einzelnen Segmente aufteilen in Variablen? So als Beispiel?

int WSSegment[][3] = {
  { 1,15,35 }, // Aqua1 auf Stripe 1 ab LED 15 bis 35
  { 3,45,75 }, // Aqua2 auf Stripe 3 ab LED 45 bis 75
  .....
};

Für Ideen und hilfreiche Tipps wäre ich sehr dankbar.

vg
Falk

Lies mal das hier, im besonderen "Dimming and Brightening Colors".

nscale8 geht gut zum Runterdimmen. Eignet sich auch zur partiellen Helligkeitssteuerung.

Mit Paletten kann man das ebenfalls machen, aber es ist natürlich eleganter, mit gesättigten Farben zu rechnen und diese Werte erst am Schuss auf die gewünschte Helligkeit runterzuskalieren.

Langsames hoch- und runterfahren der Helligkeit ist schwierig bei 24Bit LED Controllern.
Warum? Weil die lineare Stufung nicht dem logarithmischen Empfinden entspricht = "unten rum" sieht man bei nur 256 Helligkeiten pro Farbe Stufen/Sprünge zwischen den Helligkeitsschritten.
Lösung: Temporal Dithering benutzen. (Mach nur Sinn, wenn man deutlich über 100 fps hinbekommt.) Was macht das? Man kann es sich als eine softwareseitige Modulation der PWM vorstellen. Dabei wird der untere Helligkeitsbereich gespreizt. Es werden Zwischenwerte zwischen den unteren Helligkeitsstufen simuliert, indem bei jedem Frame zwischen 2 Helligkeiten umgeschaltet wird.

Verständlich?

Gruß,

Helmuth

Hallo Helmut,

danke für die Tipps. Nur wenn ich den Helligkeitswert negiere dann verhält es sich richtig. Ist doch ein wenig komisch oder?

  // W2812-LED ist an
  for(int x = 0; x < NUM_STRIPS; x++)
  {
    for (unsigned int i = 0; i < NUM_LEDS_PER_STRIP; i++)
    {
       leds[x][i].setRGB(colorR,colorG,colorB);
       leds[x][i].fadeLightBy( brightWS*-1 );
    }
  }
  FastLED.show();

Aber es funktioniert! Danke.