// 1D version adapted from original 2D version by ldirko
// Original video here https://www.reddit.com/r/FastLED/comments/hgu16i/my_fire_effect_implementation_based_on_perlin/
// Original source code here: https://pastebin.com/jSSVSRi6
#include <FastLED.h>
#define NUM_LEDS 18
#define LED_PIN 2
CRGB leds[NUM_LEDS];
CRGBPalette16 firePalette = HeatColors_p;
void setup() {
FastLED.addLeds<WS2812B, LED_PIN, GRB>(leds, NUM_LEDS);
FastLED.setBrightness(50);
Serial.begin(57600);
}
void loop() {
EVERY_N_MILLISECONDS(5) {
runFire();
}
FastLED.show();
}
void runFire() {
int a = millis();
for (int i = 0; i < NUM_LEDS; i++) {
// 3D noise, x is constant, we move through time on y and z axis
// The 60 here will change the scale of the effect, lower is smoother
// higher is more flickery. The time value for z was in the original code
// as that was a 2D matrix version. I've left it in here as it looks
// nice in 1D too!
uint8_t noise = inoise8 (0 , i * 60 + a , a / 3);
// Divides 255 by (NUM_LEDS - 1) and subtracts that amount away from 255 to return
// a decreasing number each time e.g. for NUM_LEDS = 18, difference between
// each point is 15, so:
// i = 0, math = 255
// i = 1, math = 240
// i = 2, math = 225
// ...
// i = NUM_LEDS, math = 0
uint8_t math = abs8(i - (NUM_LEDS-1)) * 255 / (NUM_LEDS-1);
// Take the noise function from earlier and subtract math from it,
// so the further along the strip you are, the higher palette index you
// are likely to get. This results in the base of the fire (white, yellow)
// being at the far end of the strip
uint8_t index = qsub8 (noise, math);
// Set the LED color from the palette
leds[i] = ColorFromPalette (firePalette, index, 255);
}
}