100 lines
4.2 KiB
Arduino
100 lines
4.2 KiB
Arduino
//PlazINT - Fast Plasma Generator using Integer Math Only
|
|
//Edmund "Skorn" Horn
|
|
//March 4,2013
|
|
/* PlasmaAnimation.ino - ported the above code to use ObjectFLED display library.
|
|
Kurt Funderburg - Nov 2024 */
|
|
#include <ObjectFLED.h>
|
|
#include <FastLED.h>
|
|
|
|
//ObjectFLED Defn. Stuff
|
|
#define COLS_LEDs 8 // X
|
|
#define ROWS_LEDs 20 // Y
|
|
#define NUM_PINS 5 // CHANNELS
|
|
#define NUM_LEDS (COLS_LEDs * ROWS_LEDs)
|
|
|
|
byte pinList[NUM_PINS] = {1, 8, 14, 17, 24};
|
|
const int config = CORDER_GRB;
|
|
int delayT = 20; // mS loop delay
|
|
|
|
CRGB drawingMemory[NUM_LEDS];
|
|
ObjectFLED leds(NUM_LEDS, drawingMemory, config, NUM_PINS, pinList, COLS_LEDs);
|
|
|
|
//Byte val 2PI Cosine Wave, offset by 1 PI
|
|
//supports fast trig calcs and smooth LED fading/pulsing.
|
|
uint8_t const cos_wave[256] PROGMEM =
|
|
{0,0,0,0,1,1,1,2,2,3,4,5,6,6,8,9,10,11,12,14,15,17,18,20,22,23,25,27,29,31,33,35,38,40,42,
|
|
45,47,49,52,54,57,60,62,65,68,71,73,76,79,82,85,88,91,94,97,100,103,106,109,113,116,119,
|
|
122,125,128,131,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,
|
|
189,191,194,197,199,202,204,207,209,212,214,216,218,221,223,225,227,229,231,232,234,236,
|
|
238,239,241,242,243,245,246,247,248,249,250,251,252,252,253,253,254,254,255,255,255,255,
|
|
255,255,255,255,254,254,253,253,252,252,251,250,249,248,247,246,245,243,242,241,239,238,
|
|
236,234,232,231,229,227,225,223,221,218,216,214,212,209,207,204,202,199,197,194,191,189,
|
|
186,183,180,177,174,171,168,165,162,159,156,153,150,147,144,141,138,135,131,128,125,122,
|
|
119,116,113,109,106,103,100,97,94,91,88,85,82,79,76,73,71,68,65,62,60,57,54,52,49,47,45,
|
|
42,40,38,35,33,31,29,27,25,23,22,20,18,17,15,14,12,11,10,9,8,6,6,5,4,3,2,2,1,1,1,0,0,0,0
|
|
};
|
|
|
|
|
|
//Gamma Correction Curve
|
|
uint8_t const exp_gamma[256] PROGMEM =
|
|
{0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,3,3,3,3,3,
|
|
4,4,4,4,4,5,5,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,10,10,10,11,11,12,12,12,13,13,14,14,14,15,15,
|
|
16,16,17,17,18,18,19,19,20,20,21,21,22,23,23,24,24,25,26,26,27,28,28,29,30,30,31,32,32,33,
|
|
34,35,35,36,37,38,39,39,40,41,42,43,44,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,
|
|
61,62,63,64,65,66,67,68,70,71,72,73,74,75,77,78,79,80,82,83,84,85,87,89,91,92,93,95,96,98,
|
|
99,100,101,102,105,106,108,109,111,112,114,115,117,118,120,121,123,125,126,128,130,131,133,
|
|
135,136,138,140,142,143,145,147,149,151,152,154,156,158,160,162,164,165,167,169,171,173,175,
|
|
177,179,181,183,185,187,190,192,194,196,198,200,202,204,207,209,211,213,216,218,220,222,225,
|
|
227,229,232,234,236,239,241,244,246,249,251,253,254,255
|
|
};
|
|
|
|
|
|
void setup()
|
|
{
|
|
// Serial.begin(1000000);
|
|
leds.setBrightness(10);
|
|
leds.setBalance(0xdae0ff);
|
|
leds.begin();
|
|
leds.show();
|
|
}
|
|
|
|
unsigned long frameCount=25500; // arbitrary seed to calculate the three time displacement variables t,t2,t3
|
|
void loop() {
|
|
frameCount++ ;
|
|
uint16_t t = fastCosineCalc((42 * frameCount)/100); //time displacement - fiddle with these til it looks good...
|
|
uint16_t t2 = fastCosineCalc((35 * frameCount)/100);
|
|
uint16_t t3 = fastCosineCalc((38 * frameCount)/100);
|
|
|
|
//implements 8-LED / ROW serpentine
|
|
for (uint8_t y = 0; y < ROWS_LEDs; y++) {
|
|
int pixelIndex;
|
|
pixelIndex = y * COLS_LEDs;
|
|
|
|
for (uint8_t x = 0; x < COLS_LEDs ; x++) {
|
|
//Calculate 3 seperate plasma waves, one for each color channel
|
|
uint8_t r = fastCosineCalc(((x << 3) + (t >> 1) + fastCosineCalc((t2 + (y << 3)))));
|
|
uint8_t g = fastCosineCalc(((y << 3) + t + fastCosineCalc(((t3 >> 2) + (x << 3)))));
|
|
uint8_t b = fastCosineCalc((y << 3) + t2 + fastCosineCalc(t + (x << 3)));
|
|
if(r+g < 80) { b = max(b, 80); }
|
|
//uncomment the following to enable gamma correction
|
|
r=pgm_read_byte_near(exp_gamma+r)/2 + r/2;
|
|
g=pgm_read_byte_near(exp_gamma+g)/2 + g/2;
|
|
b=pgm_read_byte_near(exp_gamma+b)/2 + b/2;
|
|
drawingMemory[pixelIndex] = ((r << 16) & 0xff0000) | ((g << 8) & 0xff00) | b;
|
|
pixelIndex++;
|
|
} //for X
|
|
} //for Y
|
|
//digitalWrite(13, HIGH);
|
|
leds.show();
|
|
//digitalWrite(13, LOW);
|
|
delay(delayT);
|
|
} // loop()
|
|
|
|
|
|
inline uint8_t fastCosineCalc( uint16_t preWrapVal)
|
|
{
|
|
uint8_t wrapVal = (preWrapVal % 255);
|
|
if (wrapVal<0) wrapVal=255+wrapVal;
|
|
return (pgm_read_byte_near(cos_wave+wrapVal));
|
|
}
|