Den Wasserstand meiner Zisterne habe ich lange mit einem 8-Stufen LED überwacht. Die Einteilung in 8 Stufen ist recht grob, pro Stufe werden ca 875 Liter dargestellt.
Um hier eine genauere Messung durchführen zu können, habe ich einen Ultraschall-Sensor in die Zisterne gebaut, der mit einem Raspberry-Pi angesteuert und ausgewertet wird.
Alle 5 Minuten wird ein Ultraschallimpuls losgeschickt und wieder aufgefangen und an der Laufzeit errechnet, wie weit die Wasseroberfläche vom Sensor entfernt ist.
Die Messung schwankt mit ± 1,5 cm, ab und zu ist auch ein ganz krummer Wert dabei, daher messe ich in kurzem Abstand 10 mal und bilde dann den Mittelwert.
Die gemssenen Werte schreibe ich in eine Round-Robin-Database und erzeuge daraus Grafiken:
Verwendete Hardware:
Raspberry PI 2 mit Gehäuse, Netzteil und SD-Karte |
Ultraschallsensor | oder Ultraschallsensor wasserdicht | Kabel | Schlagschrauber |
Gehäuse für Ultraschallsensor
Werkzeug:
Lötkolben
Schraubendreher für Lüsterklemmen
Schlagschrauber
Verwendete Bookware:
In ein schwarzes Plastikgehäuse habe ich Löcher für den Ultraschallsensor gefräst, den Sensor eingepasst und daran ein übrig gebliebenes 4 x 2 Cat 7 Netzwerkkabel angelötet (Lötfett leistet hier wunderbare Dienste!)
Dieses habe ich dann mit der Makita an die Innenwand des Zisternenschachts getackert 🙂
Das Kabel wird durch das Rohr bis nach außen geführt, um dann gleich wieder im Lichtschacht zu verschwinden.
Von dort geht es weiter durch den Fensterrahmen in den Heizungskeller, wo der Raspberry sitzt und das ganze ansteuert.
Software:
Es läuft per cronjob alle 5 Minuten ein Python-Script, das 10 x die Entfernung zur Wasseroberfläche misst, den Mittelwert bildet und per ftp auf die Homepage schiebt. Dort wird sie durch ein WordPress Plugin dargestellt:
#!/usr/bin/python # coding=utf8 import time import ftplib import RPi.GPIO as GPIO #from __future__ import print_function GPIO.setmode(GPIO.BOARD) trig=11 echo=13 GPIO.setup(echo,GPIO.IN) GPIO.setup(trig,GPIO.OUT) voll=50 # 50 cm von Sensor bis Wasseroberfläche = voll leer=230 # 230 cm von Sensor bis Wasseroberfläche= leer entfernung=0 gesamt=0 liter_pro_cm=3.1415*112.5*112.5*1/1000 #pi * radius * radius * 1cm /1000 sonst milliliter print "Liter pro cm: ",liter_pro_cm for i in range(0,10): GPIO.output(trig,True) time.sleep(0.00001) GPIO.output(trig,False) while GPIO.input(echo) == 0: pass start=time.time(); while GPIO.input(echo) == 1: pass ende = time.time(); entfernung=((ende - start) * 34300) / 2 print entfernung gesamt=gesamt+entfernung time.sleep(0.75) mittelwert=gesamt/10 volumen=(leer-mittelwert)*liter_pro_cm print "Entfernung: ", mittelwert, " cm" print "Volumen: ", volumen print "- - - - - - - - - - - - - - - - - - - - - " f1=open('/home/pi/entfernung.txt','w') print >> f1, '%d' % (mittelwert) f1.close() f2=open('/home/pi/volumen.txt','w') print >> f2, '%d' %(volumen) f2.close() f1l=open('/home/pi/entfernung.txt','r') f2l=open('/home/pi/volumen.txt','r') serverftp = ftplib.FTP('ftp.server.de', 'user', 'pass') serverftp.storbinary('Stor entfernung.txt', f1l) serverftp.storbinary('Stor volumen.txt', f2l) serverftp.quit() f1l.close() f2l.close()