Forum: Mikrocontroller und Digitale Elektronik Mittelwert einer Temperatur über 1-48 Studen bilden


von Tubie (Gast)


Lesenswert?

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

von Berti (Gast)


Lesenswert?

1
averagetemp += currenttemp;
2
averagetemp /= 2;

Da kommst du halbwegs auf ein Mittel!

von Uhu U. (uhu)


Lesenswert?

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.

von Tubie (Gast)


Lesenswert?

@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

von Julian O. (juliano)


Lesenswert?

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

von Uhu U. (uhu)


Lesenswert?

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.

von Tubie (Gast)


Lesenswert?

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.

von Tubie (Gast)


Lesenswert?

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

von rene (Gast)


Lesenswert?

Ich hab da mal was geschrieben :
http://www.ibrtses.com/embedded/exponential.html

von Johnny Maxwell (Gast)


Lesenswert?


von Tubie (Gast)


Lesenswert?

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

von Ralf W. (Gast)


Lesenswert?

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

von Tubie (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Ralf W. (Gast)


Lesenswert?

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

von 6640 (Gast)


Lesenswert?

Aeh, ja. Division kommt vor Subtraktion.

von Tubie (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.