Hallo,
ich bin auf der Suche für meinen WS2812B Strip nach Effekten geschrieben
in C. Gibt es dort eine gute Quelle, wo einiges bereits zusammengetragen
worden ist?
Interessant vorallem irgendwelche Komentenschweife etc.
LEDS schrieb:> ich bin auf der Suche für meinen WS2812B Strip nach Effekten geschrieben> in C. Gibt es dort eine gute Quelle, wo einiges bereits zusammengetragen> worden ist?
Suche ich auch. Würdest du es bitte hier schreiben, wenn du was gefunden
hast.
Hallo,
ich habe mir gerade mal die FastLED Lib angeschaut. Da gibt es in
DemoReel100 ein paar schöne Effekte. Vorallem der Komentenschweif
(sinelon()). Kann mir einer sagen, wie man den ohne FastLed schreibt?
Danke für den Link,
ich muss mal schauen, ob sich etwas interessantes ableiten lässt.
Hab mich mal mit dem Kometenschweif auseinander gesetzt. Das klappt so
ein bisschen schon.
width : gibt die länge des Schweifes an
*pos : aktuelle Position der ersten Led
value : Max. Helligkeit
Könnte mir jemand hierbei helfen, das ganze etwas besser aufzubauen? Ich
habe hier die Befürchtung, dass es zu unerlaubten überläufen kommt, wenn
in ein nicht vorhandenes Register geschrieben wird.
Es soll ein struct mit numLeds-Elementen beschrieben werden.
1. Runde/Start: Die erste Led kommt in der vollen Helligkeit.
2. Runde: Die erste Led wandert um +1 nach rechts. Die Nachfolgende Led
soll mit value/7*8 (value/(width-1)) * ((width-1)-led) leuchten. usw.
Wenn die schwächste Led (in diesem Beispiel pos-7 am Ende von numLeds
angekommen ist, soll nichts mehr zu sehen sein, ehe durch einen
Tastendruck die erste Led wieder an der ersten Pos ankommt.
Hoffe, dass mir wer da etwas helfen kann.
Hi,
also ich würde da etwas anders rangehen.
Ich habe mir für sowas verschiedene kleine Routinen geschrieben, die
jeweils nur eine einfache Operation auf die LEDs machen. Diese kann man
dann ggf. kombinieren.
Für Deinen "Kometenschweif" würde ich es so machen:
- Funktion scroll_right()
Schiebt den Inhalt des LED-Feldes eine Position nach rechts.
Es werden also immer die LEDs nach rechts weiter "gescrollt", und der
wert für die jeweils erste LED ganz links beginnend von der max.
Helligkeit immer weiter reduziert.
Das ganze kommt sogar ohne Multiplikation / Division aus und läuft
dadurch sehr schnell.
Hallo Markus,
deine Idee für den Fade finde ich Klasse. Habe mich mal rangesetzt, und
den Code etwas angepasst, soweit da nichts gegen spricht. ;)
Vielleicht kann es dem TE und anderen helfen.
1
//..
2
3
#define RED 0
4
#define GREEN 1
5
#define BLUE 2
6
7
/* Funktion : leds_comettail_finished()
8
* Beschreibung : Prueft, ob colorRGB wieder geleert ist
Ja, danke, sehr schön :)
Der Charme der einzelnen Funktionen ist es eben, dass man sie auch für
andere Effekte benutzen/kombinieren kann.
Ich hatte das ganze bei einer LED-Matrix mal so weit getrieben, dass ich
am Ende den gesamten Ablauf über Tabellen bzw. Strukturen steuern
konnte.
Man konnte "Szenen" definieren, die aus einer Generatorfunktion und
beliebeig vielen nachgeschalteten Effektfunktionen bestanden, die dann
die Ausgabe der Generatorfunktion noch weiter verändert haben.
So konnte man durch geschickte Kombination interessante Effekte
generieren. Z.B. ein Muster nur in 1/4 der Matrix generieren lassen und
dann in die drei anderen Quadranten spiegeln, faden etc.
Ja,
das sehe ich auch so Markus. Ich nutze selber hauptsächlich eine
angepasste Version der LIGHT WS2812B Lib. Vorteil ist, hier ist so gut
wie nichts bereits vorhanden. Es beschränkt sich auf die eigentliche
Ansteuerung.
Kenne die FastLed Lib. Dort sind einige nette Effekte drin. Auch ist die
Farbanpassung sehr gut gelungen, aber bei den meisten Effekten hat man
dann nur noch wenig Möglichkeiten, großartig einzugreifen.
Ich bin dabei, davon die ein oder anderen Math-Operation zu portieren.
Aber auch im geposteten Original lassen sich ein paar Dinge lernen
1
uint8_tval=(value/(width-1))*((width-1)-led);
das willst du nicht so berechnen.
Du willst in derartigen Berechnungen die Division immer ganz zum Schluss
machen.
Denn 12 / 7 ergibt 1. Und zwar 1 geradeaus!
Das ist eine Division Integer durch Integer. Und damit ist das Ergebnis
ebenfalls ein Integer. Keine Kommastellen!
ich sehe jetzt ehrlich gesagt nicht, wozu pos ein Pointer sein muss. Das
weitersetzen des Effekts an die nächste Position kann der Aufrufer
genausogut machen und da er die Länge einer Led Zeile kennt, kann er
auch den Überlauf entsprechend handhaben, so einer eintreten sollte.
warum sollte ich das für jede Farbe getrennt aufrufen?
Speziell wenn die Funktion dann eigenmächtig pos weiterzählt ist damit
faktisch schon fast garantiert, dass ich bei 3-fach notwendigem Aufruf
der Funktion jede Farbe an eine andere Stelle bekomme.
Die Funktion hat die Aufgabe die Farbwerte der Led-Zeile aufgrund des zu
implementierenden Effektes und der Vorgabe einer Farbe zu füllen. Dann
gibt der Funktion aber auch die Farbe als ganzes. Wenn eine Farbe
mittels einer struct colorRGB beschrieben wird, dann übergib auch genau
so ein Ding um die Farbe in ihrer Gesamtheit zu beschreiben. Dann ist
dann auch dieser Nonsense
1
switch(c)
2
{
3
case0:leds[*pos-led].r=correction[val];break;
4
case1:leds[*pos-led].g=correction[val];break;
5
case2:leds[*pos-led].b=correction[val];break;
6
}
nicht mehr nötig.
Wenn schon Farbe, dann auch wirklich Farbe:
(Der Unterschied ist nur, dass das eine mal ein Farb-Objekt direkt
übergben wird, das andere mal ein Pointer darauf)
Dann muss eben die Funktion in jedem Schritt jeweils die Werte für Rot,
Grün und Blau berechnen.
Jetzt erst mal davon abgesehen, dass so ein Schleifenkonstrukt beim
Aufrufer nicht unbedingt eine gute Idee ist, spricht ja erst mal nichts
gegen
1
structcometColor={0,6,12};
2
3
...
4
for(i=0;i<NUM_LEDS0+8;i++)
5
{
6
sinelon_new(leds,NUM_LEDS,8,i,cometColor);
7
ws2812_setleds(leds,NUM_LEDS);
8
}
Dann klappts auch mit dem Effekt.
(Wobei natürlich so ein Basisbaukasten, aus dem man dann weitere Dinge
zusammensetzt, schon eine ganz andere Liga darstellt)