Regelungsproblem

Helmuth:
Alle Effekte, die ich bisher geschrieben habe, funktionieren in einem Array: CRGB leds[NUM_LEDS]

Hast Du schon mal über Effekte nachgedacht, die Du im HSV-Farbraum statt im RGB-Farbraum generierst? Die FastSPI_LED2 Library unterstützt auch modifizierte HSV-Farbräume, bei denen als "V" der Hellwert vorgegeben werden kann:

Und falls Du bei RGB bleiben möchtest:
Wenn ich mich nicht täusche, bringt die FastSPI_LED2 Library auch schnelle Umrechnungsfunktionen zwischen RGB und HSV mit, so dass sich im Zweifelsfall ein bestimmter Farbwert auf eine gewünschte Helligkeit bringen läßt, indem man:

  • den originalen RGB-Wert in einen HSV-Wert umrechnet
  • den Hellwert V im HSV-Wert auf die gewünschte Helligkeit setzt
  • den in der Helligkeit modifizierten HSV-Wert wieder zurück in RGB umwandelt

Helmuth:
Hinter "durchschnittliche Helligkeit" (bright) feststellen steckt die Idee, dass sich viele weiße Pixel in einem relativ hohen bright Wert wiederspiegeln. Und mein Ansatz ist, in Abhängigkeit von bright (vor/nach dem addieren) mehr oder weniger stark runterzuskalieren, um in Abhängigkeit vom momentanen Bildinhalt und dem zu erwartenden Ergebnis nach der nächsten Addition dynamisch gegenzusteuern - so, dass das Ergebnis nicht zu dunkel (schwache Farben) und nicht zu hell (weiß) wird.

Wenn es nur um die Vermeidung übermäßig heller Pixel geht, dann wäre meine Idee: Immer dann, wenn ein Pixel droht weiß zu werden, einfach die Helligkeit halbieren.

  byte r,g,b;
...
  if ((int)r+g+b>612) // Werte als Integer zusammenzählen, 612 ist 80% vom Weißwert 765
  {
    r= r>>1;
    g= g>>1;
    b= b>>1;
  }