Arduino – Grondvochtigheid sensor (2-aderig)
Hardware
Module voor 2-aderig sensor systeem:
Van links naar rechts: YL-69, HL-69, FC-28
Met deze module kun je de grondvochtigheid meten, er loopt een spanning van de ene zijde van de sensor naar de andere, hier wordt de ohmse weerstand gemeten en kan er een waarde gegeven worden aan de vochtigheid, waarbij meer vocht een lagere waarde geeft.
Er zijn verschillende soorten sensoren in omloop, afhankelijk van de fabrikant, zie boven.
Naar mijn weten en vergelijking is de YL-69 gelijk aan de HL-69, de FC-28 heeft meer “sensor” oppervlak en kan een andere waarde aangeven, maar dit is softwarematig aan te passen/programmeren.
Digitale of Analoge uitgang?
De digitale uitgang is alleen AAN of UIT (1 of 0), deze is af te stellen met de potmeter op de module print, de analoge uitgang loopt van 0 tot 1023 en geeft daarbij de voorkeur om te gebruiken, hiermee kun je een waarde meten, de potmeter op de module print heeft hier geen invloed op.
Pinout module:
Pin (vanaf bovenkant): | Functie: |
A0 | Analoge uitgang |
D0 | Digitale uitgang |
GND | GND |
VCC | +5v |
LET OP: Er zijn ook andere versie in omloop, controleer altijd de pinout of raadpleeg de handleiding!
Wat heb je nodig?
De sensor werkt met analoge data, er is daarvoor geen bibliotheek nodig.
Aansluiten op de Arduino
Sluit de module aan zoals aangegeven op onderstaand schema:
Sensor module pin: | Arduino pin: |
---|---|
A0 | A0 |
GND | GND |
VCC | +5v |
Script
1 2 3 4 5 6 7 8 9 10 11 12 13 |
int sensorPin = A0; // Selecteer de analoge ingang. int sensorWaarde = 0; // Variabele om de sensor waarde op te slaan. void setup() { Serial.begin(9600); // Start de seriële poort. } void loop() { sensorWaarde = analogRead(sensorPin); // Lees de waarde van de sensor. // Print de waarde van de sensor op de seriële monitor. Serial.print("Sensor waarde = " ); Serial.println(sensorWaarde); delay(1000); } |
Resultaat:
Meetwaarden
De sensor kan alleen een analoge waarde van 0 tot 1023 weergeven, om de vochtigheid te bepalen zou je tests moeten uitvoeren met het materiaal of grond die je meet, desnoods meten met een geijkte vochtigheidsmeter en kijken welke waarde daar bij hoort.
Mijn waarde meting:
Sensor: HL-69
– Droog (lucht) = 1023
– Glas met water = 350
Meting arduinotronics.blogspot.nl:
Sensor: YL-69
– Glas met water = 485
Meting whatgeek.com:
Sensor: HL-69
– Zandgrond droog = 970
– Zandgrond iets nat = 345
– Zandgrond nat = 270
Meetwaarden omzetten in een vochtigheids-percentage
Je kan bijvoorbeeld de volgende code gebruiken om een percentage (vochtigheid) te hangen aan de waarde:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
int sensorPin = A0; // Selecteer de analoge ingang. int sensorWaarde = 0; // Variabele om de sensor waarde op te slaan. int Vochtigheid; // [INSTELLINGEN] int sensorMin = 350; // Waarde bij 100% vochtigheid int sensorMax = 1023; // Waarde bij 0% vochtigheid void setup() { Serial.begin(9600); // Start de seriële poort. } void loop() { sensorWaarde = analogRead(sensorPin); // Lees de waarde van de sensor. sensorWaarde = constrain(sensorWaarde, sensorMin, sensorMax); // Stel de grenzen vast van de waarde. Vochtigheid = map(sensorWaarde, sensorMin, sensorMax, 100, 0); // Map de sensorwaarde aan een percentagegetal. // Print de waarde van de sensor op de seriële monitor. Serial.print("Vochtigheid = " ); Serial.print(Vochtigheid); Serial.println("%"); delay(1000); } |
Let op: Mapping is in principe een lineaire functie op een getallenreeks, en vermoedelijk verhoud de weerstand zich niet exact met de bijbehorende vochtigheid, nader onderzoek is nodig.
Resultaat:
Tegengaan van snelle corrosie door stroom
Afhankelijk van wat voor een materiaal er gebruikt wordt op de sensor, kan het voorkomen dat deze (sneller) corrodeert:
Wanneer er gelijkstroom door 2 elektroden van de sensor gevoerd wordt, treed er sneller corrosie op op de sensor, dit komt door elektrolyse, na een mum van tijd zijn de elektroden vergaan, om dit tegen te gaan is het raadzaam alleen de sensor te activeren wanneer er daadwerkelijk gemeten wordt, op deze manier kan de elektrode wel aanzienlijk langer meegaan!
Dit kan bijvoorbeeld in combinatie met:
– Een transistor.
– Een (Solid State) relais.
De code is dan als volgt:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
int sensorPin = A0; // Selecteer de analoge ingang. int sensorWaarde = 0; // Variabele om de sensor waarde op te slaan. int sensorVCC = 13; // Configureer de pin waarmee de sensor actief wordt gemaakt. int Vochtigheid; // [INSTELLINGEN] int sensorMin = 350; // Waarde bij 100% luchtvochtigheid int sensorMax = 1023; // Waarde bij 0% luchtvochtigheid int meetTijd = 3600*1000; // 1x per uur void setup() { Serial.begin(9600); // Start de seriële poort. pinMode(sensorVCC, OUTPUT); // Zet deze pin als uitgang. digitalWrite(sensorVCC, LOW); // Zet deze pin laag. } void loop() { digitalWrite(sensorVCC, HIGH); // Zet de sensor aan. delay(200); // Wacht even om zeker te zijn dat de sensor aan is. sensorWaarde = analogRead(sensorPin); // Lees de waarde van de sensor. sensorWaarde = constrain(sensorWaarde, sensorMin, sensorMax); // Stel de grenzen vast van de waarde. digitalWrite(sensorVCC, LOW); // Zet de sensor uit. Vochtigheid = map(sensorWaarde, sensorMin, sensorMax, 100, 0); // Map de sensorwaarde aan een percentagegetal // Print de waarde van de sensor op de seriële monitor. Serial.print("Vochtigheid = " ); Serial.print(Vochtigheid); Serial.println("%"); delay(meetTijd); } |
Ps. In principe zou je de polariteit per uitlezing moeten omdraaien om het corroderen van de polen te wisselen, anders zal telkens 1 pool belast worden en vergaan, je kan het beter verdelen over 2 polen, wellicht mogelijk met een schakeling.
Voorbeeld op homautomation.org