Ich bin dabei, mein Regal, welches mit den WS2812B ausgestattet ist, mit weiteren Effekten auszustatten.
Effekte:
-
Lauflichtersetzt durch KnightRider/LarsonScanner - Regenbogen Farbverlauf Links
- Regenbogen Farbverlauf Rechts
- Regenbogen Implosion
- Regenbogen Explosion
- Heartbeat (in Arbeit)
- Fading aller Leds(noch nicht wieder eingebaut)
- Fading einer Led(noch nicht wieder eingebaut)
Weitere Vorschläge sind erwünscht!
Alle Effekte sind unabhängig von der eingesetzten LED Anzahl. Einziges Manko, der KnightRider/Larson Scanner erstreckt sich mit der Beleuchtung über 5 Leds. (Benötigt > 5 Leds)
Aufbau der Leds:
Sketch mit 10 und 9 Leds getestet.
--x----x----x----x----x----x----x----x--
#include <FastSPI_LED2.h>
#define NUM_LEDS 9 // Anzahl an Leds am WS2812 Strip
#define RGBORDER GRB // RGB Anordnung vom WS2812 Strip
#define DATA_PIN 6 // DATA Pin Arduino
CRGB leds[NUM_LEDS];
void setup() {
Serial.begin(9600);
FastLED.addLeds<WS2812B, DATA_PIN, RGBORDER>(leds, NUM_LEDS);
}
void loop() {
// Testfunktion, uebergibt LarsonScanner einen wechselnden Farbton
byte hue = (millis()/100)%255;
//larsonScanner(NUM_LEDS, hue, sat, duration);
//gradientRight(NUM_LEDS, NUM_LEDS, sat, duration);
//gradientLeft(NUM_LEDS, NUM_LEDS, sat, duration);
// implosion(NUM_LEDS, NUM_LEDS, sat, duration);
}
KnightRider/ Larson Scanner (Basis von jurs)
void larsonScanner(byte ledcount, byte hue, byte sat, byte duration) {
static unsigned long previousMillis = millis();
static int i; // Schrittzaehler
static int led = 0;
static boolean reverse = false;
byte dim;
if(i > 32) {
i = 0;
if (reverse) led--;
else led++;
// Anfang erreicht
if (led < 0) {
led = 0;
reverse =! reverse;
}
// Ende erreicht
if (led >= ledcount) {
led = ledcount-1;
reverse =! reverse;
}
}
if (millis()-previousMillis > duration) {
previousMillis = millis();
memset(leds, 0, ledcount*3); // LED Array zuruecksetzen
dim = i*4;
i++;
// Aktuelle Led-2
if (led-2>=0 && !reverse) {
leds[led-2] = CHSV(hue, sat, 128-dim); // FadeDown
}
else if (led-2>=0 && reverse) {
leds[led-2] = CHSV(hue, sat, dim); // FadeUp
}
// Aktuelle Led-1
if (led-1>=0 && !reverse) {
leds[led-1] = CHSV(hue, sat, 255-dim); // FadeDown
}
else if (led-1>=0 && reverse) {
leds[led-1] = CHSV(hue, sat, 127+dim); // FadeUp
}
// Aktuelle Led
leds[led] = CHSV(hue, sat, 255);
// Aktuelle Led+1
if (led+1<ledcount && !reverse) {
leds[led+1] = CHSV(hue, sat, 127+dim); // FadeUp
}
else if (led+1<ledcount && reverse) {
leds[led+1] = CHSV(hue, sat, 255-dim); // FadeDown
}
// Aktuelle Led+2
if (led+2<ledcount && !reverse) {
leds[led+2] = CHSV(hue, sat, dim); // FadeUp
}
else if (led+2<ledcount && reverse) {
leds[led+2] = CHSV(hue, sat, 128-dim); // FadeDown
}
FastLED.show();
}
}
Regenbogeneffekte
void gradientRight(byte ledcount, byte rainbowWidth, byte sat, unsigned int duration) {
memset(leds, 0, ledcount*3);
byte hue[NUM_LEDS];
// Farbverschiebung
byte colorshift = (255*millis()/duration)%255;
for(int i = 0; i < ledcount; i++) {
hue[i] = (i*255/rainbowWidth+colorshift)%255;
}
// Farbton nach rechts verschieben (1 2 3 4 5, -> 5 1 2 3 4)
for(int led = 0; led < ledcount; led++) {
leds[ledcount-(led+1)] = CHSV(hue[led], sat, 200);
}
FastLED.show();
}
void gradientLeft(byte ledcount, byte rainbowWidth, byte sat, unsigned int duration) {
memset(leds, 0, ledcount*3);
byte hue[NUM_LEDS];
// Farbverschiebung
byte colorshift = (255*millis()/duration)%255;
for(int i = 0; i < ledcount; i++) {
hue[i] = (i*255/rainbowWidth+colorshift)%255;
}
// Farbton nach links verschieben (1 2 3 4 5 -> 2 3 4 5 1)
for(int led = 0; led < ledcount; led++)
{
leds[led] = CHSV(hue[led], sat, 255);
}
FastLED.show();
}
void explosion(byte ledcount,byte rainbowWidth,byte sat, unsigned int duration) {
memset(leds,0,ledcount*3);
byte hue[NUM_LEDS];
// Farbverschiebung
byte colorshift = (255*millis()/duration)%255;
for(int i = 0; i < ledcount; i++) {
hue[i] = (i*255/rainbowWidth+colorshift)%255;
}
// Farbton nach links verschieben (3 2 1 -> 4 3 2)
for(int led = 0; led < ledcount/2; led++) {
leds[led] = CHSV(hue[led], sat, 100);
}
// Gerade Anzahl Leds
// Farbton nach rechts verschieben (1 2 3 -> 4 3 2)
if(ledcount%2 == 0) {
for(int led = ledcount/2; led < ledcount; led++) {
leds[led] = CHSV(hue[ledcount-led], sat, 100);
}
}
// Ungerade Anzahl Leds
// Farbton nach rechts verschieben (1 2 3 -> 4 3 2)
else {
for(int led = (ledcount/2)+1; led < ledcount; led++) {
leds[led] = CHSV(hue[(ledcount-1)-led], sat, 100);
}
// Farbton nach links und rechts verschieben (2 1 2 -> 3 2 3)
leds[(ledcount/2)] = CHSV(hue[(ledcount/2)], sat, 100);
}
FastLED.show();
}
void implosion(byte ledcount,byte rainbowWidth,byte sat, unsigned int duration) {
memset(leds,0,ledcount*3);
byte hue[NUM_LEDS];
// Farbverschiebung
byte colorshift = (255*millis()/duration)%255;
for(int i = 0; i < ledcount; i++) {
hue[i] = (i*255/rainbowWidth+colorshift)%255;
}
// Farbton nach rechts verschieben (3 2 1 -> 2 3 4)
for(int led = 0; led < ledcount/2; led++) {
leds[led] = CHSV(hue[(ledcount/2)-led], sat, 100);
}
// Farbton nach links verschieben (3 2 1 -> 2 1 4)
for(int led = ledcount/2; led < ledcount; led++) {
leds[led] = CHSV(hue[led-(ledcount/2)], sat, 100);
}
FastLED.show();
}
.