Nochmal "laut" überlegen... Der standalone shimmer() sketch für sich funktioniert sehr schön, siehe code Beispiel unten (ebenso der standalone sky() sketch mit der gradient palette). Also:
setup()
1. der leds array wird einmalig mit CRGB(8,8,8) gefüllt und
2. alle Elemente erhalten das status flag ledConstant
loop()/shimmer()
1. per Zufall erhalten einige leds array Elemente das status flag ledBrightens
2. dann wird je nach status flag und CRGB(8,8,8) oder CRGB(248,248,248) verglichen
3. und entschieden ob
-> aufgehellt += BRIGHTEN_LED; oder
-> abgedunkelt -= DARKEN_LED; oder wenn
-> das untere Ende erreicht ist = DARKEST_COLOUR; wieder das status flag ledConstant gesetzt wird, und das leds array Element wieder für die Zufallsauswahl bereit steht
4. und wieder von vorne - das funktioniert, sieht gut aus, läßt sich "flackeriger" oder "ruhiger" machen
Das Problem ist nun also - wenn der leds array in loop() mit der sky() Funktion via fill_solid(leds, ledCount, CRGB colour); kontinuierlich mit interpolierten Farben vollgeschrieben wird - daß die shimmer() Funktion nicht mehr mit DARKEST_COLOUR CRGB(8,8,8) oder BRIGHTEST_COLOUR CRGB(248,248,248) vergleichen kann, da diese Farben unbekannt sind, also nicht mehr hardcoded, wie im standalone shimmer() sketch hier unten.
Die Frage ist dann, auf was kann anstelle von DARKEST_COLOUR oder BRIGHTEST_COLOUR getestet werden, um das status flag zum abdunkeln oder aufhellen zu setzen? Ich dachte, da es interpolierte Farben sind, könnte man das vielleicht über den Helligkeitswert der leds array Elemente machen; die gradient palette "fängt ja auch erstmal dunkel an", wenn auch nicht mit CRGB(8,8,8). Aber dann wird ja schon interpoliert, und was ist dann das Äquivalent zum vormals hardcoded DARKEST_COLOUR oder BRIGHTEST_COLOUR? Wenn ich willkürlich das erste Farbtripel der gradient palette z. B. auf 7,7,7 setze, dann schimmert es genau ein Mal für ca. eine Sekunde, und dann nicht wieder, da ja 8,8,8 nicht wieder auftaucht.
Also denke ich, man muß den Test auf DARKEST_COLOUR oder BRIGHTEST_COLOUR im Kombinationsfall mit einer gradient palette aufgeben und ihn durch "etwas anderes" ersetzen, auf das man dann per if... testen und so das status flag setzen kann, um dann wie gehabt mit += BRIGHTEN_LED; oder -= DARKEN_LED; aufzuhellen oder abzudunkeln. Und dieses "etwas anderes" kann kein Farbtripel sein.
ps: Entschuldigung; danke, das rhythmische "wellenartige Gewaber" mit der "Perlin Noise" sieht auch recht interessant aus, auch wenn es nicht so "vor sich hin schimmert und perlt" wie shimmer().
DEFINE_GRADIENT_PALETTE(testPalette) {
0, 7, 7, 7,
25, 80, 119, 197,
89, 153, 215, 250,
95, 199, 233, 252,
102, 255, 255, 255,
120, 197, 219, 240,
147, 150, 187, 223,
200, 159, 171, 172,
255, 169, 154, 128
};
#include "FastLED.h"
const byte pinData = 3;
const byte pinClock = 4;
const byte ledCount = 144;
byte maxBrightness = 128; // Values from 0 - 255; can be changed on the fly via sensor, 10k potentiometer, etc.
#define DARKEST_COLOUR CRGB(8,8,8)
#define BRIGHTEST_COLOUR CRGB(248,248,248)
#define DARKEN_LED CRGB(4,4,4)
#define BRIGHTEN_LED CRGB(8,8,8) //Brighten faster than darken
enum {ledConstant, ledBrightens, ledDarkens}; // A flag for the LED states
byte ledState[ledCount]; // Array of states of all LEDs
struct CRGB leds[ledCount];
void setup() {
LEDS.addLeds<APA102, pinData, pinClock, BGR>(leds, ledCount);
LEDS.setBrightness(maxBrightness);
LEDS.setCorrection(Candle); //LEDS.setCorrection(UncorrectedColor) or (Tungsten40W), etc.
memset(ledState, ledConstant, sizeof(ledState)); // Set all LEDs to constant state
fill_solid(leds, ledCount, DARKEST_COLOUR);
}
void loop()
{
shimmer();
FastLED.show();
FastLED.delay(64); // Higher number = slower, but introduces "steppiness" : (
}
void shimmer()
{
for ( byte i = 0; i < ledCount; i++) { // Go through the entire strip
if ( ledState[i] == ledConstant) { // If LED is in constant state...
if ( random8() < 7) { // ...randomly select it based on a threshold (higher number = busier shimmer)...
ledState[i] = ledBrightens; // ...and set it to brightening state
}
} else if ( ledState[i] == ledBrightens ) { // If LED is in brightening state...
if ( leds[i] >= BRIGHTEST_COLOUR ) { // ...and reached brightest colour...
ledState[i] = ledDarkens; // ...set it to darkening state
} else {
leds[i] += BRIGHTEN_LED; // If not, continue brightening
}
} else {
if ( leds[i] <= DARKEST_COLOUR ) { // If LED reached darkest colour...
leds[i] = DARKEST_COLOUR; // ...keep it there...
ledState[i] = ledConstant; // ...and set it to constant state
} else {
leds[i] -= DARKEN_LED; // If not, continue darkening
}
}
}
}