Regelungsproblem

Hallo pylon,

ich messe nichts, ich rechne nur mit den Werten im Bildspeicher. Hier mal ein Entwurf der Funktion:

/*
#define MAX 195840
(in my case 16 x 16 LEDs * 3 colors * 255 maxvalue = 195840)
unsigned long counter;
*/

void AutoDim()  
{
  // calculate average brightness of the screen
  counter = 0;
  for(int i = 0; i < NUM_LEDS; i++) {
    counter += leds[i].r;
    counter += leds[i].g;
    counter += leds[i].b;
  }

  // 0 means all off, 255 means all white
  byte bright = (counter * 255) / MAX;
 
  // scale down depending on actual brightness
  for(int i = 0; i < NUM_LEDS; i++) {
    leds[i].nscale8(255 - bright);
  }
}?

Vielleicht habe ich ich wieder nur eine Denk-/Verständnisblockade, aber so trivial, wie es klingt, ist die Nachregelung nicht. Es geht um diesen Punkt hier:

leds[i].nscale8(255 - bright);

Je nach Effekt(kombination), bewegt sich der Wert, den man nscale8 übergeben muss, in einem sehr engen Fenster, damit genau das passiert, was ich vorhabe - beispielsweise zwischen 125 und 135, in einem anderen Fall zwischen 30 und 32...

Was für Effekte? Anstelle langer Beschreibungen schau doch mal hier, was ich gerade mache: Funky Clouds - YouTube

Ich beabsichtige, 2 Grundprobleme zu lösen: Jeder "schickere" Effekt ist eine Kombination aus mehreren anderen, z.B. einmal im Kreis mit dem Nachbarpixel interpolieren, in einem kleineren sich bewegenden Auschnitt nochmal, "Wind" von der Seite, u.s.w....

Da ich das momentan alles in einem(!) Array mache (wegen endlichem RAM nicht in "Ebenen" in mehreren Arrays), braucht es viel Feintuning und die Helligkeitskontrolle nach jedem einzelnen Schritt. Wäre schön, wenn das "von allein" passiert.

Und Grundproblem B: Momentan stelle ich mir von Hand nach jedem Schritt einen fixen Scalingfaktor ein und das sieht alles wunderschön aus. Wenn das aber jemand anderes auf einer anderen Matrix mit einer anderen Auflösung testet, ist es momentan praktisch unmöglich, den gleichen Effekt zu reproduzieren.

Hier mal noch ein Beispiel, wie der komplette Code für so eine Effektkombination aussieht: Funky Clouds 2014 - Toys For Matrix Effects · GitHub

Beste Grüße

Helmuth