#include <FastLED.h>
// Anzahl der LEDs und Daten-Pin definieren
#define NUM_LEDS 30 // Anzahl der LEDs
#define DATA_PIN 6 // Pin, an dem die WS2812B-Datenleitung angeschlossen ist
CRGB leds[NUM_LEDS]; // Array, das die Farben für jede LED speichert
int currentEffect = 0; // Variable, um den aktuellen Effekt zu speichern
int effectDelay = 100; // Zeitverzögerung zwischen den Aktualisierungen
void setup() {
FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS); // LEDs initialisieren
FastLED.setBrightness(128); // Helligkeit auf 50% setzen
}
// Funktion, um das Farbrad zu erzeugen
void colorWheel() {
static int colorShift = 0; // Diese Variable ändert die Farbe im Laufe der Zeit
// Wir wollen, dass jede LED eine andere Farbe hat, die sich ändert
for (int i = 0; i < NUM_LEDS; i++) {
int red = (i * 5 + colorShift) % 255; // Berechne Rotwert für die LED
int green = (i * 5 + colorShift + 85) % 255; // Berechne Grünwert
int blue = (i * 5 + colorShift + 170) % 255; // Berechne Blauwert
// Setze die Farbe für die LED
leds[i] = CRGB(red, green, blue);
}
colorShift++; // Ändere den Farbversatz, damit sich die Farben bewegen
FastLED.show(); // Zeige die neuen Farben auf den LEDs
delay(effectDelay); // Warte eine kurze Zeit, bevor die Farben aktualisiert werden
}
// Funktion für den Lauflichteffekt
void chaseEffect() {
static int position = 0; // Speichert, wo das Licht gerade ist
// Mach zuerst alle LEDs schwarz (aus)
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB::Black; // Alle LEDs ausschalten
}
// Setze die Farbe für die aktuelle LED
leds[position] = CRGB(255, 0, 0); // Rot
// Bewege das Licht zur nächsten Position
position = (position + 1) % NUM_LEDS; // Wenn das Ende erreicht ist, starte wieder von vorne
FastLED.show(); // Zeige den neuen Zustand der LEDs an
delay(effectDelay); // Warte eine kurze Zeit
}
// Funktion für den Regenbogeneffekt
void rainbowEffect() {
// Regenbogen erzeugen, indem jede LED eine andere Farbe hat
for (int i = 0; i < NUM_LEDS; i++) {
// Die Werte für Rot, Grün und Blau berechnen, damit sie sich in einem Regenbogenmuster wiederholen
int red = (i * 256 / NUM_LEDS) % 255;
int green = (i * 256 / NUM_LEDS + 85) % 255;
int blue = (i * 256 / NUM_LEDS + 170) % 255;
leds[i] = CRGB(red, green, blue); // Setze die Farbe für die LED
}
FastLED.show(); // Zeige den Regenbogen auf den LEDs an
delay(effectDelay); // Warte, bevor der Effekt aktualisiert wird
}
// Funktion für den Konfetti-Effekt
void confettiEffect() {
// Wir wollen die LEDs langsam verdunkeln, bevor wir zufällige Lichter aufleuchten lassen
for (int i = 0; i < NUM_LEDS; i++) {
leds[i].nscale8(250); // Reduziere die Helligkeit jeder LED ein wenig
}
// Setze zufällig eine LED auf eine helle, zufällige Farbe
int pos = random(NUM_LEDS); // Wähle zufällig eine LED aus
leds[pos] = CRGB(random(255), random(255), random(255)); // Wähle zufällige Rot-, Grün- und Blauwerte
FastLED.show(); // Zeige die Konfettieffekte an
delay(effectDelay); // Warte eine kurze Zeit, bevor der Effekt wiederholt wird
}
// Funktion für den "Atmenden" Effekt (Breathing)
void breathingEffect() {
static int brightness = 0; // Speichert die aktuelle Helligkeit
static int direction = 1; // Bestimmt, ob wir heller oder dunkler werden
// Ändere die Helligkeit
brightness += direction * 5;
// Wenn die Helligkeit maximal oder minimal erreicht ist, drehe die Richtung um
if (brightness >= 255 || brightness <= 0) {
direction = -direction;
}
// Setze die Farbe aller LEDs auf Blau, aber ändere die Helligkeit basierend auf "brightness"
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CRGB(0, 0, brightness); // Blau mit variabler Helligkeit
}
FastLED.show(); // Zeige den "Atmenden" Effekt an
delay(30); // Kurze Verzögerung für eine weiche Animation
}
// Funktion für den Feuer-Effekt
void fireEffect() {
static byte heat[NUM_LEDS]; // Array, das die "Hitze" für jede LED speichert
// Kühle jede LED ein bisschen ab
for (int i = 0; i < NUM_LEDS; i++) {
heat[i] = max(0, heat[i] - random(0, 5)); // Reduziere die Hitze, aber gehe nicht unter 0
}
// Die Hitze von benachbarten LEDs nach oben verbreiten
for (int i = NUM_LEDS - 1; i >= 2; i--) {
heat[i] = (heat[i - 1] + heat[i - 2] + heat[i - 2]) / 3;
}
// Neue "Hitze" hinzufügen, um den unteren LEDs zufällig "Flammen" zu geben
if (random(255) < 120) {
int y = random(7);
heat[y] = min(255, heat[y] + random(160, 255)); // Erhöhe die Hitze
}
// Wandle die Hitze in Farben um (rot bis gelb)
for (int i = 0; i < NUM_LEDS; i++) {
byte red = min(255, heat[i] * 2);
byte green = min(255, heat[i]);
byte blue = 0;
leds[i] = CRGB(red, green, blue); // Setze die Farbe basierend auf der Hitze
}
FastLED.show(); // Zeige den Feuer-Effekt an
delay(effectDelay); // Kurze Wartezeit
}
// Der Hauptloop, der durch die Effekte wechselt
void loop() {
switch (currentEffect) {
case 0:
colorWheel(); // Farbrad
break;
case 1:
chaseEffect(); // Lauflicht
break;
case 2:
rainbowEffect(); // Regenbogen
break;
case 3:
confettiEffect(); // Konfetti
break;
case 4:
breathingEffect(); // Glühen
break;
case 5:
fireEffect(); // Feuer
break;
}
// Wechsle den Effekt nach einer bestimmten Zeit (z.B. alle 10 Sekunden)
if (millis() % 10000 < effectDelay) {
currentEffect = (currentEffect + 1) % 6;
}
}