Bodenfeuchtigkeit mit dem Raspberry Pi messen

Für den Raspberry Pi gibt es einige Sensoren, die Luftfeuchtigkeit, Temperatur und andere Werte messen können. Dennoch sind diese Module fast ausschließlich für die Luft geeignet und nicht für den Einsatz in Erde gedacht.
Für manche Projekte, wie z.B. eine automatische Pflanzenversorgung muss die Feuchtigkeit des Bodes gemessen werden, um dann z.B. Wasser nachzugießen.

In diesem Tutorial zeige ich, wie man den (analogen) Feuchtigkeitswert mit einem Sensor ausließt und diesen in einen digitalen Wert umwandelt, sodass der Raspberry Pi diesen auswerten kann.

Zubehör

Folgendes Zubehör habe ich benutzt:

 

Aufbau

Der MCP3008 IC ist ein Analog-Digital Wandler. Da der Raspberry Pi nicht von Haus aus analoge Signale erkennen kann, braucht man einen Wandler wie den MCP3008.

Zwar bietet dieser Sensor auch einen digitalen Pin, der ein Signal senden kann, sobald ein Schwellwert übertreten wird, allerdings ist so nicht exakt bestimmbar. Den Schwellwert kann man durch rotieren des Rädchens verändern (falls er erreicht wurde, leuchtet das grüne Lämpchen).

Um den analogen Pin auslesen zu können, schließen wir ihn folgendermaßen an:

 

hygrometer_Steckplatine

mcp3008-e1397762478714

Dabei sind die Anschlüsse an den MCP3008 wie folgt:

RaspberryPi MCP3008
Pin 1 (3.3V) Pin 16 (VDD)
Pin 1 (3.3V) Pin 15 (VREF)
Pin 6 (GND) Pin 14 (AGND)
Pin 23 (SCLK) Pin 13 (CLK)
Pin 21 (MISO) Pin 12 (DOUT)
Pin 19 (MOSI) Pin 11 (DIN)
Pin 24 (CE0) Pin 10 (CS/SHDN)
Pin 6 (GND) Pin 9 (DGND)

VCC des Sensors werden ebenfalls an 3.3V (Pin 1) des Raspberry Pi’s angeschlossen, GND und Pin 6 (GND) und A0 kommt an CH0 des MCP3008.

 

Software

Um den MCP3008 ansprechen zu können, muss SPI aktiviert werden. Dies geht folgendermaßen:

sudo raspi-config

„8 Advanced Options“ -> „A6 SPI“ -> „Yes“.
Danach den Neustart bestätigen.

Nun kannst du die spidev Bibliothek installieren, falls noch nicht geschehen:

sudo apt-get install git python-dev
git clone git://github.com/doceme/py-spidev
cd py-spidev/
sudo python setup.py install

Mit folgendem Skript kannst du anschließend den Sensor ansprechen (sudo nano humidity.py):

Dabei wird eben ein Wert zwischen 0 und 1023 ausgegeben. In meinen Test hat der Sensor aber oftmals eine 0 zurückgegeben, was totale Nässe (Leitfähigkeit) bedeuten würde. Da aber nur Werte um 100-200 erscheinen, falls der Sensor komplett in Wasser getaucht ist, ist ein Wert von 0 offensichtlich falsch, daher filtere ich im Skript diesen Wert. Darüber hinaus kommen Werte um  ~1000 heraus, falls nichts leitendes (Luft) zwischen den Sensorplatten ist.

Je nach Material (Erde, Wasser, Sand, etc.), was sich zwischen den Platten befindet, kommen andere Werte im trockenen / feuchten Zustand heraus. Daher macht es Sinn mehrere Messungen zu machen und den analogen Schwellwert für seine Anwendung anzupassen.

62 Kommentare

  1. Hallo,
    sehr schöner Beitrag. Da ich mit dem MCP3008 noch nicht so wirklich gearbeitet habe komme ich schon auf meine Frage. Ist es möglich mehrere Bodenfeuchtigkeitssensoren an die weiteren Kanäle anzuschliessen und diese einzeln auszuwerten?

    Vielen Dank im Voraus.

    Antworten
      • Hallo Felix
        Ich plane eine Gewächshaussterung, mit allem drum und dran. Unter anderem sollen in einem Gewächshaus die Maurerbottiche einzeln gemessen und bewässert werden können. 8 Sensoren habe ich zur Verfügung. Kann ich die alle an einen MCP3008 anschliessen ? Uwie sieht es mit der GPIO aus. Wahrscheinlich muss ich sowieso für das Projekt eine Porterweiterung bauen.
        Danke aus Schweden im Voraus für eine Antwort

      • Hi Jörg,
        ich plane auch ein automatisches Raspberry Pi Gewächshaus 😀 Dieses Wochenende habe ich angefangen. Je nachdem, wie viel Zeit ich habe, kommt dann bald auch ein Tutorial dazu. Du kannst an einem CP3008 bis zu 8 analoge Werte auslesen. Du kannst aber zwei SPI Geräte am Pi anschließen, also bis zu 16 analoge Pins. Alternativ nimm doch einen oder mehrere Arduinos. Die Werte kannst du per Raspberry Pi ganz einfach erhalten: Arduino und Raspberry Pi miteinander kommunizieren lassen

    • Hallo zusammen,

      für ein Projekt an der Uni wollen wir einen Feuchtigkeitssensor mit RPi verbinden.
      Wir haben noch keinen Bausatz dafür. Rpi können wir ausleihen.
      Woher bekommt man den Sensor am günstigsten?
      Brauche ich den MCP3008 als analogen Wandler unbedingt?
      Gruß Luca

      Antworten
    • Da die Pumpe nur 3V braucht, kannst du sie direkt an die GPIOs hängen, ich würde aber dennoch einen Transistor nehmen. Ein Relais ist in dem Fall nicht nötig, ein Transistor reicht vollkommen.
      LG Felix

      Antworten
      • Die Spannung mag stimmen, aber kann der GPIO genug Strom für die Pumpe liefern?
        Also auf jeden Fall Transistor oder Relais dazwischen!

      • Die GPIOs können max. 20mA liefern, aber auch der Pi an sich gibt normalerweise nicht mehr als 500-1000mA über die Spannungspins her. Eine externe Stromversorgung wird also für eine Pumpe definitiv gebraucht. Siehe auch mein Gewächshausprojekt.

  2. Hallo Felix,
    vielen Dank für den tollen Bericht.

    Ich möchte die aufgenommen Daten gern in eine .txt Datei herausschreiben und anschließend via gnuplot in eine graphische Umgebung bringen. Also habe ich zwischen Zeile 22 print(val) und Zeile 23 time.sleep(delay) folgendes eingefügt:

    Zeile 22                   print(val)
    neue Zeile 23       fobj_out = open ("humid-daten.txt", "a")
    neue Zeile 24      fobj_out.write(val + "n")
    neue Zeile 25   time.sleep(delay)

    das fobj_out.close() habe ich auf die letzte Zeile des scriptes gebracht.
    Leider bringt er mir folgenden Fehler und ich weiß auch nicht mehr weiter:
    „traceback (most recent call last):
    TypeError: unsupported operand type(s) for +: ‚int‘ and ’str'“

    Ich hoffe du kannst mir weiter helfen. Vielen Dank und weiter so!

    Tom

    Antworten
    • Hallo Tom,
      der Fehler besagt nur, dass der Plus Operator nicht für unterschiedliche Typen verwendet werden kann. Du kannst aber mit str(val) + "n" den Integer Wert in einen String umwandeln, dann sollte es funktionieren. Andere Möglichkeit wäre der String-Format bzw. Modulo (%) Operator.
      LG Felix

      Antworten
  3. Hat jemand Erfahrungen mit dem Feuchtigkeitssensor bei Pflanzen, die in Planzton bzw. in Seramis gepflanzt sind. Funktioniert das?

    Antworten
    • Hey, ich glaube nicht, dass es laufen würde. die kügelchen (falls wir uns richtig verstehen) speichern die feuchtigkeit ja drin und die überflüssige flüssigkeit, die du zum gießen benutzt, fliest unten raus. Es würde theoretisch gehen, wenn du die stecker in die Steinchen steckst. ich denke nicht, dass es funktionieren würde.

      Meine Frage ist: Ich möchte gerne ein PHP interface haben, wo man den wert auslesen kann. Jedoch nicht in den Zahlen zwischen 1 und 1023 sondern in schriftlicher ausgabe. Ich habe den sensor nun so kalibriert, dass mir der wert bei trockenheit in den 1000ern bereichen rumschwirt und bei nässe recht gering zwischen 30 und 34 bleibt. Ich bin leider nicht so PHP begabt (arbeite jedoch daran) stelle mir das scripten nicht so schwer vor. Es soll ggf. auch eine Grafische darstellung haben, falls möglich. so, dass man sehen kann, dass die Blume immer weniger zu trinken hat.

      Wäre cool, wenn mir einer weiterhelfen kann, nachdem ich das tutorial (welches echt gut ist!!!!!!!) erfolgreich abgeschlossen habe.
      Vielen Dank im Voraus!!

      Antworten
  4. Spitzen Anleitung,

    wie sieht es im praktischen Einsatz mit der Kabellänge aus?
    Ich würde gerne 20m zwischen Raspberry Pi bzw dem MCP und dem Sensor überbrücken, damit ich die Sensoren im Garten verteilen kann.

    Ich würde gerne alle 8 Kanäle benutzen, welche Kabel kann ich den verlängern um die Sensoren zu verteilen? Kann ich das Kabel zur Sensor Gabel einfach verlängern und dann entsprechend kalibrieren?

    Viele Grüße
    Stefan

    Antworten
    • Hallo Stefan,
      du solltest den AD Wandler möglichst nahe an den analogen Sensoren haben, da der Spannungsabfall die Werte verzerren könnte. Wie sich der Abfall der Spannung des SPI Kabels auswirkt hängt u.a. vom verwendeten Kabel ab und müsstest du testen.

      Antworten
  5. Hallo,

    ich bekomme auf meinem Pi Zero folgende Meldung beim Ausführen des Scripts:
    Traceback (most recent call last):
    File „bodenfeuchte2.py“, line 10, in
    spi.open(0,0)
    IOError: [Errno 2] No such file or directory

    Woran könnte es liegen?

    Antworten