Performance Probleme beim WS2812?

Hallo,

ich habe ein kleines Problem mit meinem Lauflicht. Immer wenn die Led zur nächsten Led übergehen soll, gibt diese einen Peek noch von sich.
Dachte erst, dass es vielleicht vom Chip selber kommen kann. Wie ich aber dann, nachdem ich die Serielle Ausgabe eingestellt habe, gesehen hab, macht die Led was sie soll. Das Programm haut den Peek raus.

Gibt es irgendwelche Ungereimheiten, die zu diesem Problem führen können?

// Lauflicht
void runningLed()
{
	// Einmal ausführen
	if(runOnce == true)
	{
		// Farbton, Sättigung, Helligkeit, Dauer
		values[1] = 170;
		values[2] = 255;
		values[3] = 255;
		values[4] = 1000;
		runOnce = false;
	}


	static boolean state;
	static byte led;
	static unsigned long previousMillis;
	byte hue, saturation, brightness, value;
	unsigned int duration, modDuration, fadeValue;


	// Werte aus Array zuweisen
	hue = values[1];
	saturation = values[2];
	brightness = values[3];
	duration = values[4];

	// Vergangene Zeit seit letzter Änderung
	if(millis() - previousMillis >= duration)
	{
		// Aufwärts zählen
		if(led < NUM_LEDS - 1 && state == false)
		{
			led++;
			if(led == NUM_LEDS - 1) state = true;
		}

		// Abwärts zählen
		else if(led > 0 && state == true) 
		{
			led--;
			if(led == 0) state = false;
		}
		previousMillis = millis();
	}

	// Wertebereich von 0 bis duration (Dauer in ms)
	modDuration = millis() % duration;

	// Fade Down
	if(modDuration > duration / 2) fadeValue = duration - modDuration; 
	// Fade Up
	else fadeValue = modDuration; 

	// Mapping in Abhängigkeit von der maximalen Helligkeit
	value = map(fadeValue, 0, duration / 2, 0, brightness);

	// Debug
	Serial << F("led:") << led << (";value:") << value << F(";previousMillis:") << previousMillis << endl;

	// Led setzen
	leds[led] = CHSV(hue, saturation, value);
}

Auszug aus Serielle Ausgabe
Wie zu sehen,

led:2;value:13;previousMillis:2078;millis():2978
led:2;value:11;previousMillis:2078;millis():2982
led:2;value:8;previousMillis:2078;millis():2987
led:2;value:6;previousMillis:2078;millis():2991
led:2;value:4;previousMillis:2078;millis():2996
led:2;value:2;previousMillis:2078;millis():3000
led:2;value:0;previousMillis:2078;millis():3004
led:2;value:2;previousMillis:2078;millis():3008
led:2;value:4;previousMillis:2078;millis():3012
led:2;value:6;previousMillis:2078;millis():3016
led:2;value:8;previousMillis:2078;millis():3021
led:2;value:10;previousMillis:2078;millis():3025
led:2;value:13;previousMillis:2078;millis():3030
led:2;value:15;previousMillis:2078;millis():3035
led:2;value:17;previousMillis:2078;millis():3039
led:2;value:20;previousMillis:2078;millis():3043
led:2;value:22;previousMillis:2078;millis():3047
led:2;value:24;previousMillis:2078;millis():3052
led:2;value:26;previousMillis:2078;millis():3056
led:2;value:29;previousMillis:2078;millis():3060
led:2;value:31;previousMillis:2078;millis():3064
led:2;value:33;previousMillis:2078;millis():3069
led:2;value:35;previousMillis:2078;millis():3074
led:2;value:38;previousMillis:2078;millis():3078
led:3;value:40;previousMillis:3079;millis():3083
led:3;value:42;previousMillis:3079;millis():3087
led:3;value:44;previousMillis:3079;millis():3091
led:3;value:46;previousMillis:3079;millis():3095
led:3;value:48;previousMillis:3079;millis():3100
led:3;value:51;previousMillis:3079;millis():3104
led:3;value:53;previousMillis:3079;millis():3108
led:3;value:55;previousMillis:3079;millis():3113
led:3;value:57;previousMillis:3079;millis():3118
led:3;value:60;previousMillis:3079;millis():3122
led:3;value:62;previousMillis:3079;millis():3126
led:3;value:64;previousMillis:3079;millis():3131
led:3;value:66;previousMillis:3079;millis():3135
led:3;value:69;previousMillis:3079;millis():3139
led:3;value:71;previousMillis:3079;millis():3143
led:3;value:73;previousMillis:3079;millis():3148
led:3;value:75;previousMillis:3079;millis():3152

Du als presenter Forums-User müßtest wissen, daß wir den GESAMTEN Sketch brauchen um Fehler zu finden und nicht nur einen Auszug.
In Deinem Sketchausschnitt verheimlichst Du uns viele Variablendeklarationen. Bitte den gesamten Sketch.

Grüße Uwe

Ganzen Sketch müsste ich wieder als Datei anhängen :frowning:
Hier nun alle noch interessanten Auszüge aus dem Sketch. Habe den Rest ausgelagert.

// Serielle Software Schnittstelle
// Rx, Tx = 7, 8
#include <AltSoftSerial.h>
AltSoftSerial softSerial;

// WS2812B
#include <FastSPI_LED2.h>
const byte NUM_LEDS = 8;
const byte DATA_PIN = 4;
CRGB leds[NUM_LEDS];

// LC Display
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
const byte NUMBER_OF_ROWS = 2;
const byte NUMBER_OF_COLUMS = 16;
LiquidCrystal_I2C lcd(0x27,NUMBER_OF_COLUMS,NUMBER_OF_ROWS);

// Streaming (F-Makro)
#include <Streaming.h>

// Anzahler der Felder
const byte NUMBER_OF_FIELDS = 6; 
int fieldIndex = 0;
// Array mit den Werten aller Felder (flüchtig!)
int tmpValues[NUMBER_OF_FIELDS]; 
// Array mit gespeicherten Werten aller Felder
int values[NUMBER_OF_FIELDS];

// Merker für Initialisierung
boolean runOnce;

// Button
const byte button = 2;
// Initialisierung
void setup()
{
	// Serielle Hardware Schnittstelle (Verbindung über USB zum PC)
	Serial.begin(115200); 
	// Serielle Software Schnittstelle (Verbindung über BT HC-06 mit BTApp
	softSerial.begin(9600); // Serieller Software Port senden und empfängt mit 9600 Baud 

	// WS2812B
	FastLED.addLeds<WS2812B, DATA_PIN, GRB>(leds, NUM_LEDS);

	// LC Display
	lcd.init();
	lcd.backlight();

	// Button
	pinMode(button, INPUT);

	// Startprogramm Debug
	//values[0] = 1;
	runOnce = 1;
}
// Hauptprogramm
void loop()
{
	// Leds zurücksetzen
	memset(leds, 0, NUM_LEDS * 3); 
	runningLed();
	// Leds setzen
	FastLED.show();
}

HIer nochmal die Datei als Anhang. Jetzt musst du aber auch in Aktion treten Uwe XD

Gruß Stefan

// Upload nun auch defekt im Forum?
https://www.dropbox.com/s/k7wwhkzn4vp7dki/ws2812b_bt.ino

Nachdem erst scheinbar eine Lösung gefunden habe, kam diese bei anderen Wartezeiten doch wieder. Habe nun die Modulo Funktion komplett herausgenommen und mit der verstrichenen Zeit seit der letzten Aktualisierung gerechnet.

Scheint nun doch richtig zu funktionieren.

// Lauflicht
void runningLed()
{
	// Einmal ausführen
	if(runOnce == true)
	{
		// Farbton, Sättigung, Helligkeit, Dauer
		values[1] = 170;
		values[2] = 255;
		values[3] = 255;
		values[4] = 4000;
		runOnce = false;
	}

	static boolean state;
	static byte led;
	static unsigned long previousMillis;
	unsigned long currentMillis, elapsedMillis;
	byte hue, saturation, brightness, value;
	unsigned int duration, fadeValue;

	// Werte aus Array zuweisen
	hue = values[1];
	saturation = values[2];
	brightness = values[3];
	duration = values[4];
	currentMillis = millis();

	// Vergangene Zeit seit letzter Änderung
	if(currentMillis - previousMillis >= duration)
	{
		// Aufwärts zählen
		if(led < NUM_LEDS - 1 && state == false)
		{
			led++;
			if(led == NUM_LEDS - 1) state = true;
		}
		// Abwärts zählen
		else if(led > 0 && state == true) 
		{
			led--;
			if(led == 0) state = false;
		}
		// Vergangene Zeit zurücksetzen
		previousMillis = currentMillis;
	}
	
	// Bereits verstrichende Zeit seit letzter Änderung
	elapsedMillis = currentMillis - previousMillis;
	
	// Fade Down
	if(elapsedMillis > duration / 2) fadeValue = duration - elapsedMillis; 
	//Fade Up
	else fadeValue = elapsedMillis; 

	// Led setzen	
	value = map(fadeValue, 0, duration / 2, 0, brightness);
	leds[led] = CHSV(hue, saturation, value);
	
	// Debug
	Serial << F("led:") <<  printDigits(led) << ("; value:") << printDigits(value) << F("; Millis:") << printDigits(elapsedMillis) << F("/") << printDigits(duration) << endl;
}

Serielle Ausgabe

led:   5; value:   3; Millis:3971/4000
led:   5; value:   3; Millis:3975/4000
led:   5; value:   2; Millis:3978/4000
led:   5; value:   2; Millis:3981/4000
led:   5; value:   1; Millis:3985/4000
led:   5; value:   1; Millis:3988/4000
led:   5; value:   0; Millis:3993/4000
led:   5; value:   0; Millis:3996/4000
led:   6; value:   0; Millis:   0/4000
led:   6; value:   0; Millis:   3/4000
led:   6; value:   0; Millis:   7/4000
led:   6; value:   1; Millis:  10/4000
led:   6; value:   1; Millis:  13/4000
led:   6; value:   2; Millis:  17/4000

Irgendwelche Einwände/Vorschläge?