automatisch regenwaterniveau meten met Arduino

Plotselinge ingave van het moment…

ALS de wasmachine (later) zou opspringen (geprogrammeerd om in de avond/nacht te draaien op nachttarief) en er (net) niet genoeg water in de regenwaterput zou zijn… dan zou de machine zich “half” vol water vullen en dan gewoon stilvallen. De was zou half-doorweekt een nachtje liggen gisten in water en de was zou zeker en vast niet gedaan zijn…

DUS… tijd voor een oplossing van een groot vraagstuk… hoeveel liter water zit er nog in de put (en dus… kan ik nog rap een machine opzetten/de tuin sproeien/…).
Antwoord: JA :-).

Dat kan mechanisch met een vlotter, lang koort, een stokje 2 gaten in de put en veel geduld. Met garantie dat dit spaak loopt na een paar weken/maanden/jaar. :-).

of een kant-en-klare oplossing van 200+ eur… die we zeker niet gaan kopen.

Maar blijkbaar kan het ook met een ultrasone-meter, een arduino-bordje en 2 ledjes.

 

IMG_20160811_223253

Deze blog  was mijn inspiratie voor m’n aankopen, maar ook het idee een LCD aansluiten en zichtbaar te lezen hoeveel Liter/cm er nog in de put was leek me leuk/een uitdaging.

 

 

Fase 1:

Ultrasone metertje, code op de Arduino, led-lichtje laten knipperen per cm afstand tot een object (gsm Evelyne)

IMG_20160808_220828

Dankzij bovenstaande blogpost, 2 cola’s en 2 slapende kindjes werkte dit op 1 uurtje tijd… dat gaf goeie moed voor de LCD die nog moest aankomen.

 

Voor de LCD-weergave waren er een paar struikelblokken. Een put opmeten in cm (bijvoorbeeld 2m = 200cm) is een slecht idee… aangezien het volume dan in cm³ staan wat een ENORM groot getal kan worden. (voor de programmeurs is dit verstaanbaar:) Dit getal past NIET meer in een integer. afronden is ook een slecht idee, want 1,5m wordt dan plots 2m :-)… wat dus in volume effe een verschil van 2000L water kan betekenen :-). Deels met komma-getalletjes werken is dus de boodschap!

code arduino

 

IMG_20160811_221044

 

M’n Arduino-java-progammatie ligt nog héél ver onder het stof, vandaar de combi Engels/Nederlands in de code, maar het werkt. Struikelblok 2 van de LCD is de classe van “Wire” die niet volledig werkt blijkbaar voor m’n lcd. Importeren/downloaden van bijkomende klasses was noodzakelijk.

Fase2:

het resultaat met een refresh-rate van elke seconde (goed voor de statestieken 🙂 ):

IMG_20160811_220949

Ongetwijfeld een leuke toevoeging voor TOM(Techniek-Op-Maat) of een echte doe het zelver. Maar ook handig aangezien er niet meer nodig is als een klein plaatsje aan de muur + een stopcontact extra. De ultra-sone kan met een kabeltje in de put gebracht worden. De kabel zelf kan tot 10m lang zijn.

 

 

 

 

 

 

 

 

Toevoegingen:

Flikkeren van de display indien er minder als X-liter water overblijft in de put (en er dus geen wasmachine meer opgezet moet worden).

In de loop van de Arduino zit volgende test:

 if ((maxhoogte - avgdist)<minhoogte){blinkscreen(3);}

Waarna de onderstaande functie uitgevoerd wordt. Vervolgens wordt (zoals altijd) het aantal resterende cm en liter weergegeven.


void blinkscreen(int amount){
  for(int i = 0; i< amount; i++)
  {
    lcd.backlight();
    delay(250);
    lcd.noBacklight();
    delay(250);
  }
  lcd.backlight(); // finish with backlight on  
} 

Todo: En een mooi doosje maken om het geheel in te huisvesten (en aan de muur te bevestigen).

13 thoughts on “automatisch regenwaterniveau meten met Arduino”

  1. Omdat ik ook op zoek was naar een oplossing om de hoogte van het water te meten heb ik ook de nodige onderdeeltjes besteld. Programmatie en bekabeling zie ik zitten, enige waar ik me zorgen over maak is de corrosie van de ultrasone module. Ik zou deze bovenaan de put installeren… Heb jij iets gedaan om roestvorming aan deze module te vermijden?
    Alvast bedankt voor je antwoord.

    1. Dag Frederik…. ik heb wat last van spambots gehad en heb daarom je reactie (gedurende al die tijd) niet opgemerkt. Kwa corrosie heb ik de ultrasone meter in een potje geplaatst (zie laatste post ivm de arduino-regenwater). deze zit nu ineen gel. natuurlijk zijn de 2 “vliegenogen” niet beschermt en waarschijnlijk binnenkort vol roest door de vochtige omgeving. Aangezien ik m’n componentjes bij aliexpress bestel kost me dat binnen x-jaar een euro of 2 om opnieuw 2 stuks te laten overkomen.
      Op diverse blogs heb ik ook al vanalles gelezen ivm haarlak en dergelijke, maar daar zie ik het nut niet van in 🙂

    1. hey Argon, bedankt voor de feedback… Voorlopig werkt alles nog prima, dus er is nog geen “nood” om alternatieven te gaan bekijken. Maar het is zeker en vast een goed idee om zulk een detector te zetten.

  2. Beste,

    Ik ben volledig nieuw in Arduino, maar kwam ermee in contact aangezien ik een eenvoudige oplossing zocht voor het meten van het niveau van de regenput. Ik heb de oorspronkelijke code gevonden op automaton en snap deze intussen volledig aangezien ik van vroeger nog wel enige programmeerervaring heb (met een dikke laag stof erop), maar hoe integreer je daar dan extra het weergeven op een LCD display in? Bent u eventueel bereid uw code van dit volledige project te delen, zodat ik deze kan bestuderen? Ik hoef geen automatische bijvulling van de put, maar een basisindicatie aan de hand van de LEDS is wel nuttig + het LCD scherm met de exacte gegevens eveneens.

  3. hallo @smarivoet,
    Is het nog mogelijk om een copy van de code te bekomen via mail.
    Ben ook bezig met gelijkaardig project maar als leek blijkbaar nog veel te leren.
    Alvast bedankt

    1. dag Serge, met een copy -past ga je niks leren… en geen idee of ik uberhaupt een degelijk programeur ben :-). Ik weet dat er anderen 100 keer beter en sneller in zijn. Stuur me even een mailtje, dan zien we wel van daar en wat je al hebt.

  4. Beste,
    Ik weet niet of dit topic nog alive is , maar ik had eens een vraag over uw code die de hoeveelheid liters van de tank weergeeft . Ik heb al een werkend systeem kunnen maken dat perfect werkt hoeveel % water er nog in de tank zit maar ik zou uw code om de hoeveelheid liters te kunnen zien hiermee in willen verwerken maar dit krijg ik niet direct in orde🤔

    1. Hey, tuurlijk, alles is “live”… ik zou enkel eens moeten sleutelen aan de notificaties, want ik krijg geen melding bij reacties :-).
      Mijn put is een rechthoek, dus ik kom op volgende functie.
      int getLiter(double h, double b, double l){
      //calculation of volume: l*b*h ==> m³
      //1m³ = 1000 Liter
      double vol = l*b*h;
      return (int)(vol*1000);
      }
      als je put een cirkel is dan zal je R*R*pi moeten doen en spelen met de double “h”.

      Let wel dat je met doubles werkt, anders vlieg je in de problemen met het aantal cijfertjes… dan krijg je een “overflow” in de code (te groot getal in de variabele).

      In m’n loop-functie doe ik volgende:

      lcd.print(“L water: “);
      //attention: avgdist in cm, breedte in M and lengte in M
      int liters = getLiter((double)(maxhoogte-avgdist)/100,breedte, lengte);
      lcd.print(liters);

          1. hierbij de code, zoals je ziet is het wat vanalles bij elkaar 😀

            #include
            #define trigPin 8
            #define echoPin 9
            #include
            #define RELAY1 7
            #define RELAY2 6

            LiquidCrystal_I2C lcd(0x27, 16, 2);

            void setup(){
            int duration,distance,percentage,heightTank;
            Serial.begin (9600);
            pinMode(trigPin,OUTPUT);
            pinMode(echoPin,INPUT);
            lcd.begin();
            lcd.print(“regenwater”);
            Serial.begin(9600);
            pinMode(RELAY1, OUTPUT);
            Serial.begin(9600);
            pinMode(RELAY2, OUTPUT);
            }

            void loop(){
            int duration,distance,percentage,heightTank,deviation,litersvar;
            //volgende lijnen aanpassen in functie van de tank.
            //heighttank is de max. level van het water.
            //deviation is het verschil hoe hoog de sensor boven het max. waterniveau staat.
            heightTank=138; //
            deviation=15; //
            R=2; // straal in meter
            pi=3,1415 ;
            int getLiter(double R, double pi,){
            //calculation of volume:R*R*pi ==> m³
            //1m³ = 1000 Liter
            double vol = R*R*pi;
            return (int)(vol*1000);

            digitalWrite(trigPin,HIGH);
            delayMicroseconds(1000);
            digitalWrite(trigPin,LOW);
            duration=pulseIn(echoPin,HIGH);
            distance=(duration/2)/29.1;
            percentage=100-(((distance-deviation)*100)/heightTank);
            litersvar=R*R*pi;
            Serial.println(distance);
            Serial.println(percentage);
            Serial.println(litersvar);
            lcd.clear();
            lcd.setCursor(0,0);
            lcd.print(“Liters: “);
            lcd.print(litersvar);
            //lcd.print(distance);
            //lcd.print(” cm”);
            lcd.setCursor(0,1);
            lcd.print(“level: “);
            lcd.print(percentage);
            lcd.print(” %”);
            delay(60000);

            digitalWrite(RELAY1,0); // Turns ON Relays 1
            Serial.println(“25%-100%”);

            digitalWrite(RELAY1,1); // Turns Relay Off
            Serial.println(“25%-0%”);

            digitalWrite(RELAY2,0); // Turns ON Relays 1
            Serial.println(“25%-0%”);

            digitalWrite(RELAY2,1); // Turns Relay Off
            Serial.println(“25%-100%”);

            }

  5. Ziet er goed uit hé… 1 dingetje snapte ik niet. De reden waarom je je integers opnieuw op 0 zet bij elke loop en dan terug initialiseert (dus bijvoorbeeld PI en R kan je beter in de setup initialiseren, die kan je dan overal en altijd gebruiken en veranderen dan toch nooit).
    Om alles dan op 2 lijntjes op de display te krijgen had ik in een ander programmaatje write-Eerstelijn(txt) en write-Tweedelijn(txt) functies gemaakt. Dat maakt het nog overzichtelijker.
    Hier is het nog in kinderschoenen:
    ==> 3maal knipperen van het scherm indien de minimumstand van water niet bereikt is (dus put is ‘te leeg’ om proper een wasmachine te laten draaien)
    if ((maxhoogte – avgdist)<minhoogte){
    blinkscreen(3);
    }

    dan elke keer lcd leegmaken en de twee lijntjes schrijven:
    lcd.clear();
    lcd.setCursor(0,0); //Start at character 0 on line 0
    lcd.print("cm water: ");
    lcd.print(maxhoogte – avgdist);
    lcd.setCursor(0,1);
    lcd.print("L water: ");
    //attention: avgdist in cm, breedte in M and lengte in M
    int liters = getLiter((double)(maxhoogte-avgdist)/100,breedte, lengte);
    lcd.print(liters);

    delay(1000);
    arraycounter++;

    je probleem om er ook nog liters bij te krijgen: je hebt maar 2 lijnen 😉 dus daar ga je moeten kiezen in cm, percent of liters.

    het grootste probleem dat ik zie is je volume-berekening ;-): R*R*PI is juist voor de oppervlakte van je regenwaterput-bodem… nu moet je nog * hoogte doen en je bent er. zet daarbij wel alles in cm en vermijd komma-getallen.

    (en verdorie… die settings van notifications komen maar niet goed 🙂 )

Leave a Reply

Your email address will not be published.