De Programmeerbare Plantenkas: Zelf Een Grafiet Weerstand Bodemvochtigheidssensor Maken, Aansluiten En Programmeren Om De Vochtigheid Van De Grond Te Meten

DE PROGRAMMEERBARE PLANTENKAS //  ZELF EEN GRAFIET WEERSTAND BODEMVOCHTIGHEIDSSENSOR MAKEN, AANSLUITEN EN PROGRAMMEREN OM DE VOCHTIGHEID VAN DE GROND TE METEN

DE PROGRAMMEERBARE PLANTENKAS: ZELF EEN GRAFIET WEERSTAND BODEMVOCHTIGHEIDSSENSOR MAKEN, AANSLUITEN EN PROGRAMMEREN OM DE VOCHTIGHEID VAN DE GROND TE METEN

In deze tutorial laten we zien hoe je zelf een grafiet weerstand bodemvochtigheidssensor maakt, aansluit en programmeert om de vochtigheid van grond te meten met een Arduino microcontroller of een andere microcontroller.

Aansluiten

Het maken van een grafieten weerstand bodemvochtigheidssensor gebeurt in twee stappen. Eerst prepareer je de grafieten elektroden en zorg je ervoor dat deze goed op hun plek blijven zitten door ze gedeeltelijk in epoxy hars te gieten. Daarna maak je de bedrading gereed, zodat de sensor eenvoudig op een microcontroller aangesloten kan worden.

Elektroden bevestigen

De basis van de zelf gemaakte weerstand bodemvochtigheidssensor bestaat uit twee grafieten staven die als elektroden worden gebruikt. De staven in dit voorbeeld zijn ongeveer 6 centimeter lang en hebben een doorsneden van 8 millimeter. Grafiet is de stof die bijvoorbeeld in potloden zit. Het bestaat uit koolstofdeeltjes die zo aan elkaar vast zitten dat grafiet elektriciteit kan geleiden. Het voordeel van grafiet ten opzichte van metaal is dat grafiet minder gevoelig is voor corrosie. Hierdoor gaan weerstand vochtigheidssensoren die gemaakt zijn met grafieten elektroden langer mee dan sensoren die gemaakt zijn met metalen elektroden.

In de zelf gemaakte vochtigheidssensor mogen de twee grafieten staven elkaar niet aanraken. Om dit voor elkaar te krijgen heb ik de staven gedeeltelijk in epoxy hars gegoten. Ik heb voor epoxy hars gekozen, omdat dit goedkoop is, een elektrische isolator is, redelijk goed bestand tegen de zouten en zuren in de grond is, goed tegen buitentemperaturen kan, en stevig is.

Voordat de grafieten staven in epoxy hars gegoten kunnen worden, moet er eerst aan elke staaf een draad bevestigd worden. Grafiet kun je niet solderen. In plaats daarvan heb ik ongeveer 2 centimeter van de draad afgestript en dit om het uiteinde van de staaf gerold. Dit heb ik vervolgens stevig vast gezet door er Tesa Iso tape over te plakken. Op die manier maakt het draad goed contact met de grafieten staaf, en kan de epoxy hars later niet tussen het draad en de staaf komen.

Graphite moisture sensor, grafiet vochtsensor
Wikkel een stuk draad, waarvan de isolatie is afgestript, om elke grafieten staaf heen.
Grafieten elektrode, bodemvochtigheidssensor
Wikkel isolatie tape stevig rondom het stuk draad dat om de grafieten staaf is gewikkeld.

Om te voorkomen dat de staven tijdens het drogen van de epoxy hars verschuiven en tegen elkaar aan komen, heb ik eerst een malletje van karton gemaakt om de staven op hun plek te houden. Dit was simpelweg een stukje karton met twee gaatjes waar de twee staven doorheen pasten en een inkeping om het draad op de juiste plek te houden.

Bodemvochtigheidssensor, moisture sensor
Om de grafieten staven tijdens het drogen van de epoxy hars op hun plek te houden, kun je een eenvoudig malletje van wat karton maken.
Diy bodemvochtigheidssensor, irrigatie sensor
Een kleine inkeping in het karton zorgt ervoor dat de kabel later mooi uit de epoxy hars steekt.

Om een vorm van epoxy hars te maken heb je en siliconen vorm nodig. Hiervoor kun je een oude siliconen bakvorm voor kleine cakejes gebruiken, of een speciale epoxy vorm voor gebruiken. Voor dit voorbeeld heb ik een mal voor een siliconen vierkant van 5 x 5 x 5 centimeter gebruikt, die ik tot ongeveer de helft gevuld heb.

Zodra beide staven voorzien zijn van een draad dat stevig vast gezet is met tape en de staven in malletje om de staven op hun plek te houden gestoken zijn, dan kun je de epoxy hars gaan mixen. Elke epoxy hars werkt net weer even anders, dus het is belangrijk om de aanwijzing voor gebruik goed te lezen. Zodra de epoxy hars gemaakt is volgens de gebruiksaanwijzing giet je het in de mal tot de gewenste hoogte. Hierna steek je de staven in de epoxy hars. Het is belangrijk dat het stuk van de staven waar de draad omheen gewikkeld is helemaal in de hars komt. Mocht het onverhoopt zijn dat dit er toch nog bovenuit steekt, dus kun je nog wat hars toevoegen.

Vochtsensor, epoxy. Hars
De instructies voor het maken van de epoxy hars verschillen per merk, lees daarom goed de verpakking voordat je aan de slag gaat.
Bodemvochtigheidssensor
Als de epoxy hars goed gemengd is, dan giet je eerst de hars in de vorm en plaats je daarna pas de grafieten staven erin.

In de meeste gevallen duurt het een dag voordat de epoxy hars goed uitgehard is. Zodra de hars hard is geworden, kun je de sensor voorzichtig uit de mal halen. Als het goed is, zitten de grafieten staven dan stevig in de hars en kun je beginnen met het verder aansluiten van de sensor.

Grafieten elektroden, vochtsensor
Tijdens het drogen houdt de mal de grafieten elektroden en het draad op zijn plaats.
Epoxy hars, grafieten elektroden, bodemvochtigheidssensor
Als de epoxy hars hard geworden is, dan zitten de grafieten staven stevig vast.
Bodemvochtigheidssensor, weerstand sensor
Als de epoxy hars goed uitgehard is, dan kan de sensor uit de mal gehaald worden.

Bedraden

Één grafiet elektrode wordt direct verbonden met de stroomvoorziening poort van de microcontroller. Hiervoor kies je één van de twee kabels die aan een grafiet staaf zit. Afhankelijk van de manier waarop je de sensor aan de microcontroller wilt bevestigen kun je hier bijvoorbeeld een aderhuls of Dupont stekker aan bevestigen.

Bodemvochtigheidssensor
Haal een paar centimeter van het uiteinde ongeveer 1 centimeter isolatie van één van de kabels die aan een elektrode vast zit.
Bodemvochtigheidssensor
Soldeer een 10K Ohm weerstand aan het stukje draad dat je vrij gemaakt hebt.

De andere kabel wordt verbonden met de aarde poort en met de analoge input poort. Om dit voor elkaar te krijgen verwijder je op ongeveer 5 centimeter van het uiteinde van de draad een stukje van ongeveer 1 centimeter van de isolatie van de draad. Aan dit stukje draad wordt één kant van een 10K Ohm weerstand gesoldeerd. Aan de andere kant van de weerstand hebben wij een aderhuls bevestigd, maar je kunt het natuurlijk ook vast maken aan een ander stukje draad om wat meer bewegingsvrijheid te hebben. Het geheel hebben we beschermd met een aantal aderhulzen.

Vochtsensor
Bevestig een krimpkous om de weerstand, zodat hij beschermd is.
Vochtsensor
Plaats een extra stukje krimpkous om de intersectie tussen de aftakking.
Grafiet, bodemvochtigheidssensor, diy sensor
Uiteindelijk heb je een sensor met twee elektroden en drie connectoren.

Aansluiten op de microcontroller

Grafiet elektroden, bodemvochtigheidssensor, vochtsensor
De ene grafiet elektroden wordt direct aan de digitale pin aangesloten, terwijl de andere elektrode zowel aan de analoge pin en, door middel van een 10K Ohm weerstand, aan de aarde pin wordt aangesloten.

Om het corroderen van de grafieten elektroden nog verder af te remmen, sluiten we de zelf gemaakte bodemvochtigheidssensor iets anders aan dan meestal wordt gedaan. De kabel die direct, zonder aftakking, vast zit aan één van de twee elektroden bevestigen we niet aan de VCC-aansluiting, zoals meestal gedaan wordt. In plaats daarvan bevestigen we deze kabel aan een digitale poort van de microcontroller. Dit zorgt er voor dat we later in het programma de stroomvoorziening naar de sensor uit kunnen zetten als we geen metingen uitvoeren. Als de stroomvoorziening naar de sensor uit staat, dan vindt er namelijk geen elektrolyse plaats. Elektrolyse is het proces waardoor elektroden, en dan vooral metalen elektroden, in weerstand vochtigheidssensoren corroderen.

Bodemvochtigheidssensor
Voordat je de sensor in elkaar zet, is het altijd aan te raden om de sensor eerst op een breadboard uit te proberen. Hier is de rode Dupont verbonden aan de digitale pin, de witte Dupont aan de analoge pin, en de zwarte Dupont aan de aarde pin.

De rest van de sensor wordt wel aangesloten zoals meestal wordt gedaan. De kabel die door middel van de 10K Ohm weerstand afgetakt is van de kabel die aan de andere elektrode vast zit wordt verbonden met de aarde, ofwel GND, poort van de microcontroller. Het uiteinde van de kabel waar de aftakking aan bevestigd is wordt op een analoge poort aangesloten.

Programmeren

Het programma van de zelf gemaakte grafiet bodemvochtigheidssensor is relatief lang. Dit komt, omdat het programma zo gemaakt is dat de stroomtoevoer naar de sensor zo min mogelijk aan gaat. Hierdoor wordt de corrosie van de grafieten elektroden tot een minimum beperkt, waardoor deze zelf gemaakte sensor veel langer mee gaat.

Voorbereidingsfase

In de voorbereidingsfase zijn er een aantal waardes die gedefineerd worden en variabelen die aangemaakt worden. In de voorbereidingsfase vertellen we het programma eerst op welke pinnen de sensor aangesloten wordt. Hiervoor geven we eerst het comando define vochtSensorPinA A4. In dit voorbeeld hebben we het uiteinde van de draad waarbij we de aftakking hebben gemaakt namelijk op analoge pin 4 aangesloten. Vervolgens geven we het commando #define vochtSensorPinD 2, om aan te geven dat de kabel zonder aftakking op digitale pin 2 aangesloten zit.

Vervolgens maken we in de voorbereidingsfase twee variabelen aan. Met het commando int vochtWaarde = 0; maken we de variabele vochtWaarde aan waarin de rauwe waarde die uit de sensor komt wordt opgeslagen. Het commando int vochtPercentage = 0; maakt vervolgens een variabele aan waarin de gemeten waarde wordt omgezet in een vochtpercentage.

Vervolgens geven we de commando’s #define nat 1010 en #define droog 9. De waardes 9 en 1010 zijn de waardes die de zelf gemaakte sensor aangeeft in zeer droge en in zeer natte, verzadigde grond. Om aan deze waardes te komen, voer je de code uit en laat je de rauwe waardes, ofwel de uitkomst van variabele vochtWaarde, op de Serial Monitor afprinten terwijl de sensor eerst in zeer droge grond staat en vervolgens in zeer natte, verzadigde grond staat. In het artikel “ De Programmeerbare Plantenkas: Grove Capacitive Moisture Sensor Aansluiten En Programmeren Om De Vochtigheid Van De Grond Te Meten” staat in meer details beschreven hoe je dit het beste kan doen, alleen gebruik je de functie vochtSensor() om de waarde uit de sensor te halen en kun je na een paar minuten meteen beginnen met het bepalen van de extreme waardes.

Grafiet elektroden, bodemvochtigheidssensor
In zeer droge grond gaf onze sensor een waarde van 9 aan.
Bodemvochtigheidssensor
In zeer natte grond gaf onze sensor een waarde van 1010 aan.

Daarna geven we aan hoeveel metingen we gebruiken om een gemiddelde meting te bepalen. Dit doen we met het commando # define metingen 10. In dit voorbeeld hebben we voor tien metingen gekozen. Hoe minder metingen, hoe sneller het programma is, maar ook hoe minder stabiel de metingen is. Om het programma bij te laten houden hoeveel van de metingen gedaan zijn, maken we de variabele int i = 0;.

Als laatste geven we in de voorbereidingsfase aan hoeveel tijd tussen het bepalen van de vochtigheid van de grond zit. Hiervoor geven we eerst het commando unsigned long seconden = 100L;. Daarna geven we het commando unsigned long minuten = seconden * 60;. Dit wordt vervolgend door het commando unsigned long uren = minuten * 60;. Op die manier hebben we het aantal milliseconden in een uur in een unsigned long variabele opgeslagen, zodat het later makkelijker is om de tijd tussen metingen aan te passen. Het aantal uren dat je tussen de metingen wilt kun je dan simpelweg aanpassen in het commando #define wachtTijd 6. Op dit moment laten we dus zes uur tussen de metingen, om corrosie van de sensor tot een minimum te beperken.

Setup fase

In de setup fase vertellen we de microcontroller wat de functie van de verschillende pinnen wordt. Hiervoor geven we eerst het commando pinMode(vochtSensorPinA, INPUT);. Hiermee vertellen we dat vochtSensorPinA, in dit voorbeeld A4, als input gebruikt wordt. Vervolgens geven we het commando pinMode(vochtSensorPinD, OUTPUT);, waarmee de vochtSensorPinD, ofwel digitale pin 2 in dit geval, als output gebruikt wordt. We geven ook nog het commando digitalWrite(vochtSensorPinD, LOW);, om er zeker van te zijn dat de stroomtoevoer naar de sensor uit staat. Als laatste laten we het programma nog even een seconden wachten, met het commando delay(1000);.

Functie voor de sensor

Om het programma makkelijk te kunnen combineren met andere stukjes code, hebben we de functie die de rauwe waarde uit de sensor haalt en vervolgens omzet in een vochtigheidspercentage. Om deze functie te maken geven we eerst het commando int vochtSensor() {}. Hierna zetten we de variabele vochtWaarde op nul met het commando vochtWaarde = 0;.

De volgende stap is om een aantal keer de waarde uit de sensor op te halen. In dit voorbeeld nemen we tien waardes waarvan we het gemiddelde bepalen. Hiervoor beginnen we met het commando for (i = 0; i < metingen; i++) {}. Dit commando zorgt ervoor dat er een loop gestart wordt. Aan het begin van een nieuwe loop wordt de variabele i op nul gezet. Zolang de waarde van i kleiner is dan de waarde die de variabele metingen representeert, dan wordt de loop herhaald. In de voorbereidingsfase in dit voorbeeld hebben we het commando #define metingen 10 gegeven, waardoor in dit voorbeeld het stukje code dat tussen de {} van de for-loop staat 10 keer herhaald wordt. Elke keer dat de commando’s tussen de {} uitgevoerd zijn, dan zorgt i++ ervoor dat de waarde van i met één omhoog gaat.

Tussen de {} van het commando for (i = 0; i < metingen; i++) {} geven we de commando's die in dit geval dus tien keer herhaald worden. Eerst geven we het commando digitalWrite(vochtSensorPinD, HIGH);. Dit commando zet de digitale pin waarop de sensor zit aangesloten aan, en gaat de zelf gemaakte sensor dus werken. Vervolgens geven we het commando delay (0.1);. Dit commando pauseert de loop voor 100 microseconden, zodat de sensor tijd heeft om aan te gaan. Vervolgens geven we het commando vochtWaarde += analogRead(vochtSensorPinA);. Hiermee wordt de analoge pin waarop de sensor aangesloten zit uitgelezen en wordt de waarde opgeteld bij de waarde van de variabele vochtWaarde. Daarna geven we het commando digitalWrite(vochtSensorPinD, LOW);. Dit commando zet de stroomtoevoer, via de digitale pin, naar de sensor weer uit. Door de tijd dat de stroomtoevoer naar de sensor aan staat zo veel mogelijk te beperken, gaat de sensor langer mee. Als laatste geven we het commando delay(500), zodat er een halve seconden wordt gewacht tussen de metingen. Eventueel zou je de tijd tussen metingen kunnen inkorten.

Als alle metingen zijn gedaan en opgeteld in de variabele vochtWaarde, dan kan het gemiddelde van de metingen bepaald worden. Dit gebeurt dus nadat de for-loop is afgerond, en staat dan ook na het sluitende } haakje van de for-loop. Om het gemiddelde te bepalen geven we het commando vochtWaarde /= metingen;. Dit deelt de opgetelde waardes door het totaal aantal metingen.

Als laatste geven we nog het commando vochtPercentage = map(vochtWaarde, droog, nat, 0, 100); in de zelf gemaakte functie. Dit commando zorgt ervoor dat er een percentage gekoppeld wordt aan de gemeten waarde, op basis van de minimum en maximum waarde die de sensor aangaf tijdens het kalibreren.

Loop fase

In de loop fase activeren we de vochtSensor() functie, met het commando vochtSensor();. Nadat de metingen zijn verzameld, de gemiddelde van de metingen is berekend en het vochtpercentage is berekend, gebeurt er op dit moment verder nog niets. Je kunt de code zelf aanvullen om de waarde op een manier te gebruiken die bij jou toepassing past. Zo kun je lampjes laten aan gaan als de plant water nodig heeft, of je kunt een pomp aanzetten die water aan de grond toedient.

Om te voorkomen dat de zelf gemaakte grafiet bodemvochtigheidssensor te vaak aan gaat, hebben wij in dit programma ervoor gekozen om de sensor elke zes uur aan te zetten. Dit doen we met het commando delay(wachtTijd * uren);, waarbij wachtTijd voor het aantal uren staat dat we tussen de metingen willen hebben en uren een trucje bevat om het maximaal aantal milliseconden dat het commando delay aankan omzeilt.

Arduino IDE CODE


/*
   Voorbeeld code gemaakt door www.foodplanting.com
   voor de Programmeerbare Plantenkas serie.

   Deze code is gemaakt voor het bepalen van de vochtigheid van de
   bodem met een zelf gemaakte grafiet weerstandsensor na kalibratie.

   Deze code is zeer minimalistisch, omdat het idee is
   dat deze code gecombineerd wordt met codes voor andere
   modules. Zo wordt de vochtigheid bijvoorbeeld niet in de
   loop fase, maar in een aparte functie op geroepen en
   wordt de gemeten vochtigheid niet in de Serial Monitor
   af geprint.
*/

// Voorbereiding:
#define vochtSensorPinA A4  // Dit geeft aan op welke analoge pin de sensor is aangesloten, in dit geval A4.
#define vochtSensorPinD 2 // Dit geeft aan op welke digitale pin de sensor is aangesloten, in dit geval D2.
int vochtWaarde = 0; // Een variable om de waarde van de vochtigheid van de bodem in op te slaan.
int vochtPercentage = 0; // Een variable om de vochtigheid van de bodem als een percentage in op te slaan.
#define nat 1010 // Dit is de waarde die de sensor aangaf in een met water verzandigd grond mengsel.
#define droog 9 // Dit is de waarde die de sensor aangaf in zeer droge grond.
#define metingen 10 // Dit is het aantal metingen dat gedaan wordt om een gemiddelde van te nemen.
int i = 0; // Hierin wordt opgeslagen hoeveel metingen al gedaan zijn.
unsigned long seconden = 1000L; // Een tussen variabele om later een lange wachttijd te kunnen uitvoeren.
unsigned long minuten = seconden * 60; // Een tussen variabele om later een lange wachttijd te kunnen uitvoeren.
unsigned long uren = minuten * 60; // Een tussen variabele om later een lange wachttijd te kunnen uitvoeren.
#define wachtTijd 6 // Dit geeft aan hoeveel uren je tussen de metingen wilt wachten, in dit geval 6 uur.

// Setup fase:
void setup() {
  Serial.begin(9600);
  pinMode(vochtSensorPinA, INPUT); // Dit geeft aan dat de analoge pin als een input gebruikt gaat worden.
  pinMode(vochtSensorPinD, OUTPUT); // Dit geeft aan dat de digitale pin als een output gebruikt gaat worden.
  digitalWrite(vochtSensorPinD, LOW); // Hiermee zetten we de digitale poort uit.
  delay(1000); // Een wachttijd van 1 seconden om er zeker van te zijn dat de digitale pin uit staat.
}

// Loop fase:
void loop() {
  vochtSensor(); // Vraag de microcontroller om de functie die de vochtigheid uit de sensor ophaalt uit te voeren.
  Serial.println(vochtWaarde);
  delay(wachtTijd * uren); // Tussen de metingen zit een tijd van wachtTijd uren.
}

//Functie voor vochtsensor:
int vochtSensor() {
  vochtWaarde = 0; // Zet de waarde van de variabele vochtWaarde op nul.
  for (i = 0; i < metingen; i++) {
    digitalWrite(vochtSensorPinD, HIGH); // Zet de spanning naar de sensor aan.
    delay(0.1); // Wacht 100 microseconden.
    vochtWaarde += analogRead(vochtSensorPinA); // Lees de analoge pin waarop de vochtsensor zit aangesloten uit en tel dit op bij de vorige waardes.
    digitalWrite(vochtSensorPinD, LOW); // Zet de spanning naar de sensor uit.
    delay(500); // Wacht een halve seconden voordat de volgende meting wordt genomen.
  }
  vochtWaarde /= metingen; // Deel de opgetelde gemeten waarde door het aantal metingen om het gemiddelde te krijgen.
  vochtPercentage = map(vochtWaarde, droog, nat, 0, 100); // Zet de vochtigheid om in een percentage.
}

Vragen en opmerkingen

We proberen de serie DE PROGRAMMEERBARE PLANTENKAS zo toegankelijk mogelijk te maken voor iedereen. Toch zijn sommige concepten best wel ingewikkeld, omdat er kennis van heel veel verschillende domeinen, zoals natuurkunde, elektrotechniek en computerwetenschappen, samen komen. Het kan daarom best zijn dat we iets niet goed uitgelegd hebben. Mocht er iets niet duidelijk zijn of iets niet zo werken zoals we het in deze tutorial uitgelegd hebben, stuur dan gerust een berichtje via de Disqus op deze pagina. Je kunt de Disqus vinden door naar beneden te scrollen, tot onder de advertenties.