Arduino – Grondvochtigheid sensor (3-aderig)
Hardware
3-aderige vochtsensoren:
Van links naar rechts: wRobot, Onbekend, Funduino
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, al deze sensoren zijn analoog (er zit geen DA converter bij) en dus niet meteen geschikt voor een Raspberry Pi.
Pinout module:
Pin (vanaf bovenkant): | Functie: |
S | Analoge 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: Funduino
– Droog (lucht) = 0
– Glas met (kraan)water = 700
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 = 700; // Waarde bij 100% vochtigheid int sensorMax = 0; // 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, sensorMax, sensorMin); // 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