Led Effekte

Ich bin dabei, mein Regal, welches mit den WS2812B ausgestattet ist, mit weiteren Effekten auszustatten.

Effekte:

  • Lauflicht ersetzt 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();
}

.

Das Wechswelblitzen der amerikanischen Polizei? Vielleicht auch, eine LED nach der anderen immer heller. Als ob die Flaschen nacheiander "voll" werden... Der KnightRider könnte auch mit gedimmten LEDs nett aussehen. So, dass immer eine Farbe den KR Effekt durchläuft. Machst du den KR mit Nachleuchten?

Ich sehe aber nur 8 Jacky Flaschen!

Das Bild ist nicht mehr aktuell mit dem aktuellen Aufbau, die haben sich vermehrt :wink: Amerikanische Polizei hatte ich schonmal mit dem TLC5916 gemacht, könnte den Sketch entsprechend rauskramen.

Das mit den Flaschen nacheinander voll werden hört sich gut an, und ist sehr einfach zu erledigen, da ich bereits das Grundgerüst dafür in 2 anderen Funktionen verwende.

Und ja, Knightrighter mit nachleuchten und ohne delays.

Ich seh keine acht Jackyflaschen.Vielleicht bin ich aber auch einfach nur zu besoffen. :fearful:

Gruß Chris

anderer thread.

was jetzt nicht zwingend heißt, daß Du nüchtern bist...

Warum sieht er dann keine keine 16/18 :smiley:

Die für fastspi_led (2?) Library gibt es doch ein Beispiel mit über 20 verschiedenen Effekten, ist da nix dabei? Irgendwo gibt's auch ein Video, falls du das noch nicht kennst.

FastSPI nutzt ich, sind aber nicht wirklich tolle Effekte bei. ShiftPWM hatte besser, aber sowas hab ich alles bereits.

Hallo Stefan

Ich probiere gerade neue Farbverläufe aus, ich weis nur nicht wie das ist bei 9 LEDs ich probiere es gerade mit 36 Leds da ich die ja als meine Dezimal Uhr hier verbaut habe. Was mir gut gefällt ist 12 LEds laufen im Regenmbogen Muster nach links und 12 Laufen nach rechts, jeweils die am Anfang und am Ende des Strips und die 12 in der Mitte wechseln lediglich alle zusammen die komplette Farbpalette. Also auf meinen 36 verbauten Leds sieht das super aus und ich könnte mir denken das es unter Flaschen im Regal auch ein schöner Effekt5 ist.

±-±-±-±-±-±-±-±-+
← I I →
l.G.Jürgen

Kann mir gerade nicht vorstellen wie das mit den Farbverläufen genau bei dir aussehen soll

static byte tmpRainbowWidth;
	byte led, hue, saturation, brightness, rainbowWidth, colorshift;
	unsigned int duration;

	// Werte aus Array zuweisen
	saturation = 255;
	brightness = brightnessArray[brightnessIndex];
	rainbowWidth = miscArray[miscIndex];
	duration = durationArray[durationIndex];

	if(rainbowWidth != tmpRainbowWidth) {
		// String leeren
		strMisc2 = "";
		if(rainbowWidth < 10) strMisc2 += " ";
		strMisc2 += rainbowWidth;
		strMisc2 += " Leds";
		tmpRainbowWidth = rainbowWidth;
	}

	// Farbverschiebung
	colorshift = (255 * millis() / duration) % 255;
	// Leds setzen
	for(led = 0; led < NUM_LEDS; led++)
	{
		hue = (led * 255 / (rainbowWidth) + colorshift) % 255;
		leds[led] = CHSV(hue, saturation, brightness);
	}

Ist bei dir sowas, nur dass du 1 Hälfte nutzt und dann die andere Richtung spiegelst? Nicht wundern über einzelnen Sachen in der Funktion. Wurde etwas umfangreicher meine Bedienung über Tasten + Display :smiley:

Wobei, der Effekt, den du schreibst, könnte mir gefallen. Kanns mir glaub doch vorstellen.

Ich stelle Dir einmal den Sketsch ein:

#include <FastSPI_LED2.h>
#define NUM_LEDS 36
#define DATA_PIN A2
CRGB leds[NUM_LEDS];

#include <Streaming.h>  

void setup()
{
	// Serielle Schnittstelle
	Serial.begin(115200);
	// Konfiguration WS2812
	FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS); 
        for(int i = 0; i < NUM_LEDS; i++) leds[i] = CRGB(0, 0, 0); 
}


void loop()
{
	// regenbogen(uint32_t warteZeit, uint8_t saettigung, uint8_t hellwert)
	regenbogen(2000, 172, 72);
}

void regenbogen(uint32_t warteZeit, uint8_t saettigung, uint8_t hellwert)
	// warteZeit = Dauer um den Farbkreis einmal zu durchlaufen
	// saettigung = 0 - 255; 255 voll gesaettigte Farben
	// hellwert = 0 - 255; 255 volle Helligkeit
{
	uint32_t aktuelleZeit = millis();
	uint8_t farbverschiebung = (180 * aktuelleZeit / warteZeit) % 255;

	for(uint8_t led = 24; led < NUM_LEDS; led++)
	{
		uint8_t farbwert = (led * 255 / (NUM_LEDS + 2) - farbverschiebung ) % 255;
                leds[led] = CHSV(farbwert, saettigung, hellwert);
}
        for(uint8_t led = 13; led < NUM_LEDS-13; led++)
	{
		uint8_t farbwert = (led / (NUM_LEDS) * farbverschiebung );
                leds[led] = CHSV(farbwert+farbverschiebung, saettigung, hellwert);
}
        for(uint8_t led = 0; led < NUM_LEDS-24; led++)
        {
                uint8_t farbwert = (led * 255 / (NUM_LEDS + 2) + farbverschiebung ) % 255;
		leds[led] = CHSV(farbwert, saettigung, hellwert);
	
	}
        
	FastLED.show();
}
[code]

l.G.Jürgen

[/code]

Hmmm, der Sketch kommt mir an manchen Stellen bekannt vor :D

Mach mal bitte in [*code] Sketch */code, ich kriege Augenkrebs ;)

Ja bei mir laufen die ersten 12 LED von der mitte zum Rand aussen dann 12 Led die nur die Farben wechseln ohne zu laufen und die nächsten 12 Led wieder gespiegelt von der mitte nach Aussen, so das der Mittlere Teil immer eine gesammte Farbe wechselt und die Äusseren Teile als Regenbogen von innen nach Aussen laufen

l.G.Jürgen

Den Sketch mußt Du ja kennen ist vom Regenbogen nur was mit rum experimentiert.

#include <FastSPI_LED2.h>
#define NUM_LEDS 36
#define DATA_PIN A2
CRGB leds[NUM_LEDS];
#include <Streaming.h>  
void setup()
{
	// Serielle Schnittstelle
	Serial.begin(115200);
	// Konfiguration WS2812
	FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS); 
        for(int i = 0; i < NUM_LEDS; i++) leds[i] = CRGB(0, 0, 0); 
}
void loop()
{
	// regenbogen(uint32_t warteZeit, uint8_t saettigung, uint8_t hellwert)
	regenbogen(2000, 172, 72);
}
void regenbogen(uint32_t warteZeit, uint8_t saettigung, uint8_t hellwert)
	// warteZeit = Dauer um den Farbkreis einmal zu durchlaufen
	// saettigung = 0 - 255; 255 voll gesaettigte Farben
	// hellwert = 0 - 255; 255 volle Helligkeit
{
	uint32_t aktuelleZeit = millis();
	uint8_t farbverschiebung = (180 * aktuelleZeit / warteZeit) % 255;
	for(uint8_t led = 24; led < NUM_LEDS; led++)
	{
		uint8_t farbwert = (led * 255 / (NUM_LEDS + 2) - farbverschiebung ) % 255;
                leds[led] = CHSV(farbwert, saettigung, hellwert);
}
        for(uint8_t led = 13; led < NUM_LEDS-13; led++)
	{
		uint8_t farbwert = (led / (NUM_LEDS) * farbverschiebung );
                leds[led] = CHSV(farbwert+farbverschiebung, saettigung, hellwert);
}
        for(uint8_t led = 0; led < NUM_LEDS-24; led++)
        {
                uint8_t farbwert = (led * 255 / (NUM_LEDS + 2) + farbverschiebung ) % 255;
		leds[led] = CHSV(farbwert, saettigung, hellwert);
	}
 	FastLED.show();
}
[code]

[/code]

Setzt das bitte in Code Block :drooling_face:

zu Befehl ]:D siehe Oben

Oben steht nichts ;)

Meinst du das mit dem Regenbogeneffekt in etwa so?

https://www.dropbox.com/s/tq1lgwo5dzf5q7s/2013-11-14%2017.37.44.mp4 Code gibts erstmal nicht dazu, der ist mal wieder richtig schmutzig in der schnell geworden ;) wenn die ganzen Zwischenvariablem nur test2131, testtest etc heißen :D

Gruß Stefan

Stefan, ja so ungefähr meine ich das, nur ich habe meine 36 LED so aufgeteilt, das 12 nach rechts laufen 12 nur die Farbe wechseln und 12 nach links laufen, in dem Regenbogen Farben. Ich habe 36 LED von den ws2812b strips hinter Plexiglas verklebt, sieht ungefähr aus wie ein Zollstock. damit habe ich experimentiert. ist aber ungefähr der Efekt wie im Video nur das die mitte nicht verläuft sondern alle Farben durchspielt.

l.G.Jürgen

Ich hätte gestern fast ~ 100 WS2812B verbaut. Hab von pollin noch so kleine Leuchtstoffröhrengehäuse für 20Watt Röhren. Alles soweit ausgebaut, nur passte der fertige Strip ganz knapp nicht unter die Abdeckung. Das wäre dann ne helle "Funzel" geworden. Aber da kann man dann nicht mehr zwingend von Energiesparen reden, wenn das Teil dann auf volle Leistung die hälfte mehr an Strom braucht :D

Ja ich kenne das. Ich bin auch total fasziniert von den Strips und habe schon unseren Wohnwagen damit ausgestattet, Ich hatte im Sommer 2 Neue Fenster eingebaut in unserem Ausgebauten Vorzelt vom Wagen und wir wollten Keine Gardienen davor haben. der Nachteil ist aber das man dann abends wenn Licht an ist schön din den Wagen rein schauen kann von Aussen, jetzt habe ich über jedem Fenster je 60 Led von den ws2812b Strips verbaut die senkrecht nach unten strahlen, das ist ein super Effekt da sie ganz langsam die Farbe wechseln und sie blenden von aussen so , das man keine Vorhänge mehr braucht. :)

ich habe mal versucht von meinem Zollstock ein Video zu machen , vielleicht kannst Du ja sehen wie ich das mit dem Lichteffekt meine. http://www.vidup.de/v/LS7UR/