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:
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
):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#!/usr/bin/python import spidev import os import time delay = 0.2 spi = spidev.SpiDev() spi.open(0,0) spi.max_speed_hz=1000000 def readChannel(channel): val = spi.xfer2([1,(8+channel)<<4,0]) data = ((val[1]&3) << 8) + val[2] return data if __name__ == "__main__": try: while True: val = readChannel(0) if (val != 0): print(val) time.sleep(delay) except KeyboardInterrupt: print "Cancel." |
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
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.
Ja, das ist möglich. Jeder Pin des MCP3008 kann ein analogen Signal umwandeln.
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
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
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
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.
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:
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
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
Mege nice!! Funktioniert
Danke man!
Vielen Dank für dieses Tutorial – prima Ergänzung für meine Gartenbewässerung!
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
Hat jemand Erfahrungen mit dem Feuchtigkeitssensor bei Pflanzen, die in Planzton bzw. in Seramis gepflanzt sind. Funktioniert das?
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!!
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
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.
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?
Hast du SPI freigeschaltet?
In der raspi-config habe ich es aktiviert. In der config.txt steht es auf on und die Blacklist ist leer.
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: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?
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.
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?
In welchen Bereichen? Sind die Veränderungen recht klein (<20) oder größer?
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?
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.
Hallo!
Gibt es noch weitere Sensoren, um die feuchte zu Messen?
Wie sieht es mit TDR-Sonden, Gipsblockelektroden und Tensiometern aus?
Kennt Ihr das: ?
https://github.com/Zentris/erdfeuchtemessung/wiki/kapazitiv
Basiert scheinbar auf diesem Sensor:
ramser-elektro.at/shop/bausaetze-und-platinen/giess-o-mat-sensor-bausatz/
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
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.
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?
Der MCP3008 ist ein Analog-Digital Wandler mit 8 Eingängen. Diese kannst du auslesen.
Das heißt sie werden alle über einen GPIO weitergegeben? Wie sähe das dann beim auslesen aus?
Hallo Jakob,
schau dir am besten mal diesen Artikel an: MCP3008: Am Raspberry Pi analoge Signale auslesen
Ein ADC wird per SPI an den Raspberry Pi angeschlossen und darüber werden die bis zu 8 Kanäle ausgelesen.
LG, Felix
Danke!!
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!
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
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.
Ich bin mir jetzt nicht ganz sicher welche Spannung du meinst. Die der PI bekommt, oder die vom PI am Modul ankommt?
Ich meinte die, die zurückkommt und gemessen wird. Du kannst aber beide mal messen.
wie kann ich den wert in prozent ausgeben lassen?
ich habe schon auf mehreren foren danach gesucht aber bin bis jetzt erfolglos geblieben
wäre super wenn mir wer helfen könnte
mfg michael
Du musst erst einmal die Werte bei voller Feuchtigkeit (100%) und Trockenheit (0%) messen. Dazwischen kannst du interpolieren.
Moin. Mit welchen Befehl fordere ich die Daten ab.
Hallo Felix,
Zuerst einmal vielen Dank für die tolle Seite und die super Tutorials.
Nachdem mir ein Kollege seinen Pi 1 geschenkt hat (und ich ihn seit dem hasse :D) habe ich mir nun etliche Komponenten geholt um dein Gewächshaus Tutorial für unsere armen Pflanzen nachzubauen. Dabei geht es nur um den Teil mit dem Feuchtigkeitssensor und dem Gießen mittels Pumpe.
Ich habe den Feuchtigkeitssensor (https://www.amazon.de/gp/aw/d/B01N3UHFT2/ref=yo_ii_img?ie=UTF8&psc=1) nach deiner Anleitung angeschlossen und bekomme auch auf Kanal 1 Werte. Allerdings sind die immer 512. manchmal schwankt es kurz nach 520 aber egal ob der Sensor an der Luft liegt, in der Erde steckt oder direkt in Wasser gehalten wird, der Wert ist 512. da das exakt die Hälfte der möglichen Werte ist bin ich noch skeptischer ob ich da nicht irgendwo einen Bock geschossen habe. Die Pinbelegung vom Pi 1 habe ich mir von einer anderen Seite besorgt. Das ebenfalls angeschlossene Relais bekomme ich auch ohne Probleme geschaltet.
Hast Du vielleicht aus der Hüfte ohne meine Verkabelung gesehen zu haben einen Tip was das sein könnte?
Lieben Dank
Andreas
Bei der Verkabelung ist nicht so viel falsch zu machen, daher würde ich eher auf ein Problem mit dem Sensoren an sich tippen.
Nachdem ich alles so gemacht habe wie im Guide, hatte ich erst Große Schwankungen, dann nur noch Werte ungleich null beim Starten des Shells und nun bekomme ich nur noch 0 Werte
Versuch mal den kapazitiven Sensor, der ist um einiges besser.
Hallo,
bei mir wird beim Auslesen des Bodenfeuchtigkeitssensors immer der selbe Wert angezeigt, egal ob an Luft oder vollständig in Wasser eingetaucht, woran kann das liegen?
Gruß
Die Sensoren sind leider nicht wirklich gut verarbeitet und dazu werden nur analoge Werte abgefragt. Besser ist der kapazitive Sensor.
Ich habe das Tutorial genau befolgt und immer den Wert 0 erhalten.
Habe mich daraufhin im Internet schlau gemacht und dann folgendes zum Programm hinzugefügt:
spi.max_speed_hz = 1000000
Jetzt funktioniert es.
Danke für das super Tutorial, bringt mich in meinem Projekt stark weiter. Ich hatte das Problem das immer nur Werte zwischen 252 und 254 angezeigt wurden. Das Problem war genau dass das Vuberg geschrieben hat, einfach diese Zeile einfügen. Dann hat man auch so gut wie kein Problem mehr das eine Null zurück kommt.
Moin!
Ich habe das Problem, dass wenn ich das Skript ausführe Lediglich die Zahlen 255 und 3 herausbekomme… völlig gleich ob ich den sensor nun in Wasser halte oder eben nicht.
Woran könnte das liegen?
Hi Felix,
wir fahren Dienstagfrüh in den Urlaub. Heute kam mir noch die Idee mit der automatischen Pflanzenbewässerung. Wenn alles gut läuft, bekomme ich Pumpen und Feuchtesensoren von Amazon am Montag. Ich habe soweit auch schon alles vorbereitet, theoretisch nur noch Pumpen und Sensoren anschließen und es müssten funktionieren (wäre das erste Mal, dass das so klappt 🙂 ). Nun die Frage: ich habe mir Feuchtesensoren gekauft, die genauso aussehen wie deine. Allerdings sind bei meinen 5 V als Betriebsspannung angegeben, du hast ja über 3,3 V angeschlossen. Handelt es sich hierbei um eine andere Version oder spielt es schlicht keine Rolle ob 3,3 V oder 5 V? Der analoge Ausgang würde bei 5 V Betriebsspannung ja sicherlich auch Werte zwischen 0 und 5 V ausgeben, oder?
Ich hatte daher eben schon mal den Trockenversuch gestartet und bei meinem AD/DA-Modul 5 V als Referenzspannung angelegt und über einen Poti moduliert, aber da kam nichts Sinnvolles bei raus. Das Modul hat eine Betriebsspannung von 3,3 V; geht die mögliche Referenzspannung dann auch nur bis 3,3 V?
Ich habe am Montagabend leider nur noch 1-2 h für das Projekt Zeit, ich will also bestmöglich vorbereitet sein 🙂
Gruß
Viktor
Bei mir funktioniert das ganze nicht. Mir wird immer nur der selbe Wert angegeben, egal wie feucht die Erde ist. Benutze allerdings den hier (https://www.conrad.at/de/p/bodenfeuchtesensor-me110-iduino-me110-1616242.html#productDownloads)
danke für die Hilfe
Ich habe leider das selbe Problem wie Ricki und freue mich über jegliche Hilfe zu diesem Thema. Ich habe alles nach Plan angeschlossen und auch nochmal geprüft.
Als Wert bekomme ich immer 252 ausgegeben.
Vielen Dank für das Tutoruil.
Aber leider bin ich am Verzweifeln.Ich bekomme als Wert immer 0. Läuft auf einem Raspi3 (Stretch). Auf dem Raps2 (Wheezy) läuft es ohne Probleme. Weiß jmd. Rat?
Vielen Dank
Hallo, bei uns hat es am Anfang funktioniert, jetzt kommt bei uns auch nur noch 0 raus. Alles wurde überprüft und der Sensor wurde ausgetauscht. Keine Ahnung woran es liegt.
Hallo, ich hatte das gleiche mit Rasbian Buster.
Geholfen hat bei mir die maximale SPI Clock Frequenz auf 1MHz zu stellen.
spi.max_speed_hz = 1000000
Vielen Dank für das Tutorial, hat bei mir super funktioniert!
Eine Anmerkung:
Die im Tutorial unter Zubehör beschriebenen Feuchtigkeitssensoren waren für mich nicht zu bekommen. Ich habe mir die Bodenfeuchtesensoren Sensor Modul V1.2 von AZ-Delivery gekauft. Diese müssen mit 5V ansatt 3,3 V betrieben werden. Das war der einzig wesentliche Unterschied zum Tutorial.