[Gelöst]WS2812B : 1 loop-Durchgang zu wenig zum setzen von 4 Leds?

Habe ein vermutliches Timining Problem bzgl. des Setzens von Leds in meinem Sketch.
Der unten aufgeführte Sketch funktioniert mit dem ersten Strip wunderbar. Sobald ich den zweiten dazu aktiviere, wird ledFR die unterste Led schwarz geschaltet, sobald die oberste Led leuchtet.

Am besten schaut euch das Video kurz an, oder baut es kurz nach, falls Leds vorhanden sind.
Aufbau, je 8 Leds an einem Port vom Mega2560

Der Mega wird über USB gespeißt. Die Leds hängen hinter einem 5V StepDown Wandler mit max. ca 2A Ausgangsstrom.

#include <FastSPI_LED2.h>
#include <Streaming.h>

// Leds pro WS2812B Strip
const byte NUM_LEDS = 8;

// Led Streifen Vorne Links
const byte LEDS_FL_DATA = 46;
CRGB ledsFL[NUM_LEDS];
// Led Streifen Vorne Rechts
const byte LEDS_FR_DATA = 48;
CRGB ledsFR[NUM_LEDS];
// Led Streifen Hinten Links
const byte LEDS_RL_DATA = 50;
CRGB ledsRL[NUM_LEDS];
// Led Streifen Hinten Rechts
const byte LEDS_RR_DATA = 52;
CRGB ledsRR[NUM_LEDS];


void setup() {
	// WS2812 Vorne Links initialisieren und Werte auf 0 setzen
	FastLED.addLeds<WS2812B, LEDS_FL_DATA, GRB>(ledsFL, NUM_LEDS);
	memset(ledsFL, 0, NUM_LEDS * 3);
	// WS2812 Vorne Rechts initialisieren und Werte auf 0 setzen
	FastLED.addLeds<WS2812B, LEDS_FR_DATA, GRB>(ledsFR, NUM_LEDS);
	memset(ledsFR, 0, NUM_LEDS * 3);
	// WS2812 Hinten Links initialisieren und Werte auf 0 setzen
	FastLED.addLeds<WS2812B, LEDS_RL_DATA, GRB>(ledsRL, NUM_LEDS);
	memset(ledsRL, 0, NUM_LEDS * 3);
	// WS2812 Hinten Rechts initialisieren und Werte auf 0 setzen
	FastLED.addLeds<WS2812B, LEDS_RR_DATA, GRB>(ledsRR, NUM_LEDS);
	memset(ledsRR, 0, NUM_LEDS * 3);

	// Serielle Schnittstelle initialisieren mit Baud = 115200
	Serial.begin(115200);
	Serial << "step \tled \tbrightness" << endl;
}


void loop() {
	/* ANFANG Ansteuerung Led Streifen	*/
	static unsigned long lastMillis;
	const unsigned long interval = 20;
	static boolean reverse;
	static byte step;

	if (millis() - lastMillis >= interval) {
		lastMillis = millis();

		if (reverse == false) step++;
		else if (reverse == true) step--;

		if (step >= NUM_LEDS * 10) reverse = true;
		else if (step <= 0) reverse = false;

		byte led = step / 10;
		byte brightness = step % 10;

		Serial << step << "\t" << led << "\t" << brightness << endl;

		ledsFL[led] = CRGB(0, 0, brightness * 5);
		//ledsFR[led] = CRGB(0, 0, brightness * 5);
		//ledsRL[led] = CRGB(brightness * 5, 0, 0);
		//ledsRR[led] = CRGB(brightness * 5, 0, 0);
		FastLED.show();
	}
	/* ENDE Ansteuerung Led Streifen */
}

Im Video habe ich jeweils eine weitere Zeile auskommentiert bzgl. der Zuweisung ledsXy[led] ....

Einfacher Programmierfehler: Array-Überlauf.

if (step >= NUM_LEDS * 10) reverse = true;

Wenn step = NUM_LEDS * 10 ist, wird zwar das Flag für den Richtungswechsel gesetzt, aber der Rest trotzdem mit diesem Wert abgearbeitet. "led" wird dann den Wert NUM_LEDS annehmen, der höchste erlaubte Indexwert ist aber NUM_LEDS - 1. Somit überschreibst Du nachfolgende Speicherbereiche und das sind eben die nächsten LED-Arrays.

Danke. Ich hab den Fehler an der falschen Stelle gesucht :wink:

So gehts

	/* ANFANG Ansteuerung Led Streifen	*/
	static unsigned long lastMillis;
	const unsigned long interval = 10;
	static boolean reverse;
	static byte step;

	if (millis() - lastMillis >= interval) {
		lastMillis = millis();

		if (reverse == false) step++;
		else if (reverse == true) step--;

		if (step >= NUM_LEDS * 10) {
			reverse = true;
			step--;
		}
		else if (step <= 0) reverse = false;

		byte led = step / 10;
		byte brightness = step % 10;

		Serial << step << "\t" << led << "\t" << brightness << endl;

		ledsFL[led] = CRGB(0, 0, brightness * 5);
		ledsFR[led] = CRGB(0, 0, brightness * 5);
		ledsRL[led] = CRGB(brightness * 5, 0, 0);
		ledsRR[led] = CRGB(brightness * 5, 0, 0);
		FastLED.show();
	}
	/* ENDE Ansteuerung Led Streifen */