Temperatursensor an Raspberry Pi

DS18B20 Temperatursensor für den Raspberry PiIn 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 DS18B20Temperatursensor DS18B20: PIN-Belegung

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.

Pinbelegung DS18B20
Pinbelegung DS18B20

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.

31 Gedanken zu „Temperatursensor an Raspberry Pi“

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

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

    2. @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

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

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

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

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

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

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

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

  6. 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?

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

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

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

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

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

  9. 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 ?

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

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

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

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

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

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

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

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

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

  18. 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…

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

Schreibe einen Kommentar

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