Ik vind het belangrijk dat Bas on Tech door iedereen kosteloos gebruikt kan worden.
Help mij de toekomst van Bas on Tech te verzekeren. Je donatie zal o.a. worden gebruikt voor hosting, video's en onderhoud.
Alvast bedankt!
iDEAL en Bancontact vind je onder het "Direct Debit" tabblad in de 4e stap.
In deze les gaan we een capacitieve vochtsensor uitlezen. Met deze sensor kun je bijvoorbeeld bepalen of een plant water nodig heeft 🤓
Onderaan op deze pagina vind je de knop lesmateriaal waarmee je het lesmateriaal kunt downloaden. Dit materiaal bestaat uit de code, schakelschema en andere bestanden die in de les worden gebruikt.
Hierboven zie je de meest bekende vochtsensor. Hij bestaat uit twee pinnen die je in de aarde steekt. Deze twee pennen werken als een weerstand. Hierdoor kun je meten hoeveel stroom het ware in de aarde geleidt. Kunstmest veranderd ook de weerstand van de aarde. Hierdoor wordt je meting dus minder nauwkeurig.
Het grootste nadeel van deze sensor is dat hij naar verloop van tijd kan gaan oxyderen. Op de foto zie je dat bij de rechterpin het metaal bijna helemaal is weggeroest.
Dit komt omdat de gelijkstroom van de sensor met het water gaat reageren. Gebruik deze sensor dus NIET!
Voor onze Arduino gaan we een andere vochtsensor gebruiken: de
capacitieve vochtsensor . Op deze sensor zie je 1.2
staan, er is ook een versie met 2.0
. Beide kun je gewoon gebruiken dat maakt voor deze les niets uit.
Deze sensor werkt op een andere manier dan de eerder genoemde traditionele sensor. De capacitieve vochtsensor werkt namelijk als een condensator. Het water in de aarde veranderd de capaciteit van de condensator. Door de laad- en ontlaadtijd te meten kunnen we bepalen hoe vochtig de aarde is.
Linksboven zie je dat we een puls door een weerstand sturen. Deze komt vervolgens bij onze sensor die zich als condensator (de twee horizonale streepjes) gedraagt.
Als de condensator is opgeladen, begint deze zich te ontladen. De tijdsduur van dit proces wordt door de sensor gemeten. Dit is weergegeven met het klokje rechtsboven. Het meten van de tijd wordt gedaan door de 555 chip. Deze kun in het midden van de sensor zien zitten.
Sluit de sensor volgens onderstaand schema aan.
Onderstaande code doet niets anders dan pin A0
uitlezen, en vervolgens de gemeten waarde naar de seriële monitor sturen.
1 void setup()
2 {
3 Serial.begin(9600);
4 }
5
6 void loop()
7 {
8 Serial.println(analogRead(A0));
9 delay(100);
10 }
Upload deze code naar je Arduino. Schrijf de op de seriële monitor weergeven waarde op. Deze waarde gaan we in deel 2 gebruiken om de vochtigheid te bepalen. Doe hetzelfde als de sensor in het water ligt.
We beginnen met definiëren van twee constanten:
1 const int dry = 583; // waarde bij droge sensor
2 const int wet = 239; // waarde bij sensor in water
Vul hier je eigen gemeten waarden in.
1 void setup()
2 {
3 Serial.begin(9600);
4 }
In de setup()
doen we niets anders dan de seriële monitor op 9600 Baud in te stellen.
1 void loop()
2 {
3 int sensorVal = analogRead(A0);
4
5 int percentageHumididy = map(sensorVal, wet, dry, 100, 0);
6
7 Serial.print(percentageHumididy);
8 Serial.println("%");
9
10 delay(100);
11 }
De loop()
functie bestaat uit 3 delen:
1 int percentageHumididy = map(sensorVal, wet, dry, 100, 0);
Het omzetten van de gemeten waarden naar een percentage doen we met map().
Voor het gemak gaan we er vanuit dat de sensor een lineair verloop heeft. Dit wil zeggen dat elke stap even groot is. In de praktijk zal dit niet zo zijn. Voor een echt nauwkeurige meting moet je de sensorwaarden van zo veel mogelijk tussenstappen meten, bijvoorbeeld elke 10%. Hierna kun je bepalen of de gemeten waarden tussen twee grenzen ligt, om ze het percentage te bepalen.
We hebben in deel 1 gemeten dat de sensor waarden geeft tussen 239
en 583
. Dit willen we omzetten naar een schaal van 0
tot 100
om procenten te krijgen. De map()
functie heeft 5 argumenten:
sensorVal
239
583
0
100
Dit is precies wat we aan de map()
functie meegeven met map(sensorVal, wet, dry, 100, 0)
Verderop in de code zie je twee regels:
1 Serial.print(percentageHumididy);
2 Serial.println("%");
De eerste keer gebruiken wel print()
en de tweede keer println()
. Het verschil is dat println()
een nieuwe regel start nadat deze geprint heeft, print()
doet dit niet.
1 Serial.println(70);
2 Serial.println("%");
print:
1 70
2 %
en
1 Serial.print(70);
2 Serial.println("%");
print:
1 70%
Op deze manier kunnen we het percentage met daaraan vast het %
teken printen. Er zijn nog andere functies om dit makkelijk te doen, daar kom ik in een andere les op terug.
Tot slot wachten we nog 100ms en lezen we de sensor opnieuw uit.
Je kunt nu de code naar de Arduino uploaden. Open vervolgens de seriële monitor om de waarden van de sensor weer te geven.
Je kunt nu de sensor in het water houden om het verschil in percentage te zien.
💡 Rechtsonder zie je de Baud-rate staan. Let op dat deze hetzelfde is als in Serial.begin()
is opgegeven, in ons geval dus 9600
.