#include <FastLED.h>
#define LED_PIN 2 // Daten-Pin für den LED-Streifen
#define NUM_LEDS 84 // Gesamtanzahl der LEDs im Streifen
#define NUM_RUN_LEDS 30 // Anzahl der LEDs für das Lauflicht
#define COLOR_ORDER GRB // Farb-Reihenfolge (meist GRB bei WS2812B)
#define BRIGHTNESS 150 // Helligkeit (0 - 255)
#define COOLING 55 // "Abkühlungs"-Faktor für Flammeneffekt (je höher, desto schneller kühlt es ab)
#define SPARKING 120 // "Funken"-Faktor für Flammeneffekt (je höher, desto mehr Funken)
CRGB leds[NUM_LEDS];
int pos = 0; // Startposition des Lauflichts
void setup() {
FastLED.addLeds<WS2812B, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS).setCorrection(TypicalLEDStrip);
FastLED.setBrightness(BRIGHTNESS);
}
void loop() {
// Lauflicht über die ersten 30 LEDs
for(int i = 0; i < NUM_RUN_LEDS; i++) {
leds[i] = CRGB::Black; // Alle LEDs auf Schwarz setzen
}
leds[pos] = CRGB::Blue; // Aktuelle Position des Lauflichts auf Blau setzen
FastLED.show();
delay(50);
pos++; // Position des Lauflichts erhöhen
if (pos >= NUM_RUN_LEDS) {
pos = 0; // Zurücksetzen, wenn das Ende erreicht ist
}
// Flammen-Effekt auf den restlichen LEDs
FireEffect();
}
// Funktion für den Flammen-Effekt auf LEDs 31-144
void FireEffect() {
static byte heat[NUM_LEDS - NUM_RUN_LEDS]; // Hitzewerte für die Flammen-LEDs
// Schritt 1: Kühlen
for(int i = 0; i < NUM_LEDS - NUM_RUN_LEDS; i++) {
heat[i] = max(0, heat[i] - random(0, ((COOLING * 10) / (NUM_LEDS - NUM_RUN_LEDS)) + 2));
}
// Schritt 2: Hitze nach oben "driften" lassen
for(int k = (NUM_LEDS - NUM_RUN_LEDS) - 1; k >= 2; k--) {
heat[k] = (heat[k - 1] + heat[k - 2] + heat[k - 2]) / 3;
}
// Schritt 3: Zufällige Funken am unteren Ende erzeugen
if (random(255) < SPARKING) {
int y = random(7); // Erzeuge einen Funken in den ersten 7 LEDs des Flammenbereichs
heat[y] = min(255, heat[y] + random(160, 255));
}
// Schritt 4: Hitze in Farben umwandeln
for(int j = 0; j < NUM_LEDS - NUM_RUN_LEDS; j++) {
CRGB color = HeatColor(heat[j]);
leds[j + NUM_RUN_LEDS] = color;
}
}
// Funktion, um die Hitze in eine Farbe (Rot-Gelb) umzuwandeln
CRGB HeatColor(uint8_t temperature) {
CRGB color;
if (temperature < 85) {
color.r = temperature * 3;
color.g = 0;
color.b = 0;
} else if (temperature < 170) {
temperature -= 85;
color.r = 255;
color.g = temperature * 3;
color.b = 0;
} else {
temperature -= 170;
color.r = 255;
color.g = 255;
color.b = temperature * 3;
}
return color;
}