Powered By Blogger

Montag, 26. September 2016

halb voll oder halb leer? - Füllstandsmessung meiner Wasserkiste mit MPXV5004 / MPVZ5004

halb voll oder halb leer? - Füllstandsmessung meiner Wasserkiste mit MPXV5004 / MPVZ5004


Warum
Die Frage mal wieder nach dem warum. Nun, ganz einfach, in einem noch nicht geschriebenen Eintrag habe ich mir eine Bewässerungsanlage für meinen Balkon gebaut, die mit einem Reservoir in Form einer Blechkiste arbeitet. Die Kiste hat ein Fassungsvermögen von 140 Litern und muss je nach Wetter im 5-10 tägigen Rythmus immer wieder per Schlauch befüllt werden. Um diesen Zeitpunkt nicht zu verschlafen oder die Pumpe trocken laufen zu lassen, wenn es doch mal vergessen wurde, muss der Füllstand eben ermittelt werden. Nun ja, jeder redet von IoT oder Smart Home, also los...


Wie
Es gäbe die Möglichkeit, den vorherigen Post mit dem kapazitiven Messen der Bodenfeuchte zu benutzen. Sprich einen Sensor außen oder innen auf die Wand aufzubringen und mit Hilfe der Kapazitätsänderung die Höhe zu detektieren. In meiner Kaffeetasse hat das auch funktioniert aber es gibt die Einschränkung, dass die Leiterplatte des Sensors so lang sein muss, wie die Wand hoch ist. Das wäre in meinem Falle 400mm und führt zu hohen Kosten bei der Platine. Weiterhin ist das Wandmaterial Aluminium und wer weiß wie gut es dann noch funktioniert. Alternativ könnte man auch nur einen bestimmten Bereich überwachen, sprich kurz vor leer oder kurz vor voll.
Dann gibt es Druckschalter. Die würden, vorrausgesetzt man findet den richtigen, bei einem bestimmten Druck schalten. Damit könnte man nur Schwellen schalten, möglicherweise nur eine.
Eine weitere Möglichkeit sind optische Füllstandssensoren. Auch hier wieder nur die Kontrolle ob an einem bestimmten Punkt Flüssigkeit vorhanden ist. Nimmt man genügend, hat man ein Raster und könnte diskret die Füllhöhe abtasten. Schaut man sich die Preise bei Reichelt an, dann wäre dies ein ganz schön teurer Spaß.
Ultraschallsesorik wäre auch ein interessanter Ansatz, die Sensoren sind günstig, die Füllhöhe liegt im Messbereich und es ist fast in jedem Auto verbaut. Nun mich hat die zu entwicklende Schaltung ein wenig abgeschreckt. Denn wer weiß ob und wie gut es am Ende funktioniert.
Wer mag, der liest bei Wikipedia was es noch alles gibt.
Es bleibt für mich das Messprinzip über den Druck, den die Wassersäule ausübt, übrig. Sprich einen Drucksensor der den Druckunterschied zwischen voll und leer genau genug detektieren kann. Für diesen Einsatzzweck gibt es auch spezielle Sensoren, die im richtigen Druckbereich arbeiten. Also los, den nehmen wir...


Was Google sagt
http://www.smartewelt.de/sw4/?q=zisterne
http://www.forum-raspberrypi.de/Thread-messen-steuern-regeln-pius-die-zisterne-sendet-daten-zum-wasserstand
http://www.gerhard-schoettke.de/Hobbys/Basteleien/Fullstandsanzeige/fullstandsanzeige.html

ansonsten nix brauchbares. Daher wird es selbst gebaut.


Sensorauswahl
Schaut man was z.B. bei Reichelt beischaffbar wäre, kommt man zu NXP. Auf deren Webseite findet man dann 7 Sensoren im Messbereich bin 10kPa, was 1m maximaler Wasserhöhe entspricht. Optimal wäre 40cm, denn meine Kiste ist 30cm hoch. Also habe ich ausgewählt: MPXx5004. Dieser hat eine Genauigkeit von +/-6,25% und mit AutoZero +/-2,5%. Dies enspricht einem Messfehler von +/-25mm und mit AutoZero +/-10mm. Der Fehler mit AutoZero las sich beim Durchblättern des Datenblattes als Absolutfehler bezogen auf den "wahren" Messwert und ich dachte mit eigener Kalibrierung wäre dieser durchaus behebbar. Dies sollte sich später als Trugschluss erweisen aber später dazu mehr.


Schaltung
Die Schaltung ist recht simpel. Die vom Sensor erzeugte Spannung wird per Spannungsteiler vom Mikrocontroller gemessen und weiter verarbeitet. Der Sensor arbeitet mit VCC=5V und erzeugt bei 400 mm auch in etwa 5V analoge Ausgangsspannung. Damit ergibt sich ein Spannungsteiler von 270/330 kOhm, damit der gesammte Messbereich des Sensors genutzt werden kann. Als Mikrocontroller wird der ATmega8, der 2,56V als Referenzspannung bereitstellt, verwendet. Damit ergeben sich 25mV/Bit und das entspricht ca. 0,4mm/Bit. Also liegt der Messbereich von 1 mm im Bereich von ~3 Bit. Ich denke das ist ausreichend und genau genug. 


Messungen
In den ersten Messungen ergab sich dann aber eine sich stark ändernde Verlaufsgrafik, trotz kostantem Wasserpegel. Erste Ideeen auf mechanische Fehler (Sonne, Undichtigkeit) konnten sehr schnell ausgeschlossen werden. Hier im Bild ist eine Abweichung von 7 mm (von max zu min) zu erkennen. Liest man sich die Dokumentation des AtuoZero-Verfahrens durch, dann stellt man fest, dass hiermit nix zu erreichen ist. AutoZero kompensiert die generelle Abweichung vom echten Messwert aber kompensiert keinen Drift und meint auch nur in einem Bereich von +/-5°C. Also woher kommt dieser? Nun, viele Möglichkeiten blieben nicht übrig und siehe da, die Temperatur scheint sehr gut zu passen. Gelinde gesagt ist der Sensor stark Temperaturabhängig obwohl er als Temperature compensated beworben wird.



Erste Auswertung Temperatur zu Druck bei konstantem Druck

physikalischer Zusammenhang
Wird der gemessene ADC Wert (um Berechnungseinflüsse auszuschließen) über die Temperatur in einem xy-Diagramm aufgetragen, so kommt es zu einem nahezu linearen Zusammenhang. Dies ist perfekt für eine nachträglich Berechnung des "wahren" ADC / Druckwertes. Da die Kurve nahezu perfekt linear ist, ist davon auszugehen dass es sich hier um die gesuchte Einflußgröße handelt.
linearer Zusammenhang Druck vs. Temperatur, ADC Messwert gemessen über Spannungsteiler


Kompensation berechnen
Die Kompensation der Temperatur kann an mehreren Stellen erfolgen. Entweder man berechnet aus dem gemessenen ADC Wert den "richtigeren" oder man berechnet den Druck und danach dann den kompensierten Druck. Hier spielt es die Rolle, wie man die Auswerelektronik dimensioniert hat. Ich verwende den ATmega8. Daher wird die Kompensierung direkt nach der Messung gemacht und nur das gültige Messergebnis ausgegeben.

Dank Trendlinienfunktion lässt sich die Temperaturabhängigkeit schnell bestimmen: f(T)=0,00603*T, die Steigung ist die Abhängigkeit. Die Verschiebung ist der Offset, der später ermittelt wird.
linearer Zusammenhang Druck vs. Temperatur, ADC Messwert in Druck umgerechn

Um jetzt die einzelnen Messwerte zu korrigieren, müssen diese quasi neu berechnet werden. Hat man aus der ADC Messung den Druck regulär berechnet, so ist von diesem dann der Fehler abzuziehen. Dafür muss man festlegen, für welche Temperatur man den neuen Druck dann berechnen will. Das ist quasi egal, denn die Abhängikeit ist linear aber man darf nur nicht diesem Bereich verlassen. Im Datenblatt des Sensors ist von 25°C die Rede, also nehmen wir diese auch. Als Erstes wird für diese 25°C der Wert aus der Kompensationsformel berechnet oder im Diagramm abgelesen (0,151kPa).
Als Zweites wird dann aus der aktuellen gemessenen Temperatur die Abhängikeit berechnet, also auch in die Formel eingesetzt. Danach wird die Differenz zwischen f(25°) und f(x) gebildet. Als Letztes wird zum ermittelten Druckwert das Ergebnis der Differenz addiert.

P_new = f(25°) - f(x) + P_old


kompensiertes Drucksignal in Grün

Was nicht betrachtet wurde
Die Grafik zur Kompensation wurde aus einem kleinen Datensatz erstellt. Mit diesem ist er bei mir seit mehreren Wochen erfolgreich im Einsatz und hält auch bei größeren Temperaturschwankungen sicher den Messwert konstant oder läßt ihn im Bereich von +/-1 mm schwanken. Durch die vielen Datenauswertungen habe ich die Vermutung und auch das Datenblatt stützt mich darauf, dass der Sensor eine Hysterese besitzt und dass er bei unterschiedlichen Druckwerten anders auf die Temperaturen reagiert. Sprich die Steigung der Kompensationsgeraden evt. unterschiedlich sein kann. Das habe ich aber dank der für mich wirklich guten Ergebnisse nicht weiter verfolgt


Fazit
Der Sensor ist ohne Kompensation für halbwegs genaue Messaufgaben gerade im Outdoor Bereich nicht gut geeignet. Wird aber mittels Mikrocontroller + Temperatursensor dieser Markel behoben, so kann man ihn vertrauensvoll einsetzen. Es betrifft übrigens auch die Sensoren der MPX5010, MPXV5010, MPVZ5010 Reihe.


Links
Application Note AN1636 / AutoZero
Datenblatt MPXV5004
Sensor PCB

 
Kontakt
blumengiesser@posteo.de