Hallo, 1.) ich möchte mein uC-Thermometer mit einer "Gradientenfunktion" ausstattten, d.h. der uC soll erkennen, wenn die Temperatur _z.B._ in den letzten 10min um 5°C gefallen ist. Die 10min und die 5°C sollen in (weiten) Grenzen parametrierbar sein. Derzeit mache ich alle 5s eine Messung. Die Ergebnisse werden gefiltert. Das Problem dabei ist, dass ich für das 10min-Beispiel nicht einfach alle (in dem Fall 120) Messwerte im Speicher halten kann, um den Vergleich zwischen aktueller Temperatur und Temperatur vor 10min durchzuführen. Frage: Wie löst man sowas? 2.) Ähnliche Geschichte: Es sollen Min- und Maxwerte gespeichert werden - jeweils separat für: - die letzten 24h - die letzte Woche Frage: Wie erkenne ich, wann der "aktuelle" Maxwert "ausläuft"? Ich will ja kein Allzeitmaxwert speichern...
Ringbuffer!? Aber dann musst du natürlich schon möglichst alle Werte für den Betreffenden Zeitraum Speichern. Was tust du wenn du nichtmal 240 Bytes mehr frei hast für deine temperaturmesswerte.? -Wiebel
Ich fürchte, wenn wir jetzt Dein Beispiel für 10min. lösen, verrätst Du uns anschließend, dass der Parameter "Zeit" auch auf 24 Stunden gesetzt werden kann... :-) Nun mal Butter bei die Fische. Du sprichst ja selber schon von filtern. Insofern würde ich je nach Triggerzeit die Zahl der Messwerte soweit reduzieren, dass Sie in den Speicher passen. Du hast Dir die Suppe selber eingebrockt: Du mißt einfach zu oft. Glaubst Du, dass innerhalb von 5 Sekunden viel passiert? Das muss ein Windstoss sein und den willst Du eigentlich nicht mitmessen. Also: Du gönnst Dir einen Speicher von konstant 50 Meßwerten (oder wieviel Platz Du auch immer hast). Anschließend werden Temperaturen solange akkumuliert und gemittelt, bis wieder 1/50 Deiner Zeit vergangen sind. Dann darf ein Wert gespeichert werden. Und nun die obligatorische Frage: Welchen Controller benutzt Du denn, der keine 120 Werte speichern kann?
> Ich fürchte, wenn wir jetzt Dein Beispiel für 10min. lösen, verrätst Du > uns anschließend, dass der Parameter "Zeit" auch auf 24 Stunden gesetzt > werden kann... :-) ja, so hatte ich mir das vorgestellt. Nicht umsonst habe ich "in weiten Grenzen" geschrieben. ;-) > Glaubst Du, dass innerhalb von 5 Sekunden viel passiert? Das muss ein > Windstoss sein und den willst Du eigentlich nicht mitmessen. Das soll nicht das Thema sein, ich dachte eher an eine universelle Herangehensweise - nicht unbedingt ausschliesslich konkret an Temperaturmessung. > Also: Du gönnst Dir einen Speicher von konstant 50 Meßwerten (oder > wieviel Platz Du auch immer hast). Anschließend werden Temperaturen > solange akkumuliert und gemittelt, bis wieder 1/50 Deiner Zeit vergangen > sind. Dann darf ein Wert gespeichert werden. das und das Stichwort "Ringpuffer" von Michael lassen mich zum Schluss kommen, dass es dafür kein Patentrezept gibt... Schade. Aber weil du oben auf das Filtern eingegangen bist, muss ich nochmal kurz die Motivation meiner Frage(n) erläutern. Ich hatte mich zuvor schon gefragt, wie man z.B. über x Werte mittelt/filtert, ohne alle x Werte im Speicher vorhalten zu müssen. Ergebnis war dann, dass ausser dem aktuellen Messwert nur noch ein gefilterter Wert vorliegen muss. Der aktuelle Wert geht nur mit geringem Anteil in den neuen gefilterten Wert ein (z.B. Gewichtung: 10% neuer Wert zu 90% alter gefilterter Wert). So schlagen Ausreisser/Messfehler nicht so stark durch. Damit spare ich mir schonmal einiges an Speicher gegenüber z.B. Mittelwertbildung über 20Messwerte... Und genau sowas erhoffte ich mir auch für die Gradientengeschichte und/oder die MinMax-Speicherung. Aber offensichtlich muss ich wirklich alle Messwerte vorhalten. > Und nun die obligatorische Frage: Welchen Controller benutzt Du denn, > der keine 120 Werte speichern kann? Das Konzept soll natürlich controllerunabhängig sein. Ich möchte nämlich nicht diskutieren, an welchen anderen Stellen ich noch RAM einsparen kann, sondern genau an dieser Stelle! Ausserdem wollte ich nicht mit Riesenzahlen (z.B. Gradient über 24h; Messung alle 10ms) "provozieren". :-) Vielleicht hat ja doch noch jemand eine platzsparende oder sonstwie geniale Idee oder kann berichten wie er das schon erfolgreich umgesetzt hat. Danke, Richard
Schau mal unter den Begriffen "IIR Filter", "FIR Filter". Dein Beispiel mit den 90% alter Wert, 10% neuer Wert ist eir IIR Filter erster Ordnung.
>Dein Beispiel >mit den 90% alter Wert, 10% neuer Wert ist eir IIR Filter erster >Ordnung. Genau. Das nennt sich PT1. Ist ein Tiefpass erster Ordnung. Für Mittelungen wird der oft angewendet. Weil es nur einen Speicherplatz benötigt.
Eine einfache Möglichkeit zu mitteln ist natürlich einfach die Summe zu bilden (für eine Periode dann der einzige Wert, der gespeichert werden muss) und am Ende einer Messperiode durch die Anzahl der Messwerte zu teilen. Somit gehen dann ALLE Werte einer Messperiode in den Messwert mit ein. Übrigens reduzieren FIR/IIR-Filter NICHT die Zahl der Messwerte! Weiterhin gehen in einen Meßwert nur die Zahl von Werten ein, die der Ordnung entspricht... irgenwo müssen also Meßwerte zusammengefaßt oder ausgelassen werden.
Chrisi wrote: > Eine einfache Möglichkeit zu mitteln ist natürlich einfach die Summe zu > bilden (für eine Periode dann der einzige Wert, der gespeichert werden > muss) und am Ende einer Messperiode durch die Anzahl der Messwerte zu > teilen. Somit gehen dann ALLE Werte einer Messperiode in den Messwert > mit ein. Es gibt ja auch etlich Codeschnipsel die genau das mit 256 Werten machne, einfach 256 mal die Werte aufaddieren und dann die oberen 8 bit nehmen, fertig. Ein Ringbuffer ist natürlich netter, weil du ab entsprechend ab dem 256ten Wert laufen einen neuen Mittelwert bekommst und nicht erst wieder nach erneuten 256 Messungen, dafür kann an sich schon überlegen den Speicher auszugeben. Mit der IIR Filterung sollte das natürlich auch gehen. IIR Filter (Infinite Impulse Response) können sich allerdings natürlich auch zu träge zeigen, da der eigentlich Wert nie ganz erreicht wird. Wenn du also bei 0 anfängst und ab dann immer 255 hast wird der Wert erst sehr spät bei 255 ankommen, wenn überhaupt. Naja Nichtendliche Impulsantwort eben. Ein Ausreiser (Impuls) hat eine unendliche lange Folge. Meist kann man das natürlich vernachlässigen, aber dir ging es ja um die Theorien. Beim Ringbuffer hast du nach n gleichen Werten (n..Buffergrösse) natürlich auch genau diesen als Mittelwert. Von daher müsste ein entsprechender Ringbuffer eigentlich ein FIR Filter sein, das vermute ich jetzt aber nur. -wiebel
wie wärs denn mit einem I2C bus eeprom ( 93C24 oder ähnliches ) und du speicherst datum uhrzeit und den wert. dann kannst du auch ohne versorgungs spannung , also mehrere wochen , die werte speicher etc..
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.