//Wandering_souls implementation for fibonacci 256
//fastled fibonacci 256 leds demo
//Stepko
//https://wokwi.com/arduino/projects/283705656027906572
#include "FastLED.h"
#define WIDTH 20
#define HEIGHT 20
// LEDs pin
#define DATA_PIN 3
// LED brightness
#define BRIGHTNESS 255
#define NUM_LEDS 257
// Define the array of leds
CRGB leds[257];
static const uint16_t FibonPlanarTable[] PROGMEM ={
256,256,256,256,256,256,256,256,36,39,38,37,256,256,256,256,256,256,256,256,256,256,256,256,256,13,34,35,40,
256,58,59,60,61,256,256,256,256,256,256,256,256,256,256,14,33,256,41,56,57,68,67,66,65,64,63,256,256,256,256,
256,256,256,12,15,32,42,55,256,69,256,79,80,81,82,83,62,256,256,256,256,256,11,16,31,256,43,54,70,77,78,94,
93,92,91,90,84,85,256,256,256,255,10,17,30,44,53,71,76,256,95,256,101,102,103,104,89,88,256,256,256,254,9,18,
29,45,52,72,75,96,256,100,120,119,118,117,105,106,87,256,256,253,8,19,28,46,256,51,73,97,99,121,124,125,126,
256,116,256,107,86,232,252,7,20,256,27,47,256,50,74,122,123,145,144,256,127,256,115,256,108,233,251,6,256,21,
256,26,48,49,256,98,146,147,148,143,256,128,256,114,109,231,234,250,5,256,22,23,25,24,0,195,171,170,169,149,
142,256,129,113,110,230,235,256,249,4,3,2,1,244,243,256,194,172,256,168,150,141,130,112,256,256,229,236,256,
248,247,246,245,242,220,219,196,193,173,167,151,140,131,111,256,256,208,228,237,238,239,240,241,256,221,218,
197,192,174,166,152,139,132,256,256,256,256,209,227,226,256,256,256,222,256,217,198,191,175,165,153,138,133,
256,256,256,256,207,210,211,225,224,223,215,216,199,256,190,176,164,154,137,134,256,256,256,256,256,206,205,
212,213,214,201,200,256,189,177,163,256,155,136,256,256,256,256,256,256,256,256,204,203,202,256,187,188,178,
162,256,156,135,256,256,256,256,256,256,256,256,256,183,184,185,186,180,179,161,256,157,256,256,256,256,256,
256,256,256,256,256,256,256,256,182,181,159,160,256,158,256,256,256,256,256,256,256
};
//// ----------------------------- Wandering souls ------------------------------
//(c)stepko
//https://editor.soulmatelights.com/gallery/503
//--Settings------
#define Speed (255)
#define Scale (10)
#define Run (3) // 0-AllIn1Direction/1-beatsin/2-linear/3-circular
#define col (0) //0-Whited/1-Colored/2-fromPallete
#define trace (1) //0-None/1-DimAll/2-Blur2D/3-wings
#define reseting (10) //reset time in seconds, 0-off
#define broad (0) //
//---------------
#define LIGHTERS_AM ((WIDTH + HEIGHT))
int lightersPosX[LIGHTERS_AM];
int lightersPosY[LIGHTERS_AM];
uint16_t lightersSpeedX[LIGHTERS_AM];
uint16_t lightersSpeedY[LIGHTERS_AM];
int8_t lightersSpeedZ[LIGHTERS_AM];
byte lcolor[LIGHTERS_AM];
byte mass[LIGHTERS_AM];
bool loadingFlag = true;
void drawPixelXYF(float x, float y, CRGB color)
{
// if (x < 0 || y < 0 || x > ((float)WIDTH - 1) || y > ((float)HEIGHT - 1)) return;
uint8_t xx = (x - (int)x) * 255, yy = (y - (int)y) * 255, ix = 255 - xx, iy = 255 - yy;
// calculate the intensities for each affected pixel
#define WU_WEIGHT(a,b) ((uint8_t) (((a)*(b)+(a)+(b))>>8))
uint8_t wu[4] = {WU_WEIGHT(ix, iy), WU_WEIGHT(xx, iy),
WU_WEIGHT(ix, yy), WU_WEIGHT(xx, yy)
};
// multiply the intensities by the colour, and saturating-add them to the pixels
for (uint8_t i = 0; i < 4; i++) {
int16_t xn = x + (i & 1), yn = y + ((i >> 1) & 1);
CRGB clr = leds[XY(xn, yn)];
clr.r = qadd8(clr.r, (color.r * wu[i]) >> 8);
clr.g = qadd8(clr.g, (color.g * wu[i]) >> 8);
clr.b = qadd8(clr.b, (color.b * wu[i]) >> 8);
leds[XY(xn, yn)] = clr;
}
}
void draw() {
if (loadingFlag) {
loadingFlag = false;
randomSeed(millis());
for (byte i = 0; i < LIGHTERS_AM; i++) {
if (Run == 2) {
lightersSpeedX[i] = random(-10, 10);
lightersSpeedY[i] = random(-10, 10);
} else if (Run == 3) {
lightersSpeedX[i] = random(-10, 10);//angle speed
lightersSpeedY[i] = random(0, 360);//angle
mass[i] = random(5, 10);//vspeed
} else {
lightersSpeedX[i] = random(3, 25);
lightersSpeedY[i] = random(3, 25);
mass[i] = random(15, 100);
}
lightersSpeedZ[i] = random(3, 25);
lightersPosX[i] = random(0, WIDTH * 10);
lightersPosY[i] = random(0, HEIGHT * 10);
lcolor[i] = random(0, 9) * 28;
}
}
if (trace == 1) {
fadeToBlackBy(leds, NUM_LEDS, 50);
} else if (trace == 2) {
blur2d(leds, WIDTH, HEIGHT, 30);
fadeToBlackBy(leds, NUM_LEDS, 5);
} else if (trace == 3) {
fadeToBlackBy(leds, NUM_LEDS, 200);
}
else if (trace == 0) {
FastLED.clear();
}
for (byte i = 0; i < map(Scale, 1, 16, 2, LIGHTERS_AM); i++) {
lcolor[i]++;
if (Run == 1) {
if(broad){
lightersPosX[i] = beatsin16(lightersSpeedX[i] / map(Speed, 1, 255, 10, 1), 0, (WIDTH-1)*10);
lightersPosY[i] = beatsin16(lightersSpeedY[i] / map(Speed, 1, 255, 10, 1), 0, (HEIGHT-1)*10);
}else{
lightersPosX[i] += beatsin16(lightersSpeedX[i] / map(Speed, 1, 255, 10, 1), 0, mass[i] / 10 * ((HEIGHT + WIDTH) / 8)) - mass[i] / 10 * ((HEIGHT + WIDTH) / 16);
lightersPosY[i] += beatsin16(lightersSpeedY[i] / map(Speed, 1, 255, 10, 1), 0, mass[i] / 10 * ((HEIGHT + WIDTH) / 8)) - mass[i] / 10 * ((HEIGHT + WIDTH) / 16);
}
} else if (Run == 2) {
lightersPosX[i] += lightersSpeedX[i] / map(Speed, 1, 255, 10, 1);
lightersPosY[i] += lightersSpeedY[i] / map(Speed, 1, 255, 10, 1);
}
else if (Run == 3) {
lightersPosX[i] += mass[i] * cos(radians(lightersSpeedY[i])) / map(Speed, 1, 255, 10, 1);
lightersPosY[i] += mass[i] * sin(radians(lightersSpeedY[i])) / map(Speed, 1, 255, 10, 1);
lightersSpeedY[i] += lightersSpeedX[i] / map(Speed, 1, 255, 20, 2);
if (lightersSpeedY[i] > 360) lightersSpeedY[i] = 360 - lightersSpeedY[i];
if (lightersSpeedY[i] < 0) lightersSpeedY[i] = 360 + lightersSpeedY[i];
}
else {
lightersPosX[i] += beatsin88(lightersSpeedX[0] * Speed, 0, mass[i] / 10 * ((HEIGHT + WIDTH) / 8)) - mass[i] / 10 * ((HEIGHT + WIDTH) / 16);
lightersPosY[i] += beatsin88(lightersSpeedY[0] * Speed, 0, mass[i] / 10 * ((HEIGHT + WIDTH) / 8)) - mass[i] / 10 * ((HEIGHT + WIDTH) / 16);
}
if (broad) {
if (Run == 3) {
if (lightersPosY[i] < 0) {
lightersPosY[i] = 1;
lightersSpeedY[i] = 360 - lightersSpeedY[i];
}
if (lightersPosX[i] < 0) {
lightersPosX[i] = 1;
lightersSpeedY[i] = 180 - lightersSpeedY[i];
}
if (lightersPosY[i] >= (HEIGHT - 1) * 10) {
lightersPosY[i] = ((HEIGHT - 1) * 10)-1;
lightersSpeedY[i] = 360 - lightersSpeedY[i];
}
if (lightersPosX[i] >= (WIDTH - 1) * 10) {
lightersPosX[i] = ((WIDTH - 1) * 10)-1;
lightersSpeedY[i] = 180 - lightersSpeedY[i];
}
} else if(Run == 1){} else{
if ((lightersPosX[i] <= 0) || (lightersPosX[i] >= (WIDTH - 1) * 10)) lightersSpeedX[i] = -lightersSpeedX[i];
if ((lightersPosY[i] <= 0) || (lightersPosY[i] >= (HEIGHT - 1) * 10)) lightersSpeedY[i] = -lightersSpeedY[i];
}}
else {
if (lightersPosX[i] < 0) lightersPosX[i] = (WIDTH - 1) * 10;
if (lightersPosX[i] > (WIDTH - 1) * 10) lightersPosX[i] = 0;
if (lightersPosY[i] < 0) lightersPosY[i] = (HEIGHT - 1) * 10;
if (lightersPosY[i] > (HEIGHT - 1) * 10) lightersPosY[i] = 0;
}
if (col == 1) {
drawPixelXYF((float) lightersPosX[i] / 10, (float) lightersPosY[i] / 10, CHSV(lcolor[i], 255, (trace == 3) ? 128U + random8(2U) * 111U : beatsin8(lightersSpeedZ[i] / map(Speed, 1, 255, 10, 1), 128,255)));
} else if (col == 2) {
drawPixelXYF((float) lightersPosX[i] / 10, (float) lightersPosY[i] / 10, ColorFromPalette(PartyColors_p, lcolor[i], (trace == 3) ? 128U + random8(2U) * 111U : beatsin8(lightersSpeedZ[i] / map(Speed, 1, 255, 10, 1), 128,255)));
}
else {
drawPixelXYF((float) lightersPosX[i] / 10, (float) lightersPosY[i] / 10, CHSV(lcolor[i], 40, (trace == 3) ? 128U + random8(2U) * 111U : beatsin8(lightersSpeedZ[i] / map(Speed, 1, 255, 10, 1), 128,255)));
}}
if (reseting > 0) {
EVERY_N_SECONDS(reseting) {
randomSeed(millis());
for (byte i = 0; i < map(Scale, 1, 16, 2, LIGHTERS_AM); i++) {
if (Run == 2) {
lightersSpeedX[i] = random(-10, 10);
lightersSpeedY[i] = random(-10, 10);
} else if (Run == 3) {
lightersSpeedX[i] = random(-10, 10);
lightersSpeedY[i] = random(0, 360);
mass[i] = random(5, 10);
}
else {
lightersSpeedX[i] = random(3, 25);
lightersSpeedY[i] = random(3, 25);
}
lightersSpeedZ[i] = random(3, 25);
mass[i] + random(-25, 25);
}
}
}
}
void setup() {
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
FastLED.setBrightness(BRIGHTNESS);
}
void loop() {
draw();
FastLED.show();
} //loop
uint16_t XY(byte x, byte y) {
uint16_t ledsindex = pgm_read_word (FibonPlanarTable+y*WIDTH+x);
return (ledsindex);
}
FPS: 0
Power: 0.00W
Power: 0.00W