Rechnung mit float

Hallo,

ich habe irgendwo ein Problem in meiner Funktion mit der Multiplikation eines floats.

Dieser Teil kann erstmal ausser acht gelassen werden, …

void heartbeatRGB(int r, int g, int b) {
	const int INTERVAL = 20;
	const int patternHeartbeat[0x30] = {
		0, 1, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7,
		8, 8, 9, 9, 8, 7, 6, 5, 4, 5, 6, 7, 8, 9, 9, 8,
		8, 7, 7, 6, 6, 5, 5, 4, 4, 3, 3, 2, 2, 1, 1, 0,
	};
	int ledFactor[NUM_LEDS];
	static int ctPattern;

	static bool init;
	if (!init) {	// fill led array (even: abba; odd: abcba)
		for (unsigned char led = 0; led < NUM_LEDS / 2; led++) {
			ledFactor[led] = led + 1;
			ledFactor[NUM_LEDS - 1 - led] = led + 1;
		}
		if (NUM_LEDS % 2) {
			ledFactor[NUM_LEDS / 2] = NUM_LEDS / 2 + 1;
		}
		init = false;
	}

	bool renewLeds;
	static long lastMillis;
	if (millis() - lastMillis >= INTERVAL) {
		lastMillis = millis();
		ctPattern++;
		renewLeds = true;
		if (ctPattern >= 0x30) {
			ctPattern = 0;
		}
	}
	else renewLeds = false;

… los geht es hier.

	if (renewLeds) {
		for (int led = 0; led < NUM_LEDS; led++) {
			//leds[led].r = r / (((NUM_LEDS / 2) + 1) / patternHeartbeat[ctPattern] * ledFactor[led]);
			leds[led].r = (float)r * float((patternHeartbeat[ctPattern] * ledFactor[led]) / (((NUM_LEDS / 2) + 1) * 9));
			//leds[led].g = g / (((NUM_LEDS / 2) + 1) / patternHeartbeat[ctPattern] * ledFactor[led]);
			//leds[led].b = b / (((NUM_LEDS / 2) + 1) / patternHeartbeat[ctPattern] * ledFactor[led]);
		}
		FastLED.show();
	}
}

Ich versuche die Helligkeitsregelung hier mit einzubeziehen ohne die map() zu nutzen.

leds[led].r = (float)r * float((patternHeartbeat[ctPattern] * ledFactor[led]) / (((NUM_LEDS / 2) + 1) * 9));

Hierbei wird der prozentualle Wert von r berechnet.

((patternHeartbeat[ctPattern] * ledFactor[led]) / (((NUM_LEDS / 2) + 1) * 9))
Wobei diese Formel nur folgendes besagt
Wert aus dem Muster * Verstärkungsfaktor / max. Wert aus Muster * max. Verstärkungsfaktor

Fehlerbeschreibung??

 float((patternHeartbeat[ctPattern] * ledFactor[led]) / (((NUM_LEDS / 2) + 1) * 9));

Du dividierst hier 2 integerzahlen und wandelst das Ergebnis in float um. Wenn du eine float division willst, mußt du auch float zahlen dividieren: leds[led].r = (float)r * (float(patternHeartbeat[ctPattern] * ledFactor[led]) / float(((NUM_LEDS / 2) + 1) * 9));

Danke Gunther, habs gestern dann auch noch so hinbekommen

float perRGB = patternHeartbeat[ctPattern] * ledFactor[led] / float(4.5*NUM_LEDS); leds[led].r = r * (float)perRGB;