uwefed:
Außerdem ist die Mittelwertbildung etwas kurios:
Dass die Mittelwertbildung "kurios" ist, weil er irgendwie versucht einen "gleitenden Mittelwert" zu bilden (''wohl vermutlich weil seine Thermostatschaltung keine Hysterese beim Ein- und Ausschalten vorsieht), ist gar nicht mal das große Problem, die Mittelwertbildung ist aber sogar falsch, weil sie mit einer nicht initialisierten Variablen startet, hier mal mit ergänzten Kommentaren:
float averageTemperature()
{
readTemperature(); // Wert lesen, Wert wegwerfen, wird nirgends ausgewertet
float averageTemp; // Deklariere eine nicht initialisierte Variable
for (int i = 1; i < 1000; i++) // und rechne im ersten Schleifendurchlauf mit dieser Variablen irgendwas aus!
averageTemp += ((readTemperature() - averageTemp)/(float)i);
return averageTemp; // Rückgabewert ==> Datenmüll, verbessert durch 1000-fache Iteration
}
Addi:
Hab den Code aus einem anderen Thread entnommen.
Es ist vielleicht eine gute Idee, guten und funktionierenden Code zu übernehmen.
Aber das ist bei dem Code nicht der Fall.
Du rechnest eine Durchschnittstemperatur aus, und im ersten Schleifendurchlauf ist diese Durchschnittstemperatur "irgendein Startwert", und mit 1000 Schleifendurchläufen wird dieser Startwert dann allmählich an den Messwert angenährt. Da kann nur besserer Datenmüll bei rauskommen.
In dem Fall kann der Sprung im Wert auch durch das Umschalten selbst verursacht sein: Da zwischendurch eine andere Funktion ausgeführt wird, liegt anderer Datenmüll im Speicher, aus dem der Mittelwert ermittelt wird.
Also entweder die Mittelwertbildung testweise mal ganz rausschmeissen:
float averageTemperature()
{
return readTemperature();
}
Oder den Mittelwert vor der kuriosen Mittelwertbildung auf den tatsächlich gemessenen Wert setzen:
float averageTemperature()
{
float averageTemp=readTemperature();
// Oder: float averageTemp=0;
for (int i = 1; i < 1000; i++)
averageTemp += ((readTemperature() - averageTemp)/(float)i);
return averageTemp;
}
Und dann mal sehen, ob beim Schaltvorgang immer noch ein Sprung auftritt.
BTW: Fehlende Hysterese!
Ein Thermostat darf nicht auf den Punkt ein- und ausschalten! Wenn der Messwert "gerade an der Grenze ist", und im Sekundentakt zwischen 17,99 und 18,00 hin- und herspringt, dann würde an diesem Schaltpunkt der Regler im Sekunden- oder Millisekundentakt ständig ein- und ausschalten, hunderte Schaltvorgänge in kurzer Zeit ausführen, und das Relais oder die Heizung in kurzer Frist ruinieren! Für Zweipunkt-Regler müßte immer eine "Hysterese" als "Einschaltbereich" (statt Einschaltpunkt) vorgesehen werden. Also wenn die Temperatur auf 18,00 Grad geregelt werden soll, dann wird die Kühlung beispielsweise bei überschreiten von 18,30 Grad eingeschaltet und erst bei Unterschreiten von 17,70 Grad wieder ausgeschaltet. Und in dem Bereich dazwischen wird immer der aktuelle Schaltzustand beibehalten.