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 1023 ist. Jeder Messwert kann ein Vielfaches der Auflösung des AD-Wandlers, also Vielfache von 1/1024 betragen.

 


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