DE PROGRAMMEERBARE PLANTENKAS // ADAFRUIT STEMMA I2C CAPACITIVE MOISTURE SENSOR AANSLUITEN EN PROGRAMMEREN OM DE VOCHTIGHEID VAN DE GROND TE METEN
In deze tutorial laten we zien hoe je een Adafruit STEMMA I2C Capacitive Moisture Sensor aansluit en programmeert om de vochtigheid van grond te meten met een Arduino microcontroller of een andere microcontroller. Onderaan de pagina vindt je meer informatie over de techniek achter deze sensor.
Aansluiten
De Adafruit STEMMA I2C Capacitive Moisture Sensor is voorzien van een JST-PH aansluiting. Dit betekent dat je een JST-PH kabel nodig hebt om deze sensor op de microcontroller aan te sluiten. Ook een Grove kabel zonder clipje aan de voorkant werkt meestal goed. De kabel steek je simpelweg in de sensor en in een I2C poort van de microcontroller. Daarna steek je de sensor in de grond. Zorg ervoor dat alleen het groene deel van de sensor onder de grond zit en niet het witte deel waar de onderdelen op bevestigd zijn.
Programmeren
Volgens de documentatie van Adafruit zou de Adafruit STEMMA I2C Capacitive Moisture Sensor een waarde tussen de 300 en 500 geven wanneer deze in de aarde gestoken is. Je kunt er voor kiezen om met deze waardes aan de slag te gaan, maar je kunt er ook voor kiezen om de sensor te kalibreren. Dit laatste zorgt ervoor dat de waardes die de sensor aangeven betekenis krijgen. In het artikel “De Programmeerbare Plantenkas: Grove Capacitive Moisture Sensor Aansluiten En Programmeren Om De Vochtigheid Van De Grond Te Meten” hebben we uitgebreid uitgelegd hoe je een capacitieve vochtigheidssensor het beste kunt kalibreren. Het enige wat je moet veranderen is de code. Ook werkt de Adafruit STEMMA I2C Capacitive Moisture Sensor sneller dan de Grove sensor, waardoor je de waarde na een paar minuten al kunt bepalen.
De Adafruit STEMMA I2C Capacitive Moisture Sensor werkt op basis van de Seesaw bibliotheek van Adafruit. Deze bibliotheek is bedoeld om met Atmel chips te communiceren. In de sensor zit namelijk een
Atmel SAM D10 chip verwerkt die de capaciteit van de sensor meet en vervolgens omzet in een seriële data. Om de bibliotheek te activeren geven we in de voorbereidingsfase het commando
#include "Adafruit_seesaw.h"
. Om de sensor aan de bibliotheek the koppelen wordt ook nog het commando Adafruit_seesaw capSensor;
gegeven.
In de voorbereidingsfase worden ook een aantal variabelen aangemaakt. Met het commando uint16_t vochtWaarde = 0;
wordt de variable vochtWaarde gemaakt waarin later de
waarde die uit de senosr komt in wordt opgeslagen. Ook wordt het commado int vochtPercentage = 0;
gemaakt, om de berekende vochtpercentage in op te slaan. Verder wordt de minimale en
maximale waarde die sensor in zeer droge en zeer natte geeft gedefinieerd, met het commando #define nat 560
en het commando #define droog 409
. Deze twee waardes hebben
we door calibratie in onze eigen grond verkregen. In je eigen code kun je dit vervangen door de waardes die je hebt verkegen na kalibratie in je eigen grond, of met de waardes die Adafruit
aangeeft, namelijk 200 voor droge grond en 500 voor natte grond.
In de setup fase moet de communicatie met de sensor worden aan gezet. Dit wordt gedaan met het commando capSensor.begin(0x36);
. De waarde 0x36 refereert naar het I2C adres dat deze
sensor heeft.
Om de code eenvoudig te kunnen combineren met andere stukjes code, hebben we een aparte functie gemaakt waarin de waarde uit de sensor wordt opgehaald en deze waarde vervolgens wordt vertaald
naar een vochtigheidspercentage. Om de functie aan te maken beginnen we met het commando void vochtSensor() {}
. Binnen in de functie geven we twee commando's. Eerst geven we het
commando vochtWaarde = capSensor.touchRead(0);
. Dit commando maakt gebruikt van de touchRead functie die uit de Seesaw bibliotheek komt om de gemeten capaciteit op te slaan in de
variable vochtWaarde. Daarna geven we het commando vochtPercentage = map(vochtWaarde, droog, nat, 0, 100);
. Dit zorgt ervoor dat de huidige waarde op basis van de minimale
en maximale waarde omgezet wordt in een vochtigheidspercentage.
In de loop fase wordt de functie die de waarde uit de sensor ophaalt en omzet in een vochtigheidspercentage geactiveerd met het commando vochtSensor();
. Op dit moment wordt er
helemaal niets gedaan met de waardes die opgehaald worden. Zelf kun je de code uitbreiden om de waardes bijvoorbeeld op een display te laten zien of om een waterpompje aan te zetten.
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 Adafruit STEMMA I2C Capacitive Moisture Sensor na kalibratie. Deze code maakt gebruikt van de SeeSaw bibliotheek van Adafruit. Meer info over deze bibliotheek vindt je hier: https://github.com/adafruit/Adafruit_Seesaw 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: #include "Adafruit_seesaw.h" // Dit laadt de bibliotheek die nodig is om de capacitieve sensor uit te lezen. Adafruit_seesaw capSensor; // Dit geeft aan dat we de sensor capSensor noemen in dit programma. uint16_t 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 560 // Dit is de waarde die de sensor aangaf in een 1:1 grond:water mengsel. #define droog 409 // Dit is de waarde die de sensor aangaf in zeer droge grond // Setup fase: void setup() { capSensor.begin(0x36); // Zet de communicatie tussen de microcontroller en de sensor aan. } // Loop fase: void loop() { vochtSensor(); // Vraag de microcontroller om de functie die de vochtigheid uit de sensor ophaalt uit te voeren. } //Functie voor vochtsensor: void vochtSensor() { vochtWaarde = capSensor.touchRead(0); vochtPercentage = map(vochtWaarde, droog, nat, 0, 100); // Zet de vochtigheid om in een percentage. }
Achtergrond
Er is helaas weinig directe informatie beschikbaar over de werking van de Adafruit STEMMA I2C Capacitive Moisture Sensor of over de Atmel SAM D10 chip waarop het design van de sensor gebaseerd is. Op basis van de informatie die er wel is over de chip en informatie over vergelijkbare chips denken wij dat deze sensor als volgt werkt: De manier waarop het metalen plaatje dat in het deel van de sensor dat in de grond gestoken wordt aan de chip bevestigd is, wijst erop dat deze sensor hetzelfde werkt als een enkele zelfcapaciteit aanraak sensor.
Zodra het potentiaalverschil van 3,3 volt bereikt is, dan zorgt er chip ervoor dat het metalen plaatje van de sensor weer ontladen wordt. De stroom die uit de sensor komt bij het ontladen wordt gemeten door de chip. Dit wordt omgezet in een cijfer dat een functie is van de capaciteit van de sensor, die dus wordt beïnvloed door de hoeveelheid water in de grond, en de versterkingsfactor die de chip op het signaal uitoefent. Dit is de waarde die de sensor naar de microcontroller stuurt, en die door de code op de microcontroller wordt uitgelezen.
Volgens Adafruit zou deze waarde rond de 200 liggen wanneer de grond zeer droog is, en rond de 500 wanneer de grond zeer nat is. Tijdens de kalibratie van de sensor die ik zelf heb, lag de waarde in zeer droge en zeer natte grond hier wel wat vanaf, dus kalibratie is zeker aan te raden.
Doordat de manier waarop deze sensor is gemaakt eigenlijk bedoeld is voor touch sensoren, wordt de werking van de sensor enorm verstoord wanneer er een hand of ander lichaamsdeel in de buurt is. Wanneer je je hand op ongeveer 5 centimeter van de sensor houdt zonder iets aan te raken, dan schiet de waarde ongeveer 200 punten omhoog. Raak je de aarde in de buurt van de sensor aan, dan geeft de sensor al snel een waarde van meer dan 1000 aan. Hierdoor is deze sensor niet voor alle omstandigheden geschikt. Wel zou de sensor hierdoor wellicht voor andere toepassingen geschikt worden, zoals voor systemen om vogels, knaagdieren of katten weg te jagen bij je planten.
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 bronvermelding en de advertenties.
Bronnen en verder lezen
- Baker, B. (2011). How delta-sigma ADCs work, Part 1. Analog Applications, 7, 0000000.
- Controller, S. D. P. T. Atmel QTouch Library.
- Furlan, F., & Gallina, P. (2021). Novel Self-capacitance Sensor to Measure Textile Moisture Content. Sensing and Imaging, 22(1), 1-27.
- Gray, T. (2019). Self Capacitance. In Projected Capacitive Touch(pp. 19-25). Springer, Cham.
- Microcontrollers, S. A. B. AT03260: SAM D/R System (SYSTEM) Driver.
- O'Connor, T. (2010). mTouch™ Projected Capacitive Touch Screen Sensing Theory of Operation. Microchip Technology Inc. TB3064.