#include <FastLED.h>
#define WIDTH 16
#define HEIGHT 16
#define NUM_LEDS ((WIDTH) * (HEIGHT))
CRGB leds[NUM_LEDS];
uint8_t max_steps = 8;
TDynamicRGBGradientPalettePtr grad_pal = (TDynamicRGBGradientPalettePtr) malloc(max_steps * 4);
void setup() {
Serial.begin(2000000);
FastLED.addLeds<NEOPIXEL, 3>(leds, NUM_LEDS);
FastLED.setCorrection(UncorrectedColor);
FastLED.setTemperature(UncorrectedTemperature);
FastLED.setDither(DISABLE_DITHER);
}
// generate a random gradient palette
void randomise_gradient_palette() {
Serial.println();
uint8_t steps = random8(2, max_steps);
uint8_t index = 0;
TRGBGradientPaletteEntryUnion* grad_entry = (TRGBGradientPaletteEntryUnion*) grad_pal;
for (uint8_t step = 0; step < steps; step++) {
if (step == steps - 1) {
index = 255; // force the last index to be 255
}
grad_entry[step].index = index;
grad_entry[step].r = random8();
grad_entry[step].g = random8();
grad_entry[step].b = random8();
Serial.print(grad_entry[step].index);
Serial.print(" -> ");
Serial.print(grad_entry[step].r);
Serial.print(", ");
Serial.print(grad_entry[step].g);
Serial.print(", ");
Serial.println(grad_entry[step].b);
uint8_t indexes_remaining = 255 / (steps - step);
index += random8(indexes_remaining / 2, indexes_remaining);
}
}
void loop() {
randomise_gradient_palette();
// convert the gradient palette to a 256-entry palette (or 16-entry)
// CRGBPalette16 mypalette;
CRGBPalette256 mypalette;
mypalette.loadDynamicGradientPalette(grad_pal);
// display the 256-entry palette
for (int ledno = 0; ledno < NUM_LEDS; ledno++) {
leds[ledno] = ColorFromPalette(mypalette, ledno % 256);
}
FastLED.delay(1000);
}