Om niet plots zonder regenwater te vallen, is het nuttig om te weten wanneer je regenwaterput bijna leeg is. En dit zonder telkens het deksel op te tillen.
Om het niveau te bepalen, maken we gebruik van een HC-SR04 ultrasone sensor. Deze sensor bepaalt door middel van geluidsgolven de afstand tot het water.
Nodig
- Raspberry Pi. Ik gebruik een raspberry pi 3.
- HC-SR04 ultrasone sensor
- Breadboard
- Een aantal jumper kabels (met Dupont connectoren)
- Een weerstand van 1kΩ en een weerstand van 2,2kΩ
Hardware
Connecteer alles als volgt:
Detail van de raspberry pi aansluiting:
Detail van de HC-SR04 sensor aansluiting:
Software
Door onderstaande stappen te volgen, maak je een applicatie die je kunt aanspreken vanuit je browser en waarbij je het resultaat van de meting te zien krijgt. Deze applicatie start automatisch op bij het opstarten van de raspberry pi en biedt de mogelijkheid om meerdere sensoren en andere functies te integreren.
Zorg dat je een sd-kaartje met een Raspbian versie hebt voor gebruik met je raspberry pi. Heb je dit nog niet? Download dan Raspberry Pi OS (de lite versie volstaat) en plaats dit met bvb. Win32DiskImager op de sd-kaart.
De broncode van de bestanden die je hieronder moet aanmaken, vind je ook terug op GitHub.
1. Installeer flask
sudo pip install flask
Krijg je de melding ‘pip command not found’, installeer dan eerst nog pip. Je doet dit met volgend commando:
sudo apt-get install python-pip
2. Maak een Python flask applicatie aan
Maak een directory share aan. Het is aan te raden om een algemene directory aan te maken voor als je straks meerdere raspberry pi projecten zou maken.
mkdir /home/pi/share
Maak een subdirectory sensor aan:
mkdir /home/pi/share/sensor
Verander de eigenaar van deze directory:
sudo chown www-data /home/pi/share/sensor
Maak een bestand sensor.py aan:
sudo nano /home/pi/share/sensor/sensor.py
Voeg de volgende code toe aan dit bestand:
import RPi.GPIO as GPIO import time def measure(): GPIO.setmode(GPIO.BCM) TRIG = 23 ECHO = 24 GPIO.setup(TRIG,GPIO.OUT) GPIO.setup(ECHO,GPIO.IN) GPIO.output(TRIG, False) time.sleep(2) GPIO.output(TRIG, True) time.sleep(0.00001) GPIO.output(TRIG, False) while GPIO.input(ECHO)==0: pulse_start = time.time() while GPIO.input(ECHO)==1: pulse_end = time.time() pulse_duration = pulse_end - pulse_start distance = pulse_duration * 17150 distance = round(distance, 2) GPIO.cleanup() return '{"param":' + str(distance) +'}'
Bewaar het bestand door op Ctrl-X te klikken en dan Y in te tikken.
Maak nu een bestand sensorapp.py aan:
sudo nano /home/pi/share/sensor/sensorapp.py
Voeg de volgende code toe aan dit bestand:
from flask import Flask, render_template from sensor import measure app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" @app.route('/api/sensor/') def sensor(): return measure() if __name__ == '__main__': app.run(host='0.0.0.0')
Bewaar dit bestand met Ctrl-X en kies Y.
3. Testen flask app
sudo /usr/bin/python /home/pi/share/sensor/sensorapp.py
http://[IP ADRES RASPBERRY PI]:5000/api/sensor
ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 192.168.0.201 netmask 255.255.255.0 broadcast 192.168.0.255 inet6 fe80::6a35:cba8:2f53:232d prefixlen 64 scopeid 0x20<link>
4. User interface
Als alles goed verlopen is, zie je nu de ruwe gegevens. Je kunt een html pagina aanmaken om alles wat beter (en leesbaarder op een smartphone) voor te stellen.
Maak een directory templates aan:
sudo mkdir /home/pi/share/sensor/templates
Maak een bestand index.html aan:
sudo nano /home/pi/share/sensor/templates/index.html
En voeg volgende code toe aan dit bestand:
<html> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <head> <title>Niveau meting</title> </head> <body> <script src="http://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.8.2.min.js"></script> <script src="http://ajax.aspnetcdn.com/ajax/knockout/knockout-2.2.1.js"></script> <h1>Meting sensor</h1> <p>Meting: <span class="lead" data-bind="text: hcsr04"></span> cm</p> </body> <script type="text/javascript"> var SensorViewModel = function() { var self = this; self.hcsr04 = ko.observable(""); }; $(function() { var viewModel = new SensorViewModel(); jQuery.getJSON("/api/sensor", function (data) { viewModel.hcsr04(Math.round(data.param * 100) / 100); }); ko.applyBindings(viewModel); }); </script> </html>
Bewaar dit bestand met Ctrl-X en kies Y.
Pas het bestand sensorapp.py aan (dit bestand heb je al aangemaakt in stap 2):
sudo nano /home/pi/share/sensor/sensorapp.py
Voeg dit stukje toe onder het blokje @app.route(‘/api/sensor/’):
@app.route('/stand/') def stand(name=None): return render_template('index.html', name=name)
Je bekomt dus dit:
from flask import Flask, render_template from sensor import measure app = Flask(__name__) @app.route("/") def hello(): return "Hello World!" @app.route('/api/sensor/') def sensor(): return measure() @app.route('/stand/') def stand(name=None): return render_template('index.html', name=name) if __name__ == '__main__': app.run(host='0.0.0.0')
Bewaar dit bestand met Ctrl-X en kies Y.
sudo /usr/bin/python /home/pi/share/sensor/sensorapp.py
http://[IP ADRES RASPBERRY PI]:5000/stand
Nu krijg je je eigen gemaakte html pagina te zien. Wil je de lay-out optimaliseren, volstaat het om de html pagina index.html verder aan te passen.
5. Automatisch opstarten
Het volgende wat handig is, is dat de python applicatie automatisch opstart bij het opstarten van je raspberry pi. Om dit te realiseren, kun je gebruik maken van een NGINX webserver en een uWSGI server.
Je installeert de NGINX webserver met volgend commando:
sudo apt-get install nginx
Vervolgens start je de nginx webserver:
sudo service nginx start
Nu installeer je uWSGI:
sudo apt-get install build-essential python-dev
en hierna:
sudo pip install uwsgi
Maak een bestand uwsgi_config.ini aan:
sudo nano /home/pi/share/sensor/uwsgi_config.ini
Voeg de volgende code toe aan dit bestand:
[uwsgi] http= :9090 chdir = /home/pi/share/sensor module = sensorapp:app master = true processes = 1 threads = 2 uid = www-data gid = www-data socket = /tmp/sensorapp.sock chmod-socket = 664 vacuum = true die-on-term = true
Het nummer dat na http= staat is het poortnummer waarop de applicatie straks bereikbaar zal zijn.
Bewaar dit bestand met Ctrl-X en kies Y.
Pas de eigenaar aan van je directory naar gebruiker www-data:
sudo chown www-data /home/pi/share/sensor
Geef de www-data gebruiker toegang op de raspberry pi GPIO pinnen:
sudo adduser www-data gpio
Pas het bestand /etc/rc.local aan om de python applicatie automatisch op te starten:
sudo nano /etc/rc.local
Voeg volgend lijntje code toe vóór de lijn met ‘exit 0‘:
/usr/local/bin/uwsgi --ini /home/pi/share/sensor/uwsgi_config.ini --uid www-data --gid www-data --daemonize /var/log/uwsgi.log
Start nu je raspberry pi opnieuw op en ga met je smartphone of laptop naar volgende URL om de meting te zien:
http://[IP ADRES RASPBERRY PI]:9090/stand
Volgende stappen
Hieronder een aantal ideetjes van wat je nu verder kunt doen.
- Een behuizing kopen of zelf maken voor zowel de Raspberry Pi als de HC-SR04 sensor.
- Extra sensoren toevoegen. Zo zou je bijvoorbeeld een temperatuursensor kunnen toevoegen.
- Automatisch je regenwaterput bijvullen als het niveau te laag komt.
- Een andere toepassing: de afstand meten tussen je auto en de garagemuur. Handig als je geen parkeersensoren hebt! Of een detectie of je auto al dan niet in de garage staat. Zo zijn er tal van andere toepassingen mogelijk. Waarvoor zou jij het gebruiken?
Supertoffe toepassing!
Als er wat tijd over is zal ik die zeker eens testen!
Echter zou ik nooit een elektronische sensor of eender wat met elektronica in m’n stookolieketel plaatsen…
Klopt! Het is in theorie mogelijk om je stookolieniveau hiermee te meten, maar niet aan te raden omwille van de veiligheid.
Er zijn echter talloze andere toepassingen mogelijk.
De testopstelling werkt in ieder geval feilloos! Bedankt om dit te delen!
Heb je ook nog een foto van de finale opstelling? Of is dit bij een test opstelling gebleven?
PS: het chown commando in stap 2 (“sudo chown www-data /home/pi/share/sensor”) zorgt bij mij voor problemen in de volgende stap.
Voorlopig is het bij een testopstelling gebleven. Ik plan wel om dit nog definitief te installeren.
Kun je misschien eens doorgeven wat het precieze probleem was na het uitvoeren van het chown commando? Want bij mij lukt dit wel.
stap 4 vraagt een sudo command ervoor
sudo mkdir /home/pi/share/sensor/templates
Ik heb het aangepast in het artikel!
mooie handleiding, heb hem als rode draad gebruikt met enkele uitbreidingen voor onze waterput uitlezing.
Heb er een LCD 4*20 opgemonteerd die aangestuurd is via I2C
https://imgur.com/a/soliI7B
en een case 3D geprint waar alles mooi in past
https://www.stlfinder.com/model/hifi-pi-cEDTnFaT/2901239
Knappe uitbreiding!
Bestaat de mogelijkheid dat de Raspberry een analoog 0 – 20mA uitgang levert?
De GPIO pinnen op de raspberry pi zijn digitale inputs en outputs. Standaard kan dat dus niet. Misschien is het wel mogelijk met extra hardware.
Als er 1 digitale output een puls breedte gemoduleerd signaal geeft ifv het niveau,
volstaat een weerstand en een condensator (laagdoorlaatfilter) om een analoog signaal te produceren.
Mijn kennis van de raspberry is echter niet voldoende om een PWM output ifv het niveau te programmeren op een output.
Ik heb net een regenwaterput laten plaatsen en zou dit ook willen opzetten. Ik vraag me echter af of die sensor lang mee gaat in een vochtige omgeving. Zijn er ook sensoren die vochtbestendig zijn?
Er bestaat een sensor die gelijkaardig werkt als de HC-SR04 maar die vochtbestendig is: de JSN-SR04T (https://opencircuit.be/Product/JSN-SR04T-ultrasonische-sensor-waterdicht-v2.0).
Laat zeker je ervaring hiermee weten als je dit uittest!
Is dit volledig draadloos?
Zodat ik binnen op een display of via een webbrowser/app kan zien wat mijn niveau is.
Ik zit namelijk met een regenput waar ik het niveau van wil weten maar kan er geen nieuwe kabel naar toe trekken.
Er is wel stroom voorzien in de put.
De verbinding tussen de sensor en de raspberry pi is bekabeld. De raspberry pi kan via wifi op je interne netwerk gekoppeld worden.
In zo’n opstelling moet zowel de sensor als de raspberry pi dan in je regenput komen en probleem hierbij zal zijn om dit goed te laten werken in een vochtige omgeving.