510T3HTj3BL

GPIO

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:

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.



, , , , ,


28 Kommentare

  1. Conrad sagt:

    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.

  2. Hauschi sagt:

    Hi Felix,
    wieder mal großes Lob…
    Hier mal ne frage…
    Wollte vielleicht damit ne bewässerung für chilis basteln. Kann ich die zu steuernde tauchpumpe direkt an den gpio und gnd hängen oder muss ich die über transistor oder relais steuern?
    Würde dann wohl diese pumpe nehmen: http://www.amazon.de/gp/aw/d/B014RBHDDE/ref=mp_s_a_1_1?qid=1455838673&sr=8-1&pi=AC_SX236_SY340_FMwebp_QL65&keywords=mini+tauchmotorpumpe

    • Felix sagt:

      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

  3. Tom sagt:

    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

    • Felix sagt:

      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

  4. Mace sagt:

    Mege nice!! Funktioniert
    Danke man!

  5. Matze sagt:

    Vielen Dank für dieses Tutorial – prima Ergänzung für meine Gartenbewässerung!

  6. 1234 sagt:

    Ich verwende diesen Sensor:
    https://www.mikrocontroller.net/topic/335407

    Riesiger Vorteil:
    Er funktioniert kapazitiv.
    Er ist also gegen Erde isoliert.
    Dadurch kommt es zu keinerlei Korrision und dadurch gelangen keine
    Metall Ionen ins Erdreich.

    Es wird eine Frequenz ausgegeben, welche leicht auswertbar ist.

    mfG
    Ponos

  7. Stefan sagt:

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

    • Rudik sagt:

      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!!

  8. Stefan sagt:

    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

    • Felix sagt:

      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.

  9. Daniel sagt:

    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?

    • Felix sagt:

      Hast du SPI freigeschaltet?

    • Daniel sagt:

      In der raspi-config habe ich es aktiviert. In der config.txt steht es auf on und die Blacklist ist leer.

    • Felix sagt:

      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.

    • Daniel sagt:

      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?

    • Felix sagt:

      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.

  10. Tomek sagt:

    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?

    • Felix sagt:

      In welchen Bereichen? Sind die Veränderungen recht klein (<20) oder größer?

    • Tomek sagt:

      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?

    • Felix sagt:

      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.

  11. Martin Wiesel sagt:

    Hallo!

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

  12. h sagt:

    Moin,

    hast du auch ein Schaltplan für den ersten Pi ? z.B. den Pin SCLK gibts auf dem
    https://developer-blog.net/wp-content/uploads/2013/09/raspberry-pi-rev2-gpio-pinout.jpg Plan nicht.

    MFG

    • Felix sagt:

      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.

Schreibe einen Kommentar

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

Blog abonnieren

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