Meet het niveau van je regenwaterput

Meet het niveau van je regenwaterput

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:

Schematische voorstelling:

Dit is mijn test opstelling:

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

Uitvoeren van de flask app:
sudo /usr/bin/python /home/pi/share/sensor/sensorapp.py
Ga met je smartphone of laptop naar volgende URL om de meting te zien:
http://[IP ADRES RASPBERRY PI]:5000/api/sensor
Om het IP adres van je raspberry pi te weten, kun je volgend commando gebruiken:
ifconfig
Je moet dan ergens een stukje zoals hieronder te zien krijgen waarbij je let op wat er bij ‘eth0’ staat als je raspberry pi via de kabel verbonden is met je netwerk. Is je raspberry pi verbonden via wifi, kijk dan naar wat er staat bij ‘wlan0’:
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>
In dit geval is het ip adres 192.168.0.201.

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.

Je kunt deze user interface nu testen door de python applicatie opnieuw uit te voeren:
sudo /usr/bin/python /home/pi/share/sensor/sensorapp.py
Ga met je smartphone of laptop naar volgende URL om de meting te zien:
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?

Bronnen

15 gedachten over “ Meet het niveau van je regenwaterput”

  1. 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…

    1. 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.

  2. 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.

    1. 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.

    1. 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.

      1. 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.

  3. 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?

  4. 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.

    1. 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.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *