#include <FastLED.h>
#define WIDTH 16
#define HEIGHT 1
#define NUM_LEDS ((WIDTH) * (HEIGHT))
CRGB leds[NUM_LEDS];
void setup() {
FastLED.addLeds<NEOPIXEL, 2>(leds, NUM_LEDS);
}
// map X & Y coordinates onto a horizontal serpentine matrix layout
uint8_t XY(uint8_t x, uint8_t y) {
if (y & 1)
return (y + 1) * WIDTH - x - 1;
return y * WIDTH + x;
}
void loop() {
EVERY_N_MILLISECONDS(20) {
const float pi = 3.14159265;
static uint16_t offset = 0; // animates the effect
float distance_factor = 24.f; // affects density
for (int8_t y = 0; y < HEIGHT; y++) {
for (int8_t x = 0; x < WIDTH; x++) {
// move the origin to the centre of the matrix
float cx = x - (WIDTH / 2 - 0.5f);
float cy = y - (HEIGHT / 2 - 0.5f);
uint16_t distance = hypotf(cy, cx) * (distance_factor / hypotf(WIDTH / 2, HEIGHT / 2));
leds[XY(x, y)] = ColorFromPalette(OceanColors_p, sin8(distance - offset));
}
}
FastLED.show();
offset += 1;
}
}