Bodenfeuchtigkeit mit dem Raspberry Pi messen

7. April 2017
2753 Views
40 Comments

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:

RaspberryPiMCP3008
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.

40 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

    • 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
  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
    • In der raspi-config habe ich es aktiviert. In der config.txt steht es auf on und die Blacklist ist leer.

      Antworten
      • Kannst du mal schauen, welche Spi Devices angezeigt werden: ls /dev/spi*
        Was du probieren kannst: System updaten (apt-get update und upgrade), dann die /boot/config.txt Datei bearbeiten und folgende Zeile am Ende hinzufügen:

        dtoverlay=spi1-3cs

        Nach dem Neustart sollten alle erkannt werden.

    • Danke. Es wird nun angezeigt. Ob es funktioniert kann ich erst heute abend testen.

      Ich glaube das ging nicht weil das Overlay vom waveshare Display aktiviert war.

      Andere Frage.
      Wenn man den min. Wert (bei Luft) und den max. Wert (im Wasser) nimmt als Messbereich (0-100%). Wäre das aussagekräftig?

      Antworten
      • Ich habe es mit ein paar Werten ausprobiert und mMn ist es „ungefähr“ aussagekräftig. Wobei totale Nässe nicht 1023 bedeutet (Wasserwiderstand). Am besten du testest es in komplett trockener Erde und in komplett nasser Erde. Dann sollte es aussagekräftig sein.

  6. Hi,
    egal wie ich das Rädchen einstelle, ich bekomme stetig steigende oder auch fallende Werte… Habe ich was falsch gemacht? Wie stelle ich das ganze richtig ein?

    Antworten
    • Die Änderungen sind größer 20, so ca. 150. Es scheint als bräuchte der Sensor um sich zu aklimatisieren. Ist die Erde trocken und ich führe das Script aus, legt die Ausgabe los bei 720 und steigt über Zeit an auf 870 und pendelt sich dann so in dem Bereich ein (+- 10-20). Ist die Erde nass, wird zunächst ein Wert bei ca. 340 angegeben und dieser sinkt immer weiter bis auf 250 z.B. . Das Rädchen ist dabei so eingestellt, dass das zweite Lämpchen gerade anfängt zu leuchten (entspricht wohl dem grünen Lämpchen, von dem du beim Schwellwert sprichst). Ich kann noch nicht genau sagen wie lange diese aklimatisierung dauert, aber sollte der richtige Wert nicht direkt angezeigt werden? Stimmt was mit meinem Sensor eventuell nicht?

      Antworten
      • Danach sind die Werte aber konsistent und machen Sinn? Wenn ja, würde ich mir darüber keine all zu großen Gedanken machen. Nur falls die Schwankungen dauerhaft sind, müsste man mal weiter schauen, woran es liegen kann.

  7. Hallo!

    Gibt es noch weitere Sensoren, um die feuchte zu Messen?
    Wie sieht es mit TDR-Sonden, Gipsblockelektroden und Tensiometern aus?

    Antworten
  8. Basiert scheinbar auf diesem Sensor:
    ramser-elektro.at/shop/bausaetze-und-platinen/giess-o-mat-sensor-bausatz/

    Antworten
    • Die Pinbelegung ist gleich, ab Model 2B hat der Pi einfach mehr GPIOs. SCLK ist das selbe wie CLK auf deinem Schaubild (S steht für SPI). Wie du sieht, sind die Pin Nummern (23) ja auch identisch.

      Antworten
  9. Hallo Felix!
    Werden die Werte (wenn ich 6 feuchtigkeitssensoren an einen wertewandler anschließe) über einen GPIO für alle sensoren an den raspberry weitergegeben oder wie funktioniert das?

    Antworten
  10. Nochmal ein paar Fragen:
    Wie filterst du die Werte sodass du nur aussagekräftige nehmen kannst?
    Wie lässt du dir diese dann in Prozenten angeben?
    Da ich diesen Prozentwert später importieren möchte, wäre es gut wenn ich dann nur genau einen Prozentwert ausgegeben bekomme. Wie geht das?

    Herzlichen Dank schon einmal!

    Antworten
  11. Moin,

    ich hab das 3 Wochen mit einem Blumentopf getestet. Habe nun Wochenlang daran Gearbeitet einen PI inkl. 8er Relais und auf Platine mit Anschlüssel gelöteten MCP3008 in ein Outdoor fähiges Gehäuse zu Bringen. Funktioniert soweit super. PI wird per POE mit Strom versorgt und ließt nun seit Wochen die Temperatur und Luftfeuchtigkeit aus und erstellt mir super Statistiken.

    Nun sollten mit dem Bodenfeuchtigkeit Messer weiteres zum Einsatz kommen z.B. die Relais die Magnetventile zum Bewässern schalten sollen. Problem nur, nun hab ich mein MCP3008 draußen ins Gehäuse gesetzt und anschlossen, nun bekomme ich von draußen Werte die im Sekundentakt zw. 1023 und 510 schwanken. Wieso? Drin im Blumentopf (zur Kalibrierung mit der Erde aus dem Garten) habe ich Schwankungen von maximal 5 gehabt. Und nun von 500.

    Einziger Unterschied, im Garten hängt der Fühler hinter 1,5Meter Schaltdraht. Das kann doch aber nicht für solche Wert-Schwankungen sorgen? Maximal für einen anderen Wert, oder sehe ich das Falsch?

    Bei Interesse, hier ein paar Bilder:
    http://www.imghost.eu/album/jC

    Antworten
    • Kannst du mit einem Multimeter mal die Spannung, die im Kasten ankommt, messen? Kann gut sein, dass der Spannungskabel bei dem Kabel so hoch ist.

      Antworten
      • Ich bin mir jetzt nicht ganz sicher welche Spannung du meinst. Die der PI bekommt, oder die vom PI am Modul ankommt?

Hinterlasse einen Kommentar

Deine Email Adresse wird nicht veröffentlicht.

Blog abonnieren

Abonniere Tutorials-RaspberryPi, um kein Tutorial mehr zu verpassen!