Hallo, für einen weiteren Part meiner Heizungssteuerung möchte ich für die gemessene Außentemperatur einen Mittelwert bilden. Hierzu wird alle 10 min. eine Temperatur eingelesen und in einen Puffer geschrieben. Die darin enthaltenen 6 Temperaturen geben den Durchnitt der letzten Stunde wieder. Nun möchte ich diesen Wert um eine Einstellbare Zeit (1-48 Std.) weite "Dämpfen". Da wie in der Stunden Version ein Aufsummieren der Werte zu viel Speicher verbrauchen würde, suche ich nach einer anderen Lösung. Specherbedarf bisher: 48 Std 6 2 Byte = 576 Bytes -> Is Nix 48 Std * 2 Bytes = 96 Bytes -> Wenns garnicht anders geht Am liebsten wäre mir eine Speicherzelle, die die aktuelle Temperatur enthält und zu dieser bei jeder Messung eine Zahl nahe 0 hinzuaddiert wird. Dadurch wird sich der Temperatuwert bei Steigenden Temperauren vergrößern und bei fallenden Temperaturen verkleinern. Wie rechnet man soetwas? Gibt es vielleicht noch etwas einfacheres? Danke im Voraus! Gruß, Tubie
1 | averagetemp += currenttemp; |
2 | averagetemp /= 2; |
Da kommst du halbwegs auf ein Mittel!
Eine Methode wäre: + Aufaddieren der 10-Minuten-Werte bis die gewünschte Anzahl summiert ist + nach weiteren 10 Minuten den Mittelwert abziehen und den aktuellen Wert draufaddieren. Wenn Mittelwerte in der ersten Phase gebildet werden sollen, muß man eben den Akku-Wert durch die Anzahl der bereits summierten Werte teilen.
@Berti (Gast) averagetemp += currenttemp; ??? averagetemp /= 2; ??? Kann mit den 2 Zeilen leider garnichts anfangen :( averagetemp = Durchnittstemp currenttemp = Aktuelle Temp. das ist klar aber += und /=2 keine Ahnung @Uhu Uhuhu (uhu) Klingt gut! Werde es morgen mal versuchen und dann berichten Gruß, Tubie
Wenn du den Durchschnittswert erst nach den 48 Stunden benötigst und auf
von Anfang an weißt wieviele Messungen du durchführst kannst du die
Messwerte durch die Gesamtzahl der Messungen teilen und dann Addieren.
>>das ist klar aber += und /=2 keine Ahnung
a += b entspricht a = a + b
a /= b entsoricht a = a / b
Julian O. wrote: > Wenn du den Durchschnittswert erst nach den 48 Stunden benötigst und auf > von Anfang an weißt wieviele Messungen du durchführst kannst du die > Messwerte durch die Gesamtzahl der Messungen teilen und dann Addieren. Das ist nicht geschickt, denn dann muß man entweder float-Werte benutzen, oder es geht viel Genauigkeit verloren. Dividieren sollte man bei solchen Geschichten erst zum Schluß, denn die Division ist bei Divisoren != 1 ungenau.
Also, habe mir das jetzt so vorgestellt: start: count:=1 temp_summ:=aktuelle Temp maxcount = anzahl der messungen Bei jeder Messung (10 min) count:=count + 1 temp_sum := temp_sum + aktuelle Temp Wenn count=maxcount, dann wie Uhu Uhuhu beschrieben hat, durchnittswert nach der addition der aktuellen Temperatur wieder abziehen.
habe ja noch die hälfte vergessen... wenn ich den gemittelten temperatur wert benötige, temp_sum T = ----------- count das kann auch gleich nach dem aufsummieren (alle 10 minuten) erfolgen
Erstmal Vielen Dank für die ganzen Antworten! Habe da in einem anderen Forum noch was gefunden... http://www.haustechnikdialog.de/Forum/Default.aspx?t=73633&highlight=722148 Hier wird mit einer Zeitkonstante gerechnet je größer der Wert von ZK wird, desto Träger wird Tg. Bei ZK = 1 wird die Außentemperatur 1:1 wiedergegeben. Tg = Tg * (1-1/ZK) + Ta/ZK Tg = Gemittelte Temperatur ZK = Zeitkonstante Ta = Aktuelle Außentemperatur Habe die Formel jetzt mal .ASM tauglich gemacht und bin grad am programmieren... Viele Grüße, Tubie
Was mir bei der Formel oben aber auch auf der Seite (http://www.ibrtses.com/embedded/exponential.html ganz unten) auffällt ist immer dieser Term: (1-1/ZK) bzw. (1-1/RC). Der Term ergibt immer 0. Somit geht die Berechnung 'Tg * (1-1/ZK)' bzw 'output*(1-1/RC)' gar nicht in das Endergebnis mit ein. Oder sehe ich da was falsch. Kann das bitte jemand erklären. gruß ralf
Beispiel: ZK = 15 1/ZK = 0,066 1-0,066 = 0,933 das Ergebnis wird dann mit der aktuellen, gemitelten Temperatur multipliziert 15°C * 0,933 = 14,001 und dann wird noch die aktuelle Außentemperatur anteilmäßig hinzuaddiert Ta/ZK = 20°C / 15 = 1,333 = 14,001 + 1,333 = 15,334°C als neue, gemittelte Temperatur ------ Gruß, Tubie
Ralf W. wrote: > Was mir bei der Formel oben aber auch auf der Seite > (http://www.ibrtses.com/embedded/exponential.html ganz unten) auffällt > ist immer dieser Term: > (1-1/ZK) bzw. (1-1/RC). > > Der Term ergibt immer 0. > Somit geht die Berechnung 'Tg * (1-1/ZK)' bzw 'output*(1-1/RC)' gar > nicht in das Endergebnis mit ein. > Oder sehe ich da was falsch. Kann das bitte jemand erklären. Das ergibt nur dann 0, wenn du mit ganzen Zahlen rechnest. Sobald du auf Gleitkomme ausweichst ist dem nicht mehr so. Das Ganze ist ein simples gewichtetes Mittel: a = ( 1.0 - t ) * b + t * c (Und das lässt sich ganz einfach erklären: Du willst einen Mittelwert von 2 Werten, wobei zb. 70% von deinem einen Wert stammen und 30% [also 100 - 70] vom anderen) Mögliche Werte für t laufen von 0.0 bis 1.0. Nimm einfach mal einen Wert von 0.5 für t an a = ( 1.0 - 0.5 ) * b + 0.5 * c a = 0.5 * b + 0.5 * c a = ( b + c ) * 0.5 Das ist also das ganz normale arithmetische Mittel. Für eine Integer Variante würde sich zb. eine Skalierung mit 256 anbieten. a = ( ( 256 - t ) * b + t * c ) / 256 t kann jetzt Werte von 0 bis 256 annehmen. Oder aber, da ja dein t ein 1 / ZK Ausdruck ist, einfach mal die Klammern auflösen b = ( 1 - 1/ZK) * b + c / ZK b = b - b /ZK + c / ZK b = b - ( b + c ) / ZK Das ergibt dann auch einen schöner geformten Ausdruck, bei dem die Division erst ziemlich zum Schluss gemacht werden kann. Und das soll ja nicht schlecht sein, wenn man in Integer rechnen muss. Eine Rundungskorrektur wäre auch nicht schlecht. b = b - ( b + c + ZK/2 ) / ZK
Danke für eure Erklärung. Jetzt versteh ich es auch und seh auch meinen Denk - bzw. Rechenfehler. (1-1/x) ist nicht (0/x) sondern 1 - (1/x). Oh man sowas was von einfacher Mathe und ich sehe es nicht ;-). gruß ralf
So... habe jetzt alles einprogrammiert und muß sagen, es ist wirklich eine sehr elegante Methode, einen Mittelwert zu bilden. Habe jetzt 3 Werte, die nacheinander berechnet werden. Es läuft einfach super! Lang ZK=255* 10 min -> sehr träge (sommer / winter umschaltung) Mittel ZK=18* 10 min -> schon flinker (Heizkurve) Kurz ZK=6* 10 min -> sehr schnell (Außentemperatur Anzeige) Gruß, Tubie
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.