Niveau regenwater meten

Het heeft even geduurd, maar mijn bescheiden elektronica/Arduino hobby heeft uiteindelijk geleid tot iets dat ook effectief nut heeft.

Wij hebben hier ten huize een regenwaterput, die helaas een beetje ondergedimensioneerd is. Dat betekent dat ‘ie, in relatief droge periodes, of periodes met uitzonderlijk veel vuile was, soms droogvalt. De regenwaterpomp valt dan uit, en even later de wasmachine, en de spoelbak van de WC wordt niet meer gevuld als je doorspoelt. Dan moet de put worden bijgevuld met leidingwater. Op zich geen ramp, maar het is altijd een heel gedoe: kraan openzetten en wachten tot de regenwaterput vol genoeg is, pomp opnieuw opstarten, wasmachine herstarten. Dat duurt alles bij elkaar snel een halfuur, en niet altijd op ideale momenten (lees: om half één ’s nachts). Een oplossing drong zich op om te kunnen inschatten wanneer de put bijna leeg is.

Na wat diep denkwerk heb ik besloten om het waterniveau te gaan meten met een ultrasone sensor. De installatie daarvan is nog vrij eenvoudig te doen. De sensor hangt bovenaan in de regenwaterput, dus er is weinig acrobatie of geklauter nodig, in tegenstelling tot systemen met vlotters of contactpunten in het water zelf. De meting is normaalgezien ook altijd nauwkeurig genoeg en ongevoelig aan temperatuurschommelingen, corrosie, enzovoort.

Wat doet het?

Een ultrasone sensor meet de afstand tot het waterniveau in de regenwaterput. Binnen in huis hangt een zwart bakje met een groen en een rood LED-lampje. Als de gemeten afstand tot het water minder is dan 70cm, brandt het groene lampje. Is de afstand tussen de 70 en de 80cm, dan branden groen en rood tegelijk. Meer dan 80cm, dan brandt het rode lampje. Afhankelijk van mijn inschatting van het weer en waterverbuik, vul ik de put bij wanneer rood en groen of alleen rood brandt.

Dit doet het

Ten behoeve van anderen die dit ook willen doen, een volledige uiteenzetting van hoe ik dat in elkaar geknutseld heb, mét illustratie.

Zo werkt het

Zo werkt het
Zo werkt het

Wat heb je nodig

  • HC-SR04 Ultrasone sensor
    Je vindt ze goedkoop in China, maar hier zijn ze ook courant te krijgen, zij het wat duurder.
  • CAT5-kabel
    Het leuke aan netwerkkabel is dat je in één kabel acht draden hebt zitten en dus acht verbindingen kan maken. Elke draad heeft ook een andere kleur, dus je kan ze makkelijk juist aansluiten. CAT-5 is in elkaar gevlochten en afgeschermd, waardoor het signaal vrij stabiel is. Deze kabel is ook courant te krijgen in doe-het-zelf-zaken.
  • Een rioolveer
    Om de CAT5-kabel naar de regenwaterput te krijgen, moet die op één of andere manier door de bestaande leidingen die er al liggen. In een ideale wereld zijn dat wachtbuizen, in mijn wereld is dat de buis waar de pompslang al in ligt.
  • Arduino (Uno of Leonardo)
    Je kan in principe ook een Arduino Nano of Mini gebruiken. Als je ‘m in een behuizing wil stoppen, heeft de Uno wel de meeste mogelijkheden.
  • Groene en rode LED
  • Twee weerstanden die bij de LEDs passen
    Om de LEDs niet te overbelasten, sluit je ze normaal aan met een weerstand aan het negatieve contact. Welke weerstand precies, hangt wat af van de LED. Een weerstand van pakweg 200 Ω zou normaal voldoende moeten zijn.
  • Sugru
    Niet goedkoop, maar superhandig. Sugru is een soort kneedbaar siliconen-lijmrubber.
  • Soldeergereedschap
    Soldeerbout, soldeertin en een derde handje, om de uiteindelijke verbindingen met de sensor en de LEDs te maken.
  • Dremel of andere multitool
    Met een boortje en freestools. gaatjes boren is nodig in je Arduino-behuizing, waar dan de LEDs in komen. Frezen is nodig om gaten te maken voor de ‘ogen’ van de sensor en de kabel naar je Arduino in de sensor-behuizing.
  • Tangen
    Je hebt een kniptang en een striptang nodig. De eerste om draadjes door te knippen, de tweede om isolatie te verwijderen
  • Behuizing voor de sensor
    In mijn geval een rond bewaarpotje uit de Delhaize met een schroefdeksel. Maar eender wat is goed, zolang de sensor erin past.
  • Behuizing voor de Arduino
    Kocht ik bij Conrad, en was specifiek bedoeld voor de Arduino Uno. Degelijk spul, aan te raden voor al je Arduino projecten.
  • Stroomvoorziening voor de Arduino
    Deze voeding van Conrad was vrij goedkoop en had ook de perfecte 2.1mm plug om de Arduino van stroom te voorzien.
  • Computer met Arduino software op
    Dit is de eenvoudigste manier om je Arduino te programmeren.
  • USB-kabel om je Arduino op de computer aan te sluiten
    Voor de Arduino UNO heb je een ietwat ouderwetse A/B kabel nodig.
  • 3M Command strips
    Hadden we nog liggen van een Hot Wheels racebaan van de kinderen. Wellicht zijn er ook goedkopere alternatieven.
  • Kabeltjes met Dupont-connectors
    Om tijdelijk je sensor aan te sluiten.
  • Breadboard
    Elk courant verkrijgbaar breadboard is prima.
  • Touw
  • Duct-tape

Stap voor stap

Welke tegenslagen je ook tegenkomt, bedenk: “Met volharding bereikt ook de slak de ark!”

Maak eerst een testsetup van alle aansluitingen, volgens het schema uit de illustratie. Je kan de pinnetjes van de ultrasone sensor aansluiten met de dupont-connectors, de LEDs via het breadboard aansluiten en de juiste verbindingen naar je Arduino maken.

Testsetup met breadboard

Dan is het moment gekomen om je Arduino op je computer aan te sluiten en er de nodige code op te zetten. Daar heb je de Arduino IDE voor nodig.

Arduino IDE
Arduino IDE

De code heb ik niet uit m’n duim gezogen, maar van het internet geplukt en aangepast. Dit is mijn aangepaste versie:

/* HC-SR04 Sensor
 https://www.dealextreme.com/p/hc-sr04-ultrasonic-sensor-distance-measuring-module-133696
 
 This sketch reads a HC-SR04 ultrasonic rangefinder and returns the
 distance to the closest object in range. To do this, it sends a pulse
 to the sensor to initiate a reading, then listens for a pulse 
 to return. The length of the returning pulse is proportional to 
 the distance of the object from the sensor.
 
 The circuit:
 * VCC connection of the sensor attached to +5V
 * GND connection of the sensor attached to ground
 * TRIG connection of the sensor attached to digital pin 2
 * ECHO connection of the sensor attached to digital pin 4


 Original code for Ping))) example was created by David A. Mellis
 Adapted for HC-SR04 by Tautvidas Sipavicius

 This example code is in the public domain.
 */


const int trigPin = 2;
const int echoPin = 4;
const int redPin = 8;
const int greenPin = 9;
int distances[10];
int arraycounter=0;
int avgdist = 0;
int ttldist = 0;
int loopcount = 0;

void setup() {
 // initialize serial communication:
 Serial.begin(9600);
 for (int i=0;i<10;i++) {
 distances[i]=0;
 }
}

void loop()
{
 if (arraycounter>=10){
 arraycounter=0;
 }
 // establish variables for duration of the ping, 
 // and the distance result in inches and centimeters:
 long duration, inches, cm;

 // The sensor is triggered by a HIGH pulse of 10 or more microseconds.
 // Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
 pinMode(trigPin, OUTPUT);
 digitalWrite(trigPin, LOW);
 delayMicroseconds(2);
 digitalWrite(trigPin, HIGH);
 delayMicroseconds(10);
 digitalWrite(trigPin, LOW);

 // Read the signal from the sensor: a HIGH pulse whose
 // duration is the time (in microseconds) from the sending
 // of the ping to the reception of its echo off of an object.
 pinMode(echoPin, INPUT);
 pinMode(redPin,OUTPUT);
 pinMode(greenPin,OUTPUT);
 duration = pulseIn(echoPin, HIGH);

 // convert the time into a distance
 cm = microsecondsToCentimeters(duration);
 distances[arraycounter] = cm;
 ttldist=0;
 for (int i=0;i<10;i++) {
 ttldist+=distances[i];
 }
 avgdist=ttldist/10;
 if (avgdist==0 || avgdist > 200) { 
 if (arraycounter%2==0) {
 digitalWrite(redPin, HIGH);
 } else {
 digitalWrite(redPin, LOW);
 }
 } else if (avgdist>80) {
 digitalWrite(redPin, HIGH);
 digitalWrite(greenPin, LOW);
 } else if (avgdist<=80 && avgdist>70) { 
 digitalWrite(redPin, HIGH);
 digitalWrite(greenPin, HIGH);
 } else {
 digitalWrite(greenPin, HIGH); 
 digitalWrite(redPin, LOW);
 }
 Serial.print(cm);
 Serial.print("cm, ");
 Serial.print(avgdist);
 Serial.print(" gemiddeld");
 Serial.println();
 delay(100);
 arraycounter++;
}

long microsecondsToCentimeters(long microseconds)
{
 // The speed of sound is 340 m/s or 29 microseconds per centimeter.
 // The ping travels out and back, so to find the distance of the
 // object we take half of the distance travelled.
 return microseconds / 29 / 2;
}

Als je deze code uploadt naar je Arduino, zou alles normaalgezien moeten werken.

Definitieve aansluitingen

ultrasound2s

De volgende stap is om de sensor te bevestigen aan de draadjes uit de CAT5-kabel. Nog steeds zonder dat de kabel daadwerkelijk naar de regenwaterput ligt, want je wil natuurlijk eerst weten dat de kabel werkt.

Ik heb daarvoor een aantal kabeltjes met Dupont-connectors middendoor geknipt en de afgeknipte kant vastgesoldeerd aan de draadjes uit de CAT5-kabel. De sensor kan je dan makkelijk in- en uitpluggen in de connectors. Zo kan je testen of het signaal goed door de kabel gaat, en de sensor weer verwijderen als de kabel naar de regenwaterput getrokken moet worden.

De andere kanten van de afgeknipte Dupont-kabeltjes hebben pinnetjes. Die heb ik aan de andere kant aan de CAT5-kabel gesoldeerd om de aansluiting met de Arduino Uno te kunnen maken.

De weerstandjes heb ik ook aan de negatieve polen (de korte draadjes) van de LEDs gesoldeerd en zo rechtstreeks op de Arduino aangesloten.

Kabel trekken

De CAT5-kabel naar de regenwaterput trekken was het meest spannende stuk van deze onderneming.

De eerste stap was het creëren van een trekdraad. Daarvoor heb eerst de rioolveer helemaal tot aan de regenwaterput door de bestaande leiding geduwd, er dan touw aan vastgebonden en de veer teruggetrooken.

Vervolgens heb ik de sensorkant (zonder sensor, uiteraard) van de CAT5-kabel tot een soort speerpunt gemodelleerd met duct-tape, die vervolgens bevestigd aan het uiteinde van het touw binnen in huis, en dan langs de andere kant getrokken. Met souplesse, fingerspitzengefühl, gevloek en wat ge-heen-en-weer is het zo uiteindelijk gelukt om de kabel tot aan de regenwaterput te krijgen.

Maar serieus, wachtbuizen, doen!

Behuizingen

De behuizing voor de sensor is dus een plastic potje met schroefdop. In de bodem heb ik twee gaten uitgefreesd voor de ‘ogen’ van de sensor, en in de zijkant voor de kabel.

Eens alles op z’n plaats, heb ik de doorsteken van de sensor en de kabel afgedicht met Sugro om het vocht en beesten buiten te houden.

10088-03
Arduino-behuizing

De Arduino-behuizing is relatief eenvoudig samen te stellen. Je moet wat opletten dat je alle interne bekabeling erin krijgt en niet per ongeluk kortsluiting maakt, maar voor het overige is het vrij eenvoudig. De CAT5-kabel naar de sensor heb ik door het gat voor de ethernet-aansluiting gestoken.

De sensor in de put hangen is een beetje tricky. Ik heb wat met plankjes geklooid, tot ‘ie mooi het wateroppervlak zag. Maar de ophanging is sterk afhankelijk van de situatie, dus ik ga er hier niet verder op in.

De behuizing van de Arduino heb ik binnenshuis met een 3M-kleefstrip tegen de muur gehangen, zodat de LEDs goed zichtbaar zijn. Uiteraard ook in de buurt van een stopcontact, voor de nodige stroomvoorziening.

Dat hangt nu al een maand of drie, en het werkt nog steeds. Dus al één winter overleefd.

Zo kan het ook anders

Er zijn nog twee andere opties gepasseerd, ook tijdens late-night discussies in de Open Garage, vooraleer ik voor de ultrasone sensor ging. Maar die zijn allemaal gesneuveld op hun nadelen, vooral qua praktische uitwerking:

  • Niveau meten op basis van de geleiding van het water. Dat zou vrij eenvoudig kunnen, en ook zonder Arduino of andere complexe elektronica. Twee contacten op verschillende hoogten in de put, verbonden met een stroombron en een LED. Als het water beide contacten raakt, gaat het lampje branden. Eventueel kunnen er verschillende draden gelegd worden, om zo verschillende waterstanden te kunnen zien.
    Maar: niet eenvoudig om te installeren, omdat je aan de binnenkant van de regenwaterput contactpunten moet hangen, en volgens mij vrij gevoelig aan corrosie en allerhande storingen op het signaal, valse contacten, enzovoort.
  • Niveau meten op basis van luchtdruk. Daarvoor zou een aan één kant afgesloten buis in het water gelaten worden, met bovenaan een druksensor. Naarmate het waterniveau daalt, daalt ook de luchtdruk in de buis. En dat meet je met de druksensor.
    Maar: sterk afhankelijk van hoe luchtdicht de buis is, en de gemeten luchtdruk zal ook variëren naargelang de buitentemperatuur. Voor het overige niet speciaal eenvoudig te installeren, en voor de meting heb je ook een Arduino of iets dergelijks nodig.

En nu?

De volgende logische stap is uiteraard het automatisch bijvullen van de regenwaterput. Dat is niet zonder gevaar, door een fout zou het kunnen dat de kraan met leidingwater urenlang blijft openstaan zonder dat dat nodig is.

Maar technisch is het eenvoudig te realiseren. Ik kan de Arduino van wat extra code voorzien, die de put bijvult als het niveau te laag zakt en dit lage niveau bijvoorbeeld minstens een halfuur duurt.

Om het echt geavanceerd te maken, zou ik er ook regenvoorspellingen kunnen aan hangen. Het volstaat om te weten of het de volgende uren (hard) gaat regenen om te weten of de put moet bijgevuld worden, en hoeveel.