De Programmeerbare Plantenkas: Adafruit STEMMA I2C Capacitive Moisture Sensor Aansluiten En Programmeren Om De Vochtigheid Van De Grond Te Meten

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.

Adafruit STEMMA I2C Capacitive Moisture Sensor
Voorkant van de Adafruit STEMMA I2C Capacitive Moisture Sensor.
Adafruit STEMMA I2C Capacitive Moisture Sensor
Achterkant van de Adafruit STEMMA I2C Capacitive Moisture Sensor.

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.

Adafruit STEMMA I2C Capacitive Moisture Sensor
Bij ons gaf de sensor een waarde van 409 aan in zeer droge grond.
Adafruit STEMMA I2C Capacitive Moisture Sensor
Bij ons gaf de sensor een waarde van 560 aan in zeer natte, verzadigde grond.

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.

Adafruit STEMMA I2C Capacitive Moisture Sensor
De Atmel SAM D10 chip verzorgt het meten van de zelfcapaciteit van de plaat die in de grond is gestoken.

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.

Adafruit STEMMA I2C Capacitive Moisture Sensor, zelf capaciteit, touch sensor
In natte grond zonder hand in de buurt geeft de sensor een waarde rond de 560 aan.
Adafruit STEMMA I2C Capacitive Moisture Sensor, zelf capaciteit, touch sensor
In natte grond met een hand in de buurt geeft de sensor een waarde rond de 606 aan.
Adafruit STEMMA I2C Capacitive Moisture Sensor, zelf capaciteit, touch sensor
In natte grond met een hand op de maatbeker geeft de sensor een waarde rond de 1016 aan.

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.

Bronnen en verder lezen