A04|02 Die Erdfeuchtigkeit messen
Soil Humidity Sensor
Sensorwerte / Wasser und Feuchtigkeit messen
Falls du ein automatisches Pflanzen-Bewässerungssystem planst zu bauen, ist dieses Modul unverzichtbar. Ein wichtiger Part für den intelligenten Garten wird die Bewässerungsmechanik sein (Wassertank, Pumpe, Wasserleitungen). Wichtig ist auch, dass das System erkennt, wann genau die Pflanzen Wasser benötigen. Mit dieser Art von System können wir unsere Pflanzen nur bei Bedarf bewässern und eine Über- oder Unterbewässerung vermeiden. Und hier kommt der Sensor für die Erdfeuchtigkeit ins Spiel. Die gabelförmige Sonde mit zwei getrennten, freiliegenden Leitern funktioniert als variabler Widerstand, dessen Wert je nach Wassergehalt im Boden variiert. Der Strom fließt von der einen Leitung über die Erde in die andere Leitung.
Spezifikationen
- Signalart: analog
- Spannung: 3,3V – 5V
- Pinabstand: 2,54mm
- Arbeitsstrom: ≤ 20mA
Je mehr Wasser im Boden ist, desto besser ist die Leitfähigkeit und desto geringer ist der Widerstand. Je weniger Wasser im Boden ist, desto schlechter ist die Leitfähigkeit und desto höher ist der Widerstand. Über die entsprechende analoge Ausgangsspannung können wir den Feuchtigkeitsgehalt bestimmen.
Die Ausgangsspannung beträgt zwischen 0 und 2,3V. Wenn der Sensor vollständig in Wasser eingetaucht ist, beträgt die Spannung 2,3V. Je höher die Luftfeuchtigkeit ist, desto höher ist die Ausgangsspannung.
Die Kalibrierung des Sensors
Um genaue Messwerte zu erhalten, empfiehlt es sich definitiv, ihn zunächst für den speziellen Bodentyp zu kalibrieren. Jeder Boden verhält sich anders. Die elektrische Leitfähigkeit des Wassers hängt in hohem Maße von den Mineralien in der Erde ab. Reines destilliertes Wasser kann keinen Strom leiten.
Aus diesem Grund müssen wir zunächst Messungen mit sehr trockener und mit Wasser gesättigter Erde durchführen und die Werte notieren. Diese gemessenen Werte werden dann zur oberen und unteren Grenze definiert.
In meinen Experimenten habe ich bei meiner Zimmer-Topfpflanze folgende Werte ablesen:
Trockene Erde: 0 bis 300
Feuchte Erde: 300 bis 700
Völlig in Wasser stehende Erde: 700 bis 950
Der Aufbau
Verbinde dein Arduino mithilfe der Jumper Wire mit dem Modul:
Der minimal Sketch
Der Sketch sendet den aktuellen Sensorwert an den seriellen Monitor. Gleichzeitig blinkt die interne Arduino LED am Pin 13. Der Sensorwert gibt den Blinkrhythmus an: Je mehr Wasser in der Erde detektiert wird, umso langsamer blinkt die LED. Bei trockener Erde blinkt sie sehr schnell. Kopiere den unteren Sketch, füge ihn in die Arduino IDE ein und lade ihn auf das Arduino-Board rauf.
/********************************************************
A04|02 Die Erdfeuchtigkeit messen A
Der minimal Sketch
Mr Robot UXSD / www.mrrobotuxsd.com
*********************************************************/
int soilPin = A0; //Pin-Nummer des Sensors
int ledPin = 13; //Pin-Nummer der LED
int soilValue = 0; //Variable zum Speichern der Wassersensor-Werte
void setup()
{
//Initialisiere die Serielle Kommunikation mit 9600 Bits pro Sekunde:
Serial.begin(9600);
pinMode(ledPin, OUTPUT); //den ledPin als OUTPUT deklarieren
}
void loop()
{
soilValue = analogRead(soilPin); ////lies den aktuellen Wassersensor-Wert
int newSoilValue = map(soilValue, 0, 1023, 0, 100);
Serial.print("Erdfeuchtigkeit: ");
Serial.print(newSoilValue);
Serial.println("%");
digitalWrite(ledPin, HIGH); //schalte die LED ein
delay(soilValue); //pausiere gemäß dem Wassersensor-Wert
digitalWrite(ledPin, LOW); //schalte die LED aus
delay(soilValue); //pausiere gemäß dem Wassersensor-Wert
}
Schalte den seriellen Monitor ein, indem du in der Arduino IDE in der Menüleiste auf Werkzeuge > Serieller Monitor gehst. Stecke den Sensor in die Erde rein. Falls die Erde trocken ist, solltest du den Wert 0 sehen. Gieße die Erde mit Wasser. Achte darauf, dass die kleinen Elektronikteile (Widerstände) und der Kabelanschluss trocken bleiben! Die Schaltung ist nicht dazu gemacht ihn komplett in die Erde zustecken.
Schalte den seriellen Monitor ein, indem du in der Arduino IDE in der Menüleiste auf Werkzeuge > Serieller Monitor gehst.
Du solltest nun die folgende Anzeige sehen:
Die Korrosion reduzieren
Ein allgemein bekanntes Problem bei Bodenfeuchtigkeitssensoren ist ihre kurze Lebensdauer. Die Elektronik ist in einem sehr feindlichen Umfeld platziert und korrodiert in relativ kurzer Zeit: die Feuchtigkeit (vorallem große Mengen), der pH-Wert der Erde und vor allem die durch elektrischen Strom induzierte Elektrolyse löst allmählich das Metall aus der Leiterbahn. Mit zunehmender Korrosion wird das Messergebnis verfälscht.
Eine sehr gute Methode, die Lebensdauer des Sensors zu verlängern, besteht darin, ihn nur dann mit Strom zu versorgen, wenn Messungen durchgeführt werden. Dadurch wird der Elektrolyse-Zersetzungsprozess signifikant verlangsamt. In den allermeisten Fällen wird es nicht notwendig sein, jede Sekunde eine Messung durchzuführen, da sich die Bodenfeuchtigkeit innerhalb kurzer Zeit nicht erheblich verändern wird.
Anstatt den Sensor an den 5V-Pin anzuschließen, der ihn dauerhaft mit Strom versorgt, können wir einen digitalen Pin benutzen. Dies hat den Vorteil, dass wir den Erdfeuchtigkeitssensor mit einem HIGH/LOW Signal nur bei Bedarf mit Strom versorgen können. Folgender Code schaltet alle zwei Stunden den Sensor ein, nimmt eine Messung vor und deaktiviert ihn wieder. Der Elektrolytvorgang ist auf ein Bruchteil reduziert. Folgende Abbildung zeigt die Neu-Verkabelung:
/********************************************************
A04|02 Die Erdfeuchtigkeit messen B
Die Korrosion reduzieren
Mr Robot UXSD / www.mrrobotuxsd.com
*********************************************************/
int soilPin = A0; //Pin-Nummer des Sensors
int soilValue = 0; //Variable zum Speichern der Erdfeuchtigkeit-Werte
int powerPin = 20;
const unsigned long second = 60; //Definition von Sekunden
const unsigned long minute = 60; //Definition von Minuten
//Definition von einer Stunde
const unsigned long hour = minute * second * 1000;
void setup()
{
//Initialisiere die Serielle Kommunikation mit 9600 Bits pro Sekunde:
Serial.begin(9600);
pinMode(powerPin,OUTPUT); //den powerPin als OUTPUT deklarieren
}
void loop()
{
digitalWrite(powerPin,HIGH); //versorge den Sensor mit Strom
soilValue = analogRead(soilPin); //lies den aktuellen Erdfeuchtigkeits-Wert
//mappe den Erdfeuchtigkeits-Wert von 0 bis 100%
int newSoilValue = map(soilValue, 0, 1023, 0, 100);
Serial.print("Erdfeuchtigkeit: ");
Serial.print(newSoilValue);
Serial.println("%");
digitalWrite(powerPin,LOW); //schalte den Erdfeuchtigkeits-Sensor wieder aus
delay(hour * 2); //Warte 2Stunden bis zur nächsten Messung
}
Du solltest auf dem seriellen Monitor die folgende Anzeige sehen:
Der Code im Detail
Kommen wir zu den wichtigen Zeilen: Zunächst definieren wir die Dauer einer Stunde (60Sekunde x 60Minuten x 1000). Warum multiplizieren wir die Sekunden und Minuten mit dem Faktor 1000? Da die Funktion delay() nur Werte in Millisekunden abarbeitet müssen wir das Ergebnis in Millisekunden umwandeln: 1000ms (Millisekunden) = 1s (Sekunde)
const unsigned long second = 60; //Definition von Sekunden
const unsigned long minute = 60; //Definition von Minuten
//Definition von einer Stunde
const unsigned long hour = minute * second * 1000;
Du wirst dich erinnern, dass wir statt den positiven Pin des Sensors an den 5V-Pin des Arduinos an einen digitalen Pin angeschlossen haben, um die Korrosion zu verlangsamen. Wir versorgen den Sensor mit der Zeile digitalWrite(powerPin, HIGH) mit Strom und lesen seinen aktuellen Wert ein: soilValue = analogRead(soilPin).
Außerdem mappen wir die Werte von 0 bis 1023 auf den Bereich von 0% bis 100%. Das ist intuitiver als die digitalen Werte.
digitalWrite(powerPin,HIGH); //versorge den Sensor mit Strom
soilValue = analogRead(soilPin); //lies den aktuellen Erdfeuchtigkeits-Wert
//mappe den Erdfeuchtigkeits-Wert von 0 bis 100%
int newSoilValue = map(soilValue, 0, 1023, 0, 100);
Nachdem der aktuelle Wert an den seriellen Monitor gesendet wurde, schalten wir wieder die Stromversorgung des Sensors aus: digitalWrite(powerPin,LOW). Schließlich pausiert der Sketch für 2 Stunden delay(hour * 2) bis zur nächsten Messung und der ganze Prozess beginnt von vorne.
Serial.print("Erdfeuchtigkeit: ");
Serial.print(newSoilValue);
Serial.println("%");
digitalWrite(powerPin,LOW); //schalte den Erdfeuchtigkeits-Sensor wieder aus
delay(hour * 2); //Warte 2Stunden bis zur nächsten Messung
Verwante Themen
Falls du die hier beschriebenen Elektronik-Module nicht hast, kannst du sie in meiner Einkaufsliste finden. Warum ich selber hauptsächlich mit Modulen der Marke Keyestudio arbeite, erläutere ich unter diesem Blog-Artikel.