In diesem Beitrag möchte ich erklären, wie man mit dem Temperatursensor DS18B20 die Temperatur messen kann. Den Sensor gibt es z. B. günstig bei amazon, für wenige Euro das Stück (~ 2-3€). Außerdem können neben den normalen Sensoren auch wasserdichte (waterproof) Temperatursensoren verwendet werden. Ein Wasserdichter unterscheidet sich meist nur am Metallmantel, damit dieser auch im Wasser benutzt werden kann.
Temperatursensor DS18B20
Ein gewöhnlicher DS18B20 besitzt drei Pins (siehe Bild) und ein wasserdichter DS18B20 drei Kabel, Rot (VCC / 3,0V bis 5,5V), Weiß (DATA / 1-Wire) und Schwarz (GND). Der Messbereich liegt zwischen -55°C und +125°C, die Messgenauigkeit bei ± 0,5°C. Über das 1-Wire-Interface wird der, in 750 ms gemessene, Wert als 12-Bit Wert übertragen. Mit einer Konfiguration sind außerdem noch Auflösungen von 9, 10 und 11-Bit möglich. Je kleiner die Auflösung, desto kürzer ist die Messzeit. Da bei der Herstellung jedes Sensors ein eindeutiger Code (ID) mitgegeben wird, können mehrere Temperatursensoren parallel an den gleichen 1-Wire des Raspberry Pi benutzt werden.
Temperatursensor an den Raspberry Pi anschließen
Damit die aktuelle Temperatur auch gemessen werden kann, muss der Sensor via GPIO angeschlossen werden. Dabei wird VCC an die 3,3V angeschlossen, DATA an den GPIO 4 (Pin 7) und GND des Temperatursensors an den GND des Raspberry Pi. Des Weiteren muss zwischen den 3,3V und GPIO 4 ein 4,7k Ohm Widerstand eingesetzt werden. Ein weiterer Sensor kann einfach parallel zwischengeschaltet werden.
Mit der Kernelversion (uname -r) 3.18.3 hat sich die Handhabung der Module geändert. Nachfolgend bitte die richtige Anleitung befolgen.
Temperatur auslesen (Vor Kernelversion 3.18.3)
Als Erstes müssen die erforderlichen Module geladen werden:
sudo modprobe w1-gpio sudo modprobe w1-therm
Nun sollte unter „/sys/bus/w1/devices/“ ein oder mehrere Ordner im Format xx-xxxxxxxxxxxx auftauchen, wenn nicht, dann sind entweder die Module nicht erfolgreich geladen oder der/die Sensor(en) nicht richtig angeschlossen. Ob die Module geladen sind, kann mit folgendem Befehl überprüft werden:
lsmod
In der folgenden Liste sollte nun eine Zeile wie diese auftauchen:
wire 24973 2 w1_gpio,w1_therm
Temperatur auslesen (Ab Kernelversion 3.18.3)
Öffne bitte die Datei /boot/config.txt und füge am Ende folgende Zeile(n) hinzu:
dtoverlay=w1-gpio,gpiopin=4,pullup=on
Nach einem Neustart des Raspberry Pi sollte der Temperatursensor funktionieren.
Ab hier gilt die Anleitung wieder für alle Kernelversionen
Jeder Ordner der nun unter „/sys/bus/w1/devices/“ auftaucht, ist jeweils ein Temperatursensor. Der Ordnername (Format: xx-xxxxxxxxxxxx) ist gleichzeitig die ID des jeweiligen Sensors. In jedem dieser Ordner sind noch weitere Ordner und Dateien. Jedoch benötigen wir nur die Datei w1_slave, denn in dieser versteckt sich die Temperatur.
cat /sys/bus/w1/devices/xx-xxxxxxxxxxxx/w1_slave
Ausgabe:
81 01 4b 46 7f ff 0f 10 71 : crc=71 YES 81 01 4b 46 7f ff 0f 10 71 t=24062
Uns interessiert nur das Ende der Ausgabe (t=24062). Der Wert muss vorher noch durch 1000 geteilt werden. In diesem Beispiel liegt die aktuelle Temperatur bei 24,06°C.
Mit folgendem Befehl lässt sich nur der Wert auslesen:
cat /sys/bus/w1/devices/xx-xxxxxxxxxxxx/w1_slave | sed -n "s/.*t=(.*)/1/p"
Shell-Script Beispiel
Der Befehl kann nun noch in ein Script übernommen werden und die aktuelle Temperatur gerundet anzeigen. Ein kleines Beispiel eines Shell-Scripts.
#!bin/sh temp=$(cat /sys/bus/w1/devices/xx-xxxxxxxxxx/w1_slave | sed -n "s/.*t=(.*)/1/p") temp=`echo "scale=3; $temp / 1000" | bc` printf "Aktuelle Temperatur: %05.2f°Cn" $temp
Beachte: Für das Script wird das Paket „bc“ benötigt. Falls nicht vorhanden, mit „apt-get install bc“ installieren.
Module beim Booten laden
Leider ist es so, dass die Module nach jedem Neustart wieder neu geladen werden müssen. Damit wir das nicht jedesmal selber machen müssen, können wir die Module in die Datei /etc/modules eintragen:
sudo nano /etc/modules
An das Ende der Datei tragen wir nun folgendes ein:
w1-gpio w1-therm
Nun nur noch speichern und fertig. Jetzt werden die Module bei einem Neustart des Raspberry Pi von alleine geladen und somit sofort einsatzbereit.
Hallo
Super Tutorial aber das mit der gerundeten Temperatur will mir einfach nicht klappen…. ich bekomme immer dieselbe Temperatur mit 5 Stellen ausgegeben 🙁
ich kopiere den Befehl per Copy´n´Paste, Tipfehler kanns also keiner sein
Gruß
Stefan
Hallo Stefan,
erstmal vielen Dank.
Hast du auch das erforderliche Paket „bc“ installiert? Bekommst du sonst irgendwelche Fehler angezeigt? Ansonsten schreibe mir mal eine E-Mail mit einem Screenshot der Datei.
Gruß
Willy
@Stefan Mühlbauer:
Ich habe das Skript leicht abgeändert – sed hat bei mir nicht das gewünschte Ergebnis gebracht .
Versuche es mal hiermit:
#!/bin/bash
while true; do
temp=$(cat /sys/bus/w1/devices/28*/w1_slave | grep -i t= | cut -c30-);
temp=$(echo "scale=2; $temp/1000" | bc -l)
echo $temp" Grad";
sleep 1;
done
Prima Anleitung, hab mir den sensor gleich bestellt, kost ja wirklich nix mehr! Werds denn in den nächsten Tagen testen 😀
Schön dass es solch gute Infos gibt
Gruß Thomas
Hi Willy,
hab das mit der GIOP 4 und Temperatur noch nicht so ganz verstanden.
Wieviel Sensoren kann „mann“ am GIOP 4 parrallel anschließen?
Wie differenziert der Rasp die Teile?
Muss der „Vorwiderstand“ der Anzahl der Sensoren angepasst werden?
Danke!!!!
Winfried
Hallo Winfried,
nach meinem Kenntnisstand unterstützt der Treiber bis zu 10 Sensoren gleichzeitig. Mit entsprechender Anpassung an der Software lassen sich auch mehr anschließen.
Jeder Sensor hat eine eindeutige Kennung, z. B. „28-00000566e360“. Im Verzeichnis „/sys/bus/w1/devices/“ werden dann alle Sensoren anhand ihrer Kennung aufgeführt und können so einzeln angesprochen werden.
Der Vorwiderstand muss nicht verändert werden, es reicht ein 4,7k Ohm aus.
Gruß
Willy
Vielen Dank für die wirklich gelungene Anleitung!
Gleich geteilt 😉
Hi willy!
Ich habe den DHT22 Sensor. Mit Adafruit kann ich diesen problemlos auslesen. Allerdings sehe ich diesen nicht unter “/sys/bus/w1/devices/”. Seltsam isses schon.
Und wenn der dann dort auftaucht… ist er auch mit deiner Pi Control nutzbar?
Grüße und danke für den hammer Blog!
Hallo Alex,
wenn er unter /sys/bus/w1/devices/ auftaucht, sollte er auch im Pi Control angezeigt werden.
Ich werde vorrausichtlich einen DHT22 bis Ende Januar zugeschickt bekommen, dann werde ich für diesen auch ein Plugin programmieren.
Gruß
Willy
Habe das Selbe Problem und hoffe auf eine antwort :-d
Hallo Willy,
vielen Dank für dein Tutorial 🙂
Mich würde noch interessieren, wozu der 4,7kOhm Widerstand genau benötigt wird? und was die nachträglich geladenen Module machen?
Ich finde es ein bisschen schade dass in vielen Büchern und Internetbeiträgen zwar geschrieben wird, was man machen muss um z.B. ein Display anzusteuern oder die Temperatur auszulesen, aber in den seltensten Fällen auch dazu geschrieben wird wofür diese Schritte nötig sind.
Trotzdem eine tolle Seite die du hier hast und danke für deine Antwort.
Hallo Julian,
der Widerstand sorgt dafür, dass der Pegel auf „High“ gehalten wird, wenn der Sensor ihn nicht gegen Masse zieht um ein „Low“-Signal zu signalisieren.
Die beiden Module sind erforderliche Kernelmodule unter anderem für den Temperatursensor. Da diese nicht dauerhaft geladen sind, müssen diese noch explizit geladen werden.
Gruß
Willy
Hallo, bei mir kommt bei cat /sys/bus/w1/devices/00-80000000000/w1_slave immer nur Datei oder Verzeichnis nicht gefunden. Woran könnte das liegen?
Hallo Oliver,
bitte entschuldige die späte Antwort.
Für mich ist die ID „00-80000000000“ ungültig und weißt vermutlich auf eine fehlerhafte Erkennung des Sensors hin. Viele der von mir getesteten Sensoren haben mit „28-“ begonnen.
Gruß
Willy
Moin,ich habe eine Frage zum pullup
Brauche ich in diesem falle „pullup=1“ in den Moduls?
Bezieht sich das auf den 4,7 resistor oder gibts da noch einen internen?
Habe 3 am laufen,nach 4 bis 5h stürzt der pi ab, lass ich nur 2 laufen gibts keine probs. Egal welchen ich trenne,hast du evtl ne Idee?
Hallo drs,
leider verstehe ich deine Frage nicht ganz. 🙁
Hast du die Sensoren zufällig über längere Kabel angeschlossen? Ansonsten kannst du auch mal vorsichtig die 5V des Raspberry Pi verwendet statt der 3,3V für die Spannungsversorgung der Sensoren.
Gruß
Willy
Hallo Willy,
wo werden die Daten für die Temperatursensoren abgelegt? Oder anders gefragt, wie schaut’s mit dem Speicherplatz aus, wenn z.B. 5 Sensoren über ein halbes Jahr Daten sammeln.
Gruß
Thomas
Hallo Thomas,
Raspian selber erstellt zu den Temperatursensoren keine Logs. Lediglich mit einem Plugin im Pi Control werden Log-Dateien erstellt. Diese Log-Dateien beinhalten jedoch nur einen Zeitraum von 7 Tagen und werden somit nach einer Woche Laufzeit nicht an Speicherplatz wachsen. Mein angeschlossener Temperatursensor erreicht bei 7 Tagen eine Dateigröße von circa 34.000 Byte. Rechnet man die 5 Sensoren und ein halbes Jahr drauf, bei durchgehender Beschreibung alle 5 Minuten, kommen lediglich 4,2 MByte zusammen. Die Log-Dateien der Temperatursensoren im Pi Control werden unter /[Pfad zum Webserver]/resources/plugins/temp/logs/ gespeichert.
Gruß
Willy
Habe einen RPI3 mit dem neuen Raspbian mit Kernel 4.4.9-v7+
in /sys/bus/w1/devices/ wird nichts angezeigt
Was kann ich noch tun ?
Hallo Willy,
Vielen Dank für deinen Blog und den gelungenen Anleitungen.
Habe mir gerade einen Temperatursensor zugelegt und in Betrieb genommen.
Bin aber beim Shell-Script das ich mit Copy and Paste übernommen habe ein bisschen gestolpert.
Habe den Code bei mir etwas anpassen müssen.
#!bin/sh -> #!/
temp=$(cat /sys/bus/w1/devices/xx-xxxxxxxxxxxx/w1_slave | sed -n „s/.*t=//p“)
temp=`echo „scale=3; $temp / 1000“ | bc`
LANG=C printf „Aktuelle Temperatur %05.2f°C\n“ $temp -> \n
Ich hatte mit dem sed-Befehl bis jetzt nicht zu tun und hatte ihn deshalb gerne übernommen, die Variable war bei mir aber leer. Ich habe daher den Teil (.*) entfernt. Ebenfalls musste ich die /1/ entfernen denn diese wurde darauf vor den Wert als Zahl dazu gefügt. (124062).
Ich habe wie gesagt den SED Syntax nicht ganz verstanden und weiß daher nicht ob in der Praxis noch Fehler auftauchen.
BC verwendet den Punkt als Komma. Meine Systemcodierung auf de_DE.UTF-8 hat aber bei der printf Ausgabe die Variable nicht umsetzen können. Dies konnte ich mit dem Vorsetzen von LANG=C beheben.
Gruß Georg
Hi zusammen,
wie lang darf die Entfernung zwischen Sensor und Raspberry maximal sein? Ich würde gerne die Wassertemperatur in einem Außenbecken messen, aber das ist ca. 30m vom Raspi, der im Gebäude ist entfernt.
Würde das trotzdem klappen?
Danke Euch!
Hallo Markus,
ich kann leider keine genaue Antwort geben, allerdings gehe ich davon aus, dass du mit dem hier gezeigten Aufbau Probleme bei 30 Metern bekommen könntest.
Es finden sich bei Google allerdings einige Beiträge zu Aufbauten mit größeren Entfernungen.
Gruß
Willy
Hallo,
Kann ich anstatt dem 4,7k Ohm Widerstand auch einen 5,1k Ohm Wiederstand benutzen?
Gruß
Niklas
Hallo Willy,
Gibt es eine Möglichkeit die DS18B20 an einem I2C Modul in PIControl auslesen zu können?
Würde einen meiner PIs gerne als kleine Überwachung in der Fernwärmezentrale einbauen. Ich ahbe den PI 3+ bereits mit den 6 Sensoren und OWFS am laufen über den RPI2 von Sheepwalk. Daten wären also schon ad. Meine anderen Sensoren laufen über iobroker und owfs, da ich dieses Gerät aber separat per wlan verfügbar machen wollte wäre deine Lösung die einfachere.
MfG
Torsten
Hallo!
Bin Anfänger ! Habe das Shell Script kopiert und bekomme die Fehlermeldung „Invalid Syntax“
#!bin/sh
temp=$(cat /sys/bus/w1/devices/10-0008032a338a/w1_slave | sed -n „s/.*t=(.*)/1/p“)
temp=`echo „scale=3; $temp / 1000“ | bc`
printf „Aktuelle Temperatur: %05.2f°Cn“ $temp
Danke Im voraus!
Kann es sein das ab Kernel 4.xx es noch anders funktioniert?
Ich hbae eine komplett andere Dateiverzeichnis ab /etc/bus/w1/devices
Das Verzeichnis 28-xxxxxx gibt es nicht mehr.
Dafür aber ein Verzeichnis w1-master, mit eine Menge w1 Dateien
Die Temperatur finde ich aber noch nicht
Hallo Willy,
hast Du mal versucht, Temperaturen unter Null Grad zu messen? Ich habe einen Banana Pi Mini mit dem Onewire Modul. Das lief den Sommer über ganz prächtig und ich habe täglich mit rrd tolle Bildchen gebastelt. Wenn die Temperaturen aber unter Null Grad gehen, hängt sich der Treiber scheinbar auf. Ein paar Minuten läuft das meist, aber recht flott geht es kaputt. Die Datei w1_slave verschwindet dann aus dem Verzeichnis /sys/bus/w1/devices/28-00000……./. Die Kernel Module sind noch geladen und ich kann sie auch nicht entladen. Ich bekomme das nur durch reboot zurückgesetzt. Das ist aber doof. Hast Du eine Idee, wo ich mal gucken könnte?
HJH.
Hallo,
ich habe den Sensor BMP280 an meinen Raspberry angeschlossen und kann diesen über i2c auslesen. Was kann ich tun, damit die Temperatur auch von Pi Control ausgelesen werden kann oder ist das nicht möglich?
Danke!
Gruß
Pascal
Hallo Willy,
erst einmal Danke für das Tutorial. Die Schaltung habe ich wie beschrieben aufgebaut und der Temp-Sensor liefert soweit auch Daten, wenn ich diese mit cat /sys/bus/w1/devices/xx-xxxxxxxxxxxx/w1_slave abfrage ( die x habe ich natürlich mit der ID meines Sensors ersetzt). Was aber nicht funktioniert ist die Abfrage mit cat /sys/bus/w1/devices/xx-xxxxxxxxxxxx/w1_slave | sed -n „s/.*t=(.*)/1/p“ , da bekomme ich keine Ausgabe. Hast Du da einen Tip für mich? Betsen Dank.
Gruß
Christian
Hallo, erst einmal Respekt für das Geleistete hier! Sehr gut und weiter so! 🙂
Ich habe eigentlich nur eine banale Frage:
„Ist es relativ simples das Plugin so umzubauen das es den Sensor zyklisch ausliest so das die WEB-Site nicht immer wieder aktualisiert werden muß nachdem sie aufgerufen wurde, so das auch die Statistik -mitläuft-?“
Das wäre echt klasse! 🙂
Viele Grüße…
Hallo Willy,
vielen Dank für Dein gutes Tutorial.
Im Script sind leider die Backslashes verloren gegangen.
der sed-Teil sollte lauten:
sed -n -e ’s/.*t=\(.*\)/\1/p“
Außerdem ist scale=3 etwas übertrieben, weil der Sensor sowieso nur eine Genauigkeit von 0,5°C hat.
also:
temp=`echo „scale=1; $temp / 1000“ | bc`
Ansonsten find ich das Tutorial super!
Viele Grüße
Roland