mikrocontroller.net

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


Autor: Tubie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Berti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
averagetemp += currenttemp;
averagetemp /= 2;

Da kommst du halbwegs auf ein Mittel!

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tubie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Julian O. (juliano)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Uhu Uhuhu (uhu)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tubie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tubie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: rene (Gast)
Datum:

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

Autor: Johnny Maxwell (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Tubie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...

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

Autor: Ralf W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tubie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ralf W. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: 6640 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aeh, ja. Division kommt vor Subtraktion.

Autor: Tubie (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.