Elektronik_Header_3Lüftersteuerung mit ESP-01

 

Füllstandmesser für eine Zisterne

Im Garten ist eine Zisterne mit ca. 4 m³ Inhalt vergraben, die das Regenwasser von der Dachfläche sammelt. Bisher musste die Füllhöhe und damit der restliche Wasservorrat erraten oder bestenfalls, wenn es denn mal genau sein sollte, nach Öffnen des Schachtdeckels mit dem Metermaß gemessen und ausgerechnet werden.

Mittels Ultraschall ließe sich die Füllhöhe relativ einfach und genau ausmessen, ich vertraue aber den gängigen Ultraschall Transducern nicht, wenn es um den langjährigen Betrieb in feuchter und mit allerlei Getier bevölkerten Umgebung geht. Außerdem liest man gemeinhin, dass mehr oder weniger aufwändige Maßnahmen zu treffen sind, damit Reflexionen keine Probleme verursachen. Ein einigermaßen weites im Wasser stehendes Rohr, in das der Sensor hineinarbeitet, könnte ungerichtete Reflexionen unterbinden.

Sogenannte Time of Flight Sensoren (TOF) arbeiten ebenfalls nach dem Prinzip der Laufzeitmessung, hier nicht mit Ultraschall sondern mit Laser, haben aber neben den oben erwähnten Problemen Feuchte und Bevölkerung noch den Nachteil, dass die Wasseroberfläche bei sauberem Wasser nicht ausreichend reflektiert. Zur Erfassung des Abstands zwischen TOF Sensor und Wasseroberfläche müsste dort also etwas Reflektierendes schwimmen, das irgendwie so geführt wird, dass es vom Taststrahl zuverlässig getroffen wird, also gegebenenfalls auch hierbei durch ein ausreichend weites Rohr.

Eine relativ einfache und störsichere Variante der Ermittlung des Füllstands von Flüssigkeiten ist hingegen die sogenannte Hydrostatische Füllstandmessung. Hierbei wird ein dünnes Rohr senkrecht bis zum Boden in die Flüssigkeit eingetaucht und zur Messung solange mit Druckluft beaufschlagt, bis die Luft am unteren Ende des Rohrs austritt. Der dazu notwendige Druck der Luft wird gemessen und in den Wasserstand umgerechnet. Mit den mechanischen Parametern der Zisterne, dem Durchmesser und der Form, im einfachsten Fall ein Zylinder oder rechteckiger Quader, lässt sich daraus der momentane Inhalt errechnen.


Als Hirn für das Gadget habe ich diesmal einen Digispark ausgewählt. Der hat genug Anschlüsse, den notwendigen AD-Wandler für den aus der Krabbelkiste stammenden Drucksensor vom Typ MPX5050 sowie einen leistungsfähigen Spannungswandler LM78M05, der auch das OLED Display und den Motor der Luftpumpe mit versorgen kann.

Digispark

Digispark

Der im Bild sichtbare USB Stecker dient der Programmierung des Teils, bei entsprechender Einrichtung z.B. über die Arduino IDE. Diese Methode kann hier leider nicht verwendet werden, denn auch in diesem Projekt ist die Beschaltung der für USB verwendeten Pins des AtTiny85 suboptimal, so dass der Digispark seiner Programmierbarkeit per USB beraubt werden muss.

Der einzig nutzbare Pin mit AD-Wandler hat die Digispark eigene Beschaltung mit 68 Ω Serienwiderstand und Z-Diode gegen Masse. Damit ist der Ausgang des Drucksensors eindeutig überfordert, es müsste ein Impedanzwandler zwischengeschaltet werden, was die Verwendung des Digispark als kompakte Lösung ad absurdum führt. Linear wäre die Erfassung des Drucks damit ebenfalls nicht. Die Verwendung eines externen AD-Wandlers habe ich aus gleichem Grund, dem Verlust der Kompaktheit, abgelehnt.

Die beiden Serienwiderstände der USB Pins des Digispark werden also ausgelötet und die Programmierung muss fürderhin per passendem Adapter über den mySmartUSB light erfolgen. Das hat den erfreulichen Nebeneffekt dass durch den Wegfall des USB Bootloaders ca. 2 kB mehr Flashspeicher für das Programm zur Verfügung stehen.

Um noch ein bisschen mehr Platz zu schaffen, habe ich den Zeichengenerator um ungenutzte Sonderzeichen erleichtert. In der Datei “SSD1306_minimal.cpp” wurde alles ab Zeile 186 bis inklusive Zeile 284 auskommentiert.

     28 // a 5x7 font table
     29 const unsigned char BasicFont[] PROGMEM = {
     
    30 0x00, 0x00, 0x00, 0x00, 0x00,  
     31 0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 
        ...
    184 0x3D, 0x40, 0x40, 0x40, 0x3D,
    185 0x3C, 0x24, 0xFF, 0x24, 0x24,

    186
    //0x48, 0x7E, 0x49, 0x43, 0x66,    // nicht benötigte Zeichen auskommentiert
    187 //0x2B, 0x2F, 0xFC, 0x2F, 0x2B,
        ...
    283
    //0x00, 0x3C, 0x3C, 0x3C, 0x3C,
    284 //0x00, 0x00, 0x00, 0x00, 0x00,
    285 };

Tipp
Wer für diesen Zeichensatz auf der Suche nach deutschen Umlauten ist, wird bei Kirk Northrop fündig. Er hat den Zeichensatz mit passenden Kommentaren erweitert. Danke!

Wie schon erwähnt, hat der AtTiny einen Analogwandler an Bord, der mittels interner Referenzspannungsquellen relativ genau Pegel bis ca. 1 m und mit geringerer Auflösung Pegel bis 2,5 m messen kann, immer natürlich im Zusammenhang mit dem vorhandenen Drucksensor MPX5050. Dessen Messbereich geht bis maximal 50 kPa, was 5 m Wassersäule oder 0,5 bar entspricht. Der maximale Pegel in der Zisterne ist 1,30 m, ab dann fließt das Wasser in den Überlauf. Der zu erwartende Druck am Sensor wird sich also etwa zwischen 0,5 kPa (5 cm Wassersäule) und 13 kPa einpendeln. Weniger wird es nicht werden, denn dann springt die Frischwassernachspeisung an, mehr verhindert der Überlauf.

Um die höhere Genauigkeit bei geringem Pegel nicht zu verschenken, schalte ich die Referenz bei ca. 1 m Wasserstand jeweils um. Darunter wird die 1 V Referenz verwendet , darüber die 2,5 V Referenz, natürlich mit einer Hysterese. Um Schwankungen im Druck auszugleichen wird der Sensor für jede Messung 64-mal ausgelesen und die Ergebnisse gemittelt. Das verhindert, dass bei jeder unten aus dem Rohr entweichenden Luftblase eine Druckschwankung erkannt wird.

Damit das OLED Display nicht oder jedenfalls nicht zu schnell abgenutzt wird, wird es nur  während der eigentlichen Messung per Knopfdruck für eine bestimmt Zeit eingeschaltet.

Die Messung wird mit einem Taster eingeleitet, die Pumpe wird eingeschaltet und die Druckmessungen werden gestartet. Während der Messung wird kontinuierlich der gemessene Druck, der sich daraus ergebende Wasserstand sowie der daraus abgeleitete Inhalt der Zisterne auf dem Display ausgegeben. Erhöht sich der Druck nicht mehr weiter , wird die Pumpe angehalten, der ermittelte Wasserstand sowie der Inhalt in Litern auf dem Display eingefroren und der eventuell durch Undichtigkeiten im System wieder sinkende Druck aber weiterhin aktualisiert. Das erfolgt solange der Timeout für den Bildschirmschoner noch nicht abgelaufen ist.

Soweit die geplanten bzw. implementierten Features der Software.


Die elektrische Verbindung zwischen Digispark, Messtechnik, Bedienung und Anzeige erfolgt über eine kleine Platine nach folgendem Schaltplan:

Füllstandmesser Zisterne          (Click auf das Bild für größere Darstellung)

Der MPX5050 hat am Ausgang eine Filterschaltung nach den Vorgaben aus der Application Note AN1646 von NXP erhalten. Zusammen mit dem mehrfachen Oversampling im Programm soll danach die Ausgangsspannung ziemlich störungsfrei sein. Die Appnote habe ich im Netz nirgendwo gefunden, weshalb ich mich bei NXP registrieren musste, bevor ich auf deren Homepage danach suchen durfte.

Das Board ist einseitig entflochten, lässt sich also prima auf der CNC-Fräse herstellen.

Füllstandmesser Zisterne          (Click auf das Bild für Darstellung mit Bauteilangaben)

Fertig gefräst (hier das Bild der Version V1.0, noch ohne Filterschaltung am Ausgang des Sensors MPX5050).

FSM_Zisterne Platine

Widerstände sowie die Sockel für Digispark und OLED Anzeige und der Taster sind TH Bauelemente, werden also von der Oberseite bestückt, der FET, der Drucksensor und die Filterkondensatoren für den Sensor werden in SMD Ausführung auf der Lötseite bestückt.

Die Schaltunterlagen im EAGLE V7 Format für den geneigten Nachbauer.


Die mechanische und hydraulische Verbindung von Sensor, Pumpe und Schlauch zur Zisterne erfolgt mit einem Frästeil aus POM.

Gehäuse der Messeinrichtung

Hervorgehoben in Orange sind die zu bohrenden Luftkanäle. Von rechts wird die Pumpe eingesetzt, oben wird die Platine mit zwei Schrauben befestigt, der Druckanschluss des Sensors passt in das kleinere Loch in der Vertiefung, der Schlauch zur Zisterne wird an der Bohrung am Kopfende angeschlossen werden. Die überzählige Verbindung zur Außenluft wird mit einer Schraube, eventuell mit Dichtung, verschlossen.

Sowohl der Schlauch aus PTFE, 4 mm Außendurchmesser, als auch die Pumpe passen saugend in ein 4 mm Loch, der Sensor passt in ein Loch mit 3 mm Durchmesser. Dichtungen müssen nicht vorgesehen werden, die Förderleistung der Pumpe ist auch mit nur 5 V ausreichend, um die geringen, genaugenommen eigentlich nicht vorhandenen Verluste beim Aufbau des Drucks während der Messung auszugleichen. Ca. 12 mm weit in die Bohrung eingeschoben sitzt der Schlauch ziemlich fest und kann sich nicht mehr von alleine lösen.

Da der Pumpe relativ egal sein dürfte, ob das sie umgebende Gehäuse ihrer runden Außenform folgt, wie oben gezeigt, oder ob der Ausschnitt rechteckig ist, habe ich die Konstruktion dahingehend vereinfacht. Der Fräsvorgang dauert dann nur noch ein Fünftel so lange, da der Ausschnitt ohne die Rundung nicht mehr so fein abgestuft ausgeführt werden muss.

Gehäuse der Messeinrichtung

Damit ich das Konstrukt an die Wand hängen kann, habe ich auf der Rückseite ein schräg ins Material gefrästes Loch vorgesehen, im Bild oben Türkis hervorgehoben.

Der seitliche Schlitz im Gehäuse nimmt den Ansaugstutzen der Pumpe auf und dient gleichzeitig deren Verriegelung im eingebauten Zustand.

Gehäuse gefräst

Die Konstruktionsunterlagen für das Gehäuse im DesignSpark Mechanical V6 Format stelle ich zur Verfügung.


Alle Teile sitzen am Platz, der Lufteinlass verriegelt die Pumpe im Gehäuse.

Fertig aufgebaut

Die M4 Schraube dichtet die mit 3,2 mm gebohrte Verbindungsbohrung zwischen senkrechtem Luftkanal zum Sensor und waagerechtem Luftkanal zur Pumpe ab.

Schraube als Abschluss


Die Verbindung von Schlauch und Rohr in der Zisterne realisiere ich mit zwei Stopfbuchsen, die in einem kleinen Schaltgehäuse eingesetzt werden.

Verbindung Schlauch-Rohr

Die große Stopfbuchse im Boden des Gehäuses benötigt ein 23,8 mm Loch, das ich mit der CNC-Fräse erstellt habe. Die kleine Stopfbuchse wird in ein 10 mm Loch hinein überredet, schnöde erzeugt mit einem Bohrer.

Verbindung Schlauch-Rohr

Der Boden des Gehäuses ist nur ca. 1,5 mm dick, weshalb ich hier die Mutter zur Befestigung verwenden konnte. Die Seitenwände sind 3 mm dick, ebenso lang ist das Gewinde der Stopfbuchse. Hier habe ich also ein eng gepasstes Gewinde geschnitten, so dass auch diese Buchse dicht sitzt und sich nicht lösen kann.

Verbindung Schlauch-Rohr

Das Messrohr ist ein 16 mm durchmessendes PVC Installationsrohr, das auf die passende Länge von ca. 1,5 m abgelängt wird.

Die Stopfbuchsen sind die Guten von Lapp, das Installationsrohr findet sich für kleines Geld im lokalen Baumarkt. Aufpassen, dass das angebotene Rohr auch in die Stopfbuchse passt. Diese Rohre haben hin und wieder erhebliche Toleranzen, nicht immer ist, wo 16 mm drauf steht, auch 16 mm drin.


Der Testaufbau zur Programmentwicklung:

Füllstandmesser Testaufbau

Links die Pumpe, rechts die Platine mit Digispark und OLED Display. Der blaue Klotz ist die provisorische Verbindung zwischen Sensor, Pumpe und Messrohr.

Die Pumpe aus der Nähe:

Luftpumpe

Die Pumpe vom Typ DAYPOWER Luftpumpe LP27-12 stammt aus dem Sortiment von Pollin. Die Nominalspannung beträgt 12 V, aber auch bei 5 V wird ausreichend Druck für die Messung in der Zisterne erzeugt. Selbst mit nur 2 V läuft die Pumpe an und fördert Luft, allerdings ging mein Versuch, eine kleinere Drehzahl per PWM einzustellen in die Hose weil die Innenschaltung des auf dem Digispark sitzenden AtTiny85 offenbar neben dem eigentlichen Ausgang PWM auch den negierten Ausgang PWM beeinflusst, so dass die Ansteuerung des über diesen Pin gesteuerten OLED über I²C Probleme macht. Somit läuft der Pumpenmotor immer gar nicht oder mit 5 V. Mit dieser Spannung zieht der Motor frei laufend ca. 100 mA, unter Last - mit verschlossenem Schlauch - geht der Strom auf etwa 180 mA hoch, bei 40 cm Wassertiefe fließen 110 mA. Das alles liegt sehr schön im Rahmen der Leistungsfähigkeit des auf dem Digispark verbauten Spannungsreglers LM78M05.


Zwei Ansichten der Ausgaben auf dem Display. Der Splashscreen zeigt fixe Parameter des Programms und der Zisterne.

Darstellung OLED

Nach vier Sekunden wird auf die Ausgabe der Messung umgeschaltet.

Darstellung OLED

Die hier angezeigten Parameter werden im Endzustand nicht alle vorhanden sein, der Wert am Sensorausgang und die vom AtTiny ausgelesene Spannung ist später unerheblich. Was von den anderen Angaben erhalten bleiben wird, steht noch in den Sternen ;-)


Inzwischen habe ich den PTFE Schlauch bis in die Zisterne verlegt bekommen und habe das Messrohr mit dem Schlauch verbunden.

Zisterne mit Messrohr

Messrohr

Der Schlauch links ist die Frischwassernachspeisung. Hier wurde darauf geachtet, dass auch bei voller Zisterne kein Regenwasser mit dem Frischwasser in Berührung kommt. Das dünne Rohr mit Knick ist die Saugleitung, da hängt im Keller das Hauswasserwerk dran. Das linke KG-Rohr (KG, Kanal-Grundrohr) ist der Überlauf in die Kanalisation, aus dem rechten KG-Rohr kommt das Wasser aus der Dachrinne. Der schwarze Schlauch zwischen den beiden KG-Rohren führt die drei Fühlerleitungen des Niveauwächters und jetzt auch den Messschlauch des Füllstandmessers aus dem Keller in die Zisterne. Die Jungs haben damals mit einiger Zugabe gearbeitet und die überflüssige Leitung liebevoll mit zwei Schlauchbindern gesichert.

Zisterne - Anschlüsse

Die beiden Stopfbuchsen haben übrigens ihr Versprechen gehalten, die Verschraubungen sind druckdicht und Schlauch und Rohr sitzen auch mechanisch fest.

Vorerst steht das Messrohr frei in der Zisterne und wird nur durch die Schlaufe der Sensorleitungen geschoben senkrecht gehalten. Selbst wenn das Rohr später etwas kippen sollte, ist der Druck im Rohr immer identisch zum Druck außerhalb, es wird also keine Verfälschungen des Messergebnisses geben.


Beim ersten Test mit dem Messgerät wie oben beschrieben hat sich gezeigt, dass ich wohl noch ein wenig an der Mathematik im Digispark arbeiten muss. Bei gemessenem Wasserstand von 40 cm erhalte ich eine Anzeige von 48 cm auf dem Display.

Dessen ungeachtet stellte sich nach Fertigstellung des gefrästen Gehäuses heraus, dass das OLED Display verkehrt herum montiert ist. Tz, tz, Sachen passieren... ;)

Leider hat die verwendete Lib “SSD1306_minimal” keinen Befehl zum Rotieren der Darstellung, also musste ich einen Umweg über die Command Schnittstelle des Display gehen und die Orientierung zu Fuß ändern.

Im setup() wird nach der Initialisierung des Display zusätzlich

 oled.sendCommand (COM_Output_Normal_Scan_Cmd);    // Display um 180°? drehen
 oled.sendCommand (Segment_Normal_map_Cmd);        // (beide Kommandos sind notwendig)

eingefügt, dann wird die Ausgabe auf der Anzeige kopfüber dargestellt. Lässt man sich den Code im Auge zergehen ergibt sich, dass die Lib im Original offensichtlich das Display “kopfüber” initialisiert und man durch die beiden Aufrufe den Normalzustand herstellt. Oder der Autor der Lib hat die beiden Defines vertauscht?


Aber zurück zur Mathematik im Programm bzw. den erlebten Messfehlern...

Nach ein paar Vergleichsmessungen mit dem Gadget im Keller und dem Meterstab in der Zisterne scheint die Abweichung systematisch und mit ca. 8 cm Unterschied immer gleich oder zumindest sehr ähnlich zu sein. Somit könnte ich bei der Berechnung diese fast konstante Abweichung immer berücksichtigen und ich hätte, was ich wollte.

Nun ja, da so ein Sensor im Prinzip aber mehr oder weniger genaue Messwerte liefern sollte, habe ich mich mal ein bisschen weiter in die Thematik eingearbeitet.

Erster Punkt der auffällt, ist die verwendete Spannungsreferenz im AtTiny85. Laut Datenblatt kann die 1,1 V Referenz Spannungen zwischen 1,0 V und 1,2 V erzeugen, wir müssen also mit einer maximalen Abweichung von fast 10 % rechnen. Bei 1 m Wasserstand in der Zisterne sind die 8 cm Abweichung also durchaus als im Rahmen liegend zu bewerten. Nicht gut.

Als zweiter Faktor für Abweichungen bei der Messung von Druckwerten mit dem MPX5050 muss berücksichtigt werden, dass dessen Ausgang direkt von seiner Versorgungsspannung abhängt, man spricht von ratiometrisch. Hat die Versorgungsspannung nicht exakt 5.0 V, ändert sich die Ausgangsspannung des Sensors entsprechend.

Das ist an sich kein Problem, man muss nur bei der Berechnung des Drucks anhand der Ausgangsspannung des Sensors den korrekten Wert der gerade anliegenden Versorgungsspannung anwenden.

Wobei wir beim Problem angekommen sind, die Versorgungsspannung des AtTiny und somit des Sensors zu messen. Bei einem anderen Projekt wird die Versorgungsspannung des Mikrocontrollers als Parameter zum Abschalten eines Raspberry Pi verwendet, prinzipiell ist es also möglich, die Versorgungsspannung auch bei einem AtTiny85 zu messen, obwohl der AtTiny das aufgrund seiner Innenbeschaltung des Analog-Digital-Wandlers nicht vorsieht.

Der Trick ist, die Versorgungsspannung indirekt zu erfassen. Dazu wird die Referenz auf Vcc gesetzt und der AD-Wandlereingang auf BG gestellt - BG - BandGap, das ist die interne Spannungsreferenz mit 1,1 V (±10 %). Man misst also die bekannte Bandgapspannung mit Vcc als Referenz. Der erhaltene Messwert ergibt nach der Formel

    Vcc = 1,1 * 1024 / Messwert [V]

die Versorgungsspannung Vcc in Volt. Man beachte, dass die 10 % Toleranz der Referenz auch für das Messergebnis der Versorgungsspannung gilt. Viel gewonnen haben wir damit also nicht, falls die Abweichungen von der nicht exakten Referenz herrühren.

Dennoch habe ich die Routine zur Erfassung der aktuellen Betriebsspannung ins Programm aufgenommen und ermittle die Betriebsspannung einmalig im setup() des Programms. Das reicht aus, wenn der Füllstandmesser normalerweise ausgeschaltet sein Dasein fristet und nur zur Erfassung des Wasserstands kurz eingeschaltet wird. Läuft die Einrichtung hingegen permanent durch, muss besser auch bei jedem Start einer neuen Messung der aktuelle Wert der Versorgung gemessen werden.

Leider kann die Bandgapspannung nicht am Pin AREF gemessen werden, wir tappen also weiterhin im Dunkeln. Durch Versuch und Irrtum habe ich letztlich dann das Messergebnis der Routine zur Erfassung der Betriebsspannung an die mit dem Multimeter gemessene Spannung angeglichen, so dass die Pegelmessungen wenigstens nicht mehr von einer falsch angenommenen Versorgungsspannung abhängen.

Die hier angewandte Methode der indirekten Messung der Versorgungsspannung des µC wird ausführlich von Scott Daniels auf Provide Your Own... beschrieben (in Englisch) und an vielen anderen Stellen im Netz finden sich mit dem Suchbegriff “readVCC()” Referenzen auf den Code. Eine Abhandlung über das Thema auf Deutsch findet sich auf Ullis Roboterseite.

Bliebe zu erwähnen, Scott Daniels hat eine kleine Unschärfe in seinen Code eingebaut. Die Formel zum Errechnen einer unsymmetrisch, also auf Masse bezogen gemessenen Spannung über den ADC eines Atmel Mikroprozessors ist laut Datenblatt:

ADC Formel

VREF ist in unserem Fall die Versorgungsspannung, VIN die Bandgap Referenzspannung. Löst man diese Formel nach VREF, der gesuchten Versorgungsspannung auf, erhält man:

ADC_Formel2_Atmel

Unsere bekannten Werte und Benennungen in die Formel eingesetzt ergibt das:

ADC_Formel3_Atmel

Der Faktor für die Referenzspannung muss 1024 betragen, auch wenn der maximal erreichbare Digitalwert am Ausgang des AD-Wandlers nur 1023 ist. Jeder Messwert kann ein Vielfaches der Auflösung des AD-Wandlers, also Vielfache von 1/1024 betragen.


Da ich mit den Messungen bzw. den Abweichungen der obigen Version des Füllstandmessers nicht zufrieden bin, hab ich die Version V2 des Messgeräts aufgelegt.

 


Beim Aufruf dieser Funktion werden Daten an Google in USA übermittelt. Neben Ihrer IP-Adresse wird auch die URL der besuchten Seite übertragen.
Besucherzaehler

Besucher seit
25.11.2000