#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 (mit HSV)
void colorWheelHSV() {
static uint8_t hue = 0; // Variable für den Farbton (0-255)
// Wir wollen, dass jede LED eine andere Farbe hat, die sich ändert
for (int i = 0; i < NUM_LEDS; i++) {
// Setze die Farbe für jede LED, basierend auf dem Farbton und der LED-Position
leds[i] = CHSV((hue + i * 5) % 255, 255, 255); // Vollsättigung und maximale Helligkeit
}
hue++; // Farbton erhöhen, damit die Farben rotieren
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 (mit HSV)
void chaseEffectHSV() {
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 mit einem Farbtonwert
leds[position] = CHSV(position * 4, 255, 255); // Farbton basierend auf Position
// 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 (mit HSV)
void rainbowEffectHSV() {
// Regenbogen erzeugen, indem jede LED eine andere Farbe hat
for (int i = 0; i < NUM_LEDS; i++) {
leds[i] = CHSV(i * 255 / NUM_LEDS, 255, 255); // Farbton für jede LED berechnen
}
FastLED.show(); // Zeige den Regenbogen auf den LEDs an
delay(effectDelay); // Warte, bevor der Effekt aktualisiert wird
}
// Funktion für den Konfetti-Effekt (mit HSV)
void confettiEffectHSV() {
// 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] = CHSV(random(255), 255, 255); // Zufälliger Farbton, volle Sättigung und Helligkeit
FastLED.show(); // Zeige die Konfettieffekte an
delay(effectDelay); // Warte eine kurze Zeit, bevor der Effekt wiederholt wird
}
// Funktion für den "Atmenden" Effekt (Breathing) mit HSV
void breathingEffectHSV() {
static uint8_t 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] = CHSV(160, 255, brightness); // Blau mit variabler Helligkeit (160 ist der Farbton für Blau)
}
FastLED.show(); // Zeige den "Atmenden" Effekt an
delay(30); // Kurze Verzögerung für eine weiche Animation
}
// Funktion für den Feuer-Effekt (ohne HSV, weil Feuer besser mit RGB simuliert wird)
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:
colorWheelHSV(); // Farbrad (mit HSV)
break;
case 1:
chaseEffectHSV(); // Lauflicht (mit HSV)
break;
case 2:
rainbowEffectHSV(); // Regenbogen (mit HSV)
break;
case 3:
confettiEffectHSV(); // Konfetti (mit HSV)
break;
case 4:
breathingEffectHSV(); // Glühen (mit HSV)
break;
case 5:
fireEffect(); // Feuer (mit RGB)
break;
}
// Wechsle den Effekt nach einer bestimmten Zeit (z.B. alle 10 Sekunden)
if (millis() % 10000 < effectDelay) {
currentEffect = (currentEffect + 1) % 6;
}
}