FastLED- Offset innerhalb eines LED-Streifens

Hallo,

ich würde gerne via FastLED einen RGB LED-Streifen betreiben, der in der Mitte unterbrochen und dessen zweite Hälfte um drei LED-Abstände zum ersten Teil versetzt angebracht ist. Wenn ich nun eine Farbe z.B. von links nach rechts durchlaufen lasse, soll dieser Offset bei der Berechnung der einzelnen Pixel so berücksichtigt werden, dass die durchlaufende Farbe dann dementsprechend einen kurzen Moment braucht, bis sie den Bereich zwischen den beiden LED-Teilen passiert hat.

In den Beispielen zur FastLED-Library ist zwar ein ähnliches Beispiel enthalten (MultipleStripsInOneArray), jedoch wäre es bei mir so, dass ich die Datenleitung des zerschnittenen Streifens vom ersten zum zweiten Teil des Streifens gern fortführen würde, so dass ich die beiden Streifenteile an einem Pin betreiben kann.

Grundsätzlich wollte ich das Ganze so angehen:

#include "FastLED.h"

#define DATA_PIN 3
#define NUM_LEDS 43

#define FIRST 20
#define SECOND 20

CRGB leds[NUM_LEDS];

void setup()
{
 FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, 0, FIRST);
 FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, 22, SECOND);
}

void loop()
{
 
}

Bin ich da auf dem Holzweg, oder passt das theoretisch?

Gruß Chris

Funktioniert es denn?

Das Beispiel zeigt es anders. Dort geht es darum, dass die Leds von anderen Pins angesteuert werden. Es spricht nichts dagegen, einen Strip als ganze zu deklarieren. Wenn 3 Leds nicht leuchten sollen, dann gibtst du ihnen einfach immer nur die Werte 0,0,0

Es ist nicht so, dass drei LEDs nicht leuchten sollen. Der Abstand zwischen den beiden Hälften beträgt imaginäre drei LED-Abstände, die ich berücksichtigen möchte.

Ich kann momentan nicht testen, da kein entsprechender LED-Streifen vorhanden.

Gruß Chris

Wenn du LEDs auslassen willst, kannst du dir die Reihenfolge auch in einem Array definieren und einfach mit einer for-Loop da durchlaufen.

Edit, eben erst deinen Post gelesen. Du kannst in einem Array ja Wartezeiten mit LEDs verknüpfen. (Das Edit dauert jetzt so lange, weil: You have exceeded the number of posts you can make in a 5 minutes period. Please try again later.)

Ja, genau. Ich würde gerne drei LEDs nicht berücksichtigen.

Dies bedingt nicht, dass ich sie ausschalten möchte.

Gruß Chris

Edit: Wartezeiten bringen mir vermutlich nichts, da ich zum Einen die Geschwindigkeit des durchlaufenden Farbstreifens ggfs. variieren möchte und zum Anderen flexibel sein möchte, was nachträgliche Änderungen des Abstands zwischen den beiden Hälften angeht.

Ich würde den geteilten LED Strip an einen Pin hängen.

Dann würde ich mir ein zweites CRGB leds2 der Länge NUM_LEDS+3 anlegen.

Alle Effekte im (längeren) leds2 berechnen.

Sagen wir 20 LEDS: Dann z.B Position 0-9 nach aus leds2 nach leds kopieren und 13-22 nach 10-19

Dann das CRGB leds senden.

Chris72622: Ja, genau. Ich würde gerne drei LEDs nicht berücksichtigen.

Dann wirst du das so programmieren müssen! ;-)

Helmuth: Dann z.B Position 0-9 nach aus leds2 nach leds kopieren und 13-22 nach 10-19

Ich verstehe den Satz nicht. Kannst Du das evtl. etwas genauer beschreiben?

Dank Dir. :)

combie: Dann wirst du das so programmieren müssen!

Wie? So wie es Helmuth dargelegt hat?

Gruß Chris

Chris72622: Ich verstehe den Satz nicht. Kannst Du das evtl. etwas genauer beschreiben?

Ich verstehe das so:

leds  00 01 02 03 04 05 06 07 08 09          10 11 12 13 14 15 16 17 18 19
       ↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑           ↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑
leds2 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22

Schön, dass wenigstens @agmue mich versteht!

Ja, so meine ich das. Alle Effekte in leds2 mit 23 “virtuellen Leds” berechnen.

Diese dann auf die 20 realen Leds mappen, so wie in #8 gezeichnet und in #5 beschrieben.

Grüße,

Helmuth.

Code (ungetestet):

for (uint8_t i = 0; i < 10; i++) leds[i] = leds2[i];
for (uint8_t i = 10; i < 20; i++) leds[i] = leds2[i+3];

Helmuth:
Schön, dass wenigstens @agmue mich versteht!

Manchmal zumindest :slight_smile:

Nur mal so ginge der Schluckauf auch für alle LEDs (ungetestet):

for (uint8_t i = 0; i < 20; i++) leds[i] = leds2[i + ((i/10)*3)];

EDIT: i + ((i/10)*3)

for (uint8_t i = 0; i < 20; i++) leds[i] = leds2[(i/10)*3];

?

Das wird nix. Machs mal auf Papier, z.B. für i==10.

for (uint8_t i = 0; i < 20; i++) {

 if (i<10) leds[i] = leds2[i];
 else leds[i] = leds2[i+3];
}

Müsste auch gehen, ist aber vermutlich langsamer, als 2 Schleifen. (?)

Sorry, i + hat natürlich gefehlt, habe es korrigiert.

Ah, jetzt verstehe ich die Idee. Sieht gut aus.

Genial!

1000 Dank!!

Gruß Chris

Wenn man dieses Mapping Konzept einmal verstanden hat, kann man tolle Sachen machen.

Z.B. eine virtuelle 16x16 Matrix berechnen und diese auf einen Kreis von LEDs (also einen Strip) mappen.

Gruß,

Helmuth

Da scheint aber doch noch immer etwas nicht zu stimmen…

for (uint8_t i = 0; i < 20; i++)
{
  leds[i] = leds2[i + ((i/10)*3)];
}

Hierbei wird leds2[10] zu leds[13].

Das Ziel sollte aber eigentlich sein, dass leds2[13] zu leds[10] wird.

Müsste es dann nicht so heissen?

for (uint8_t i = 0; i < 20; i++)
{
  leds[i] = leds2[i + ((i/13)*-3)];
}

Gruß Chris

Nö.

Das ist mein Ziel:

leds  00 01 02 03 04 05 06 07 08 09          10 11 12 13 14 15 16 17 18 19
       ↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑           ↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑  ↑
leds2 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22

Mein UNO als kleiner Rechenknecht gibt genau das aus:

leds: 0  leds2: 0
leds: 1  leds2: 1
leds: 2  leds2: 2
leds: 3  leds2: 3
leds: 4  leds2: 4
leds: 5  leds2: 5
leds: 6  leds2: 6
leds: 7  leds2: 7
leds: 8  leds2: 8
leds: 9  leds2: 9
leds: 10  leds2: 13
leds: 11  leds2: 14
leds: 12  leds2: 15
leds: 13  leds2: 16
leds: 14  leds2: 17
leds: 15  leds2: 18
leds: 16  leds2: 19
leds: 17  leds2: 20
leds: 18  leds2: 21
leds: 19  leds2: 22
void setup() {
  Serial.begin(9600);
  for (uint8_t i = 0; i < 20; i++) {
    Serial.print("leds: ");
    Serial.print(i);
    Serial.print("  leds2: ");
    Serial.print(i + ((i / 10) * 3));
    Serial.println("");
  }
}

void loop() {
}

Funktioniert also soweit :slight_smile:

Aber leds2 gilt es doch nach leds zu konvertieren und nicht leds nach leds2.

Wenn drei LEDs übersprungen und somit nicht ausgegeben werden sollen, müsste doch eigentlich ein höherer Index in einen niedrigeren konvertiert werden.

Wenn beide Teile des LED-Streifens hintereinander gehängt werden, folgt nach LED 9 die LED 10 (innerhalb des leds-Arrays).

Der LED mit dem Index 10 aus dem leds-Array müsst doch dann der Index mit der Nr. 13 aus dem leds2-Array zugeordnet werden. Wäre der Abstand zwischen den beiden LED-Streifen größer, würde dies doch nichts daran ändern, das der ersten LED des zweiten LED-Streifens nach wie vor der Index mit der Nr. 10 des leds-Arrays zugeordnet wäre.

Gruß Chris

Chris72622: Aber leds2 gilt es doch nach leds zu konvertieren und nicht leds nach leds2.

Stimmt leds[]=leds2[];

Chris72622: Wenn drei LEDs übersprungen und somit nicht ausgegeben werden sollen, müsste doch eigentlich ein höherer Index in einen niedrigeren konvertiert werden.

Stimmt leds[19]=leds2[22];

Chris72622: Wenn beide Teile des LED-Streifens hintereinander gehängt werden, folgt nach LED 9 die LED 10 (innerhalb des leds-Arrays).

Der LED mit dem Index 10 aus dem leds-Array müsst doch dann der Index mit der Nr. 13 aus dem leds2-Array zugeordnet werden.

Stimmt leds[10]=leds2[13];

Du beschreibst exakt, was das Programm macht.