Fehler: Negative Zahlen kommen in for-Schleife vor, trotz Abfrage

Bin gerade dabei, den Larson Scanner / Knightrider soweit umzuschreiben. Habe jedoch das Problem, dass mit die Serielle Ausgabe negative Werte in der letzten for-Schleife ausgibt.

void ledsLarsonScanner(uint8_t hue, uint8_t saturation, uint8_t brightness, uint8_t speed, uint8_t width)
{
	uint16_t interval = (16 - speed) * 50;
	static uint32_t lastMillis;
	static uint16_t led;
	static bool reverse;
	uint16_t newWidth = NUM_LEDS * (width + 1) / 32;


	if (millis() - lastMillis >= interval)
	{
		lastMillis = millis();
		if (led <= 0) reverse = false;
		else if (led >= NUM_LEDS - 1) reverse = true;
		if (reverse) led--;
		else led++;
	}

	for (int j = 1; j <= newWidth && led + j < NUM_LEDS; j++)
	{ // Leds Vorlauf
		// leds[led + j] = CHSV(hue, saturation, brightness * (newWidth - j) / newWidth);
	}
	for (int k = 1; k <= newWidth && led - k >= 0; k++)
	{ // Leds Ruecklauf
		// leds[led - k] = CHSV(hue, saturation, brightness * (newWidth - k) / newWidth);
	}
	leds[led] = CHSV(hue, saturation, brightness);
	FastLED.show();
}

Welche serielle Ausgabe?
Sag und wenigsten auf welche Variable Du Dich beziehst.

uwefed:
Welche serielle Ausgabe?
Sag und wenigsten auf welche Variable Du Dich beziehst.

Upps, hab die Serielle Ausgabe bei der Version schon rausgenommen :wink:
Es geht um "led - k" in

	for (int k = 1; k <= newWidth && led - k >= 0; k++)
	{ // Leds Ruecklauf
		// leds[led - k] = CHSV(hue, saturation, brightness * (newWidth - k) / newWidth);
	}

Welche Werte nehmen led und k an? Kasnnst Du uns eine Ausdruck geben?
Grüße Uwe

led kann die Werte von 0 bis (NUM_Leds-1) an.
Am einfachsten kann ich es an folgendem Beispiel zeigen
_ = Aus

  • = AN
    o = AN
  • = AN
    _ _ _ _ _ _ - - - - o + + + + _ _ _ _ _

Es ist ein Lauflicht, was hin und her läuft. Hierbei spiel die Led o den Mittelunkt. - sind leds die Links von o, und + sind Led die Rechts von o liegen.

Wenn nun led Richtung 0 läuft, können nicht alle - Leds dargestellt werden. Dann würde led - k < 0 sein und in ein falsches Array schreiben, was ich verhindern möchte. Gleiches gilt, wenn nun die Richtung NUM_LEDS - 1 lauft. Hier dürfen die Leds ebenfalls nicht überlaufen.

static uint16_t led;

Das war der Fehler, scheinbar muss bei der Berechnung von einem uint und einem int, entweder in die Berechnung ein (signed) oder aber beide Variablen als signed (int) deklariert werden.

void ledsLarsonScanner(uint8_t hue, uint8_t saturation, uint8_t brightness, uint8_t speed, uint8_t width)
{
	uint16_t interval = (16 - speed) * 8;
	static uint32_t lastMillis;
	static int16_t led;
	static bool reverse;
	uint16_t newWidth = NUM_LEDS * (width + 1) / 32;

	if (millis() - lastMillis >= interval)
	{
		lastMillis = millis();
		if (led <= 0) reverse = false;
		else if (led >= NUM_LEDS - 1) reverse = true;
		if (reverse) led--;
		else led++;

		for (int j = 1; j <= newWidth && led + j < NUM_LEDS; j++)
		{
			leds[led + j] = CHSV(hue, saturation, brightness *(newWidth - j) / newWidth);
		}
		leds[led] = CHSV(0, saturation, brightness);
		for (int k = 1; k <= newWidth && (led - k) >= 0; k++)
		{
			leds[(led - k)] = CHSV(hue, saturation, brightness *(newWidth - k) / newWidth);
		}
		FastLED.show();
	}
}