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.

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

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

Schreibe einen Kommentar

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