Arduino Lektion 28: Bodenfeuchtesensor

Der Bodenfeuchtesensor misst die Feuchtigkeit der Erde durch den Widerstand welcher eine Spannung abfallen lässt. In verschiedenen Foren wurde von Benutzern angesprochen das diese sich “auflösen” dieses geschieht durch die Spannung in Verbindung mit Feuchtigkeit.

Bodenfeuchtesensor
Bodenfeuchtesensor

In dem Paket zum Sensor liegen die benötigten Kabel, der Sensor und die Auswerteeinheit bei.

Bezug

Der Bodenfeuchtesensor kann zbsp. über eBay.de für ca. 2€ erworben werden.

Technische Daten des Bodenfeuchtesensor

  • Betriebsspannung 3,3 bis 5V

Schaltplan

Der Sensor hat 2 Ausgänge welche mit “A” und “B” beschriftet sind.
Die Auswerteeinheit besitzt 4 Ausgänge

  • VCC – Spannung
  • A0 – analoger Ausgang
  • D0 – digitaler Ausgang
  • GND – Ground

Somit ergibt sich eine einfache Schaltung (und auch Programmierung).

BodenfeuchtesensorArduino Nano
 VCC5V
 A0A0
 GNDGND
Bodenfeuchtesensor am Arduino Nano
Bodenfeuchtesensor am Arduino Nano

Sensorwerte messen

Da die Feuchtigkeit im Boden nicht von einer zur anderen Sekunde abfallen wird messe ich zbsp. im Beispiel 1 alle 15min. wobei dieses schon recht viel sein wird.

Da durch die Spannung und der im Boden gelösten Salze (und Mineralien) eine Galvanische Lösung entsteht löst diese mit der Zeit den Sensor auf.

 

Quellcode

Beispiel 1 – Blumentopfüberwachung

Blumentopfüberwachung mit dem Bodenfeuchtesensor und einem Arduino Nano
Blumentopfüberwachung mit dem Bodenfeuchtesensor und einem Arduino Nano

Zur Überwachung einer Pflanze (Wasserversorgung) habe ich folgendes Sketch erstellt.

/*
* Dateiname: lektion28_bodenfeuchtesensor.ino
* Thema: Bodenfeuchtesensor (mir RGB LED)
*/
 

#define BLUE_LED 2  /* PIN für die blaue LED */
#define RED_LED 4   /* PIN für die rote LED */
#define GREEN_LED 3 /* PIN für die grüne LED */

#define SENSOR_PIN A0 /* PIN für den Bodenfeuchtesensor */

int sensorValue = 0; /* Variable für den Sensorwert */

void setup() {
  Serial.begin(9600); /* Begin der Seriellenkommunikation */
  pinMode(BLUE_LED, OUTPUT);   /* Setzt den PIN für die blaue LED als Ausgang. */
  pinMode(RED_LED, OUTPUT);    /* Setzt den PIN für die rote LED als Ausgang. */
  pinMode(GREEN_LED, OUTPUT);  /* Setzt den PIN für die grüne LED als Ausgang. */
}
void loop() {
    sensorValue = getSensorValue();
    reset();
    if(sensorValue >= 0 && sensorValue <=300){ /* unterer Grenzwert (zu nass) */
       analogWrite(RED_LED, 255);
       analogWrite(GREEN_LED, 255);
       analogWrite(BLUE_LED, 0);     
    } else if(sensorValue >= 301 && sensorValue <=450){ /* Grenzwert i.O. (nicht zu nass und auch nicht zu trocken) */
     analogWrite(GREEN_LED, 255);
    } else if(sensorValue >= 451){ /* oberer Grenzwert (zu trocken) */
      analogWrite(RED_LED, 255);  
    }

    delay(900000); /* Pause für 15min. */
}

//Ließt den Wert des Bodenfeuchtesensors und gibt diesen zurück.
int getSensorValue(){
  return analogRead(SENSOR_PIN);
} 

//Setzt die Farben der RGB LED zurück.
void reset(){
  analogWrite(RED_LED, 0);
  analogWrite(GREEN_LED, 0);
  analogWrite(BLUE_LED, 0);  
}

Download

 

Fazit

In einem Versuchsaufbau über 3 Tage habe ich die Bodenfeuchtigkeit in einer Pflanze gemessen.
Als Substrat wurde Kokoserde und Blumenerde verwendet.

Bodenfeuchte Kokoserde
Bodenfeuchte Kokoserde
Bodenfeuchte Blumenerde
Bodenfeuchte Blumenerde

Der Erste Ausschlag im Diagramm ist der Zeitpunkt wo ich die Pflanze initial gegossen habe.
Danach wurde kein Wasser hinzugefügt.

10 Kommentare

  1. Wenn es einen Zerfall aufgrund der Spannung gibt, könnte man den Sensor nicht über einen digitalen Pin betreiben? Hast du das schon mal probiert? Reicht da der Strom aus?

      1. Vielen Dank für die Rückmeldung. Ich probier das mal aus, wenn ich alle Teile beisammen habe. Dann könnte man den Sensor abschalten und die Lebensdauer erhöhen.

    1. Beim Verwenden von dem digitalen Pin gibt es immer noch die gleiche Spannung bei der Messgabel.

      Mit dem kleinen Rad kann ist Einzustellen ab welchem Schwellenwert (Analoger Wert) der Digitale Pin von ON auf OFF umschaltet.

      Aber der Sensor arbeitet grundsätzlich immer auf die gleiche Weise, egal ob man den DO oder AO verwendet.

      Eine Möglichkeit um den Verschleiß zu verbessern ist, die 3,3V Versorgungsspannung verwenden anstatt der maximalen 5V.

      LG

  2. Hi! Habe eine Frage: und zwar verstehe ich nicht ganz warum die Feuchtigkeit nicht deutlich weniger wird im Diagramm obwohl 3 Tage lang nicht gegossen wurde. Außerdem würde ich gerne wissen welcher Sensor das genau ist und warum die Entscheidung auf diesen gefallen ist?

    LG
    Natascha

  3. Guten Tag Herr Draeger,
    durch Suche nach einem Bauteil bin ich durch Zufall auf Ihre Seite gestoßen u fand als Arduino-Einsteiger viele Anregungen. Der logische Aufbau alle Seiten hat mir sehr gut gefallen.
    Und nun zum Bodenfeuchte-Sensor.
    Ein solche Projekt habe ich für den Früh-Sommer geplant.Nach früheren Recherchen habe ich immer wieder gelesen, daß sich die Bodensensoren mit der Zeitauf Widerstandsbasis leicht auflösen, bedingt durch Elektrolyse.
    Ich fand dann: https://www.tindie.com/products/miceuz/i2c-soil-moisture-sensor/
    auf kapazitiver Basis,was mir dann logischer erschine. Bei ebay für ca 10€ zu haben. Ich habs bezogen bei http://dvs-beregnung.de/ und auf Anfrage auch ein schönes sketch für Arduino bekommen.
    Wäre sicher eine Überlegung wert
    All the schematics and code is available at https://github.com/Miceuz/PlantWateringAlarm

    Grüße von Udo Tillmann
    0160 78 26 421

  4. Hallo,
    ich habe ein ähnliches Projekt und mir als Gehäuse für meine Steuerung ne Brotdose geholt….

    Nun sehe ich gerade du hast exakt die selbe Dose bei einer Pflanzenüberwachung… LOL

  5. Hallo, um die Lebensdauer der Sensoren zu erhöhen habe ich deren Versorgungsspannung nicht an +5 oder +3,3 Volt des Arduino gelegt, sondern an einen digital-out, der nur kurz zur Messung auf HIGH geschalten wird, nach der Messung ist dann wieder minutenlang auf LOW geschaltet.

  6. also ich gebe nur wenig strom, und so läuft es bei mir.
    analogWrite(strom, 130);
    delay(500); //halbe sec warten
    int fuhl = analogRead(fuhler);//dann auslesen
    delay(20); //kurtz warten
    analogWrite(strom, 0); // sensor aus ;-))
    int IntTemp = fuhl;
    if (IntTemp > 530 & var ==0) {

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.