Raspberry Pi – DS1820 Temperatursensoren auslesen

RaspiDS1820FritzingIch habe hier schon in einigen Beiträgen gezeigt wie man mit dem Arduino
mittels der 1-wire Temperatursensoren DS1820 die Temperatur ermitteln und ausgeben kann.

Wer meint dass diese Aufgabe, also Temperatur ermitteln und Temperatur ausgeben, mit dem Arduino einfach ist, der hat das noch nie mit dem Raspberry Pi gemacht.

Ich hätte nie gedacht dass man die Temperatur eines oderer mehrerer Sensoren
am 1-Wire Bus des Raspberry Pi so einfach und ohne eine Zeile programmieren zu müssen, auslesen kann. Klar wenn man die Temperatur nun auf einer Website anzeigen oder diese per eMail verschicken will, dann muss schon die eine oder andere Zeile programmiert werden, aber darum soll es in diesem Beitrag ja nicht gehen.

  • Benötigte Teile
  • GPIO Pinbelegung des Raspberry Pi 2
  • 1-Wire Protokoll aktivieren
  • Raspberry Pi – DS1820 Temperatursensoren verbinden
  • Temperatur auf Website ausgeben (PHP)
  • Temperatur über Terminal (Python) ausgeben

 

Benötigte Teile

  • 1 x Raspberry Pi 2
  • 1 x Breadboard,
  • Jumperkabel (männlich -> weiblich)
  • 1 oder mehrere DS1820 Temperatursensoren
  • 1 x 4,7kOhm Widerstand

 

GPIO Pinbelegung des Raspberry Pi 2

PinBelegungRaspberryPiModelB+

 

1-Wire Protokoll aktivieren

Um auf den 1-Wire Bus  des Raspberry zugreifen zu können, an dem die DS1820 Sensoren angeschlossen werden, reicht es ein paar Kernel Module zu laden.

Aber Achtung: Hier gibt es einige grundlegende Veränderungen ab der Kernel Version 3.18.3 zu älteren Kernel-Versionen.

Prüfen Sie als erstes mal mit  lsmod ob die benötigten Kernel Module „w1_gpio“ und „w1_therm“ nicht schon geladen wurden.

Sollte dies nicht der Fall sein, prüfen Sie als nächstes welche Kernel Version Sie benutzen.
Geben Sie dazu den folgenden Befehl ins Terminal ein.

uname -r

Wenn Sie jetzt eine Version größer oder gleich 3.18.3 angezeigt bekommen, machen Sie mit dem Menüpunkt „Kernel-Version >= 3.18.3“ weiter ansonsten überspringen Sie diesen Teil und gehen direkt zu dem Punkt „Kernel-Version < 3.18.3“

Kernel-Version >= 3.18.3

Öffnen Sie die Datei „/boot/config.txt“

sudo vim /boot/config.txt

fügen Sie ganz unten folgende Zeile ein.

dtoverlay=w1-gpio,gpiopin=4,pullup=on

Hier können Sie auch den GPIO-Pin für die 1-wire Unterstützung ändern.

Ende Kernel-Version >= 3.18.3

 

Kernel-Version < 3.18.3

Wenn Sie eine Kernel Version älter als 3.18.3 benutzen, können Sie die Kernel Module mit folgendem Befehl laden.

sudo modprobe w1-gpio pullup=1 && sudo modprobe w1_therm

pullup=1 teilt dem Modul mit dass eine parasitäre Stromversorgung über einen Pull-up-Wiederstand vorhanden ist.

Um nicht nach jedem Neustart des Raspberry Pi die Module von Hand erneut laden zu müssen, schreiben wir diese in die Datei „/etc/modules“.
Das machen Sie entweder mit dem Befehl

sudo echo >> /etc/modules w1-gpio && sudo echo >> /etc/modules w1_therm

oder ganz klassich indem Sie die Datei „/etc/modules“ mit einem Editor öffnen

sudo vim /etc/modules

und die folgenden zwei Werte von Hand an das Ende der Datei eintragen.

w1-gpio
w1-therm

Speichern Sie die Datei nun indem Sie die Taste ESC und anschließend die Tasten : W Q und Enter drücken.

Ende Kernel-Version < 3.18.3

Starten Sie Ihren Raspberry Pi mit sudo reboot neu und prüfen Sie als nächstes erneut mit dem Befehl lsmod ob die Kernel Module „w1_gpio“ und „w1_therm“ richtig geladen wurden.

 

Raspberry Pi – DS1820 Temperatursensoren verbinden

Für jeden Sensor den Sie am 1-wire Bus anschließen, wird im Verzeichnis „/sys/bus/w1/devices/“ ein neues Unterverzeichnis erstellt.
Der Name des Unterverzeichnisses setzt sich aus dem Family-Code des Sensors und seiner eindeutigen Identifikationsnummer zusammen.

Übersicht der Family-Codes
DS1820 = 10
DS18S20 = 10
DS18B20 = 28
DS1822 = 22

Verbinden Sie also wie im folgenden Bild zu sehen einen oder mehrere Sensoren mit dem Raspberry Pi.
Bei dem Widerstand handelt es sich um einen 4,3kOhm Widerstand.

RaspiDS1820Fritzing
Springen Sie nun mit folgendem Befehl in das zuvor genannte Verzeichnis und lesen Sie dessen Inhalt aus.

cd /sys/bus/w1/devices/ && ls

Da ich wie auf dem Bild zu sehen zwei Sensoren angeschlossen habe, von denen einer ein DS18S20 und einer ein DS18B20 ist, werden bei mir nun folgende Einträge angezeigt.

10-000802573877  28-000003beaee3  w1_bus_master1

Dabei stehen die beiden Verzeichnisse, deren Verzeichnisname mit 10- bzw. 28- beginnen für die 2 angeschlossenen Sensoren.

Wechseln Sie nun in eines der „Sensor-Verzeichnisse“ und lassen Sie sich den Inhalt des Verzeichnisses ausgeben

cd 10-000802573877 && ls

Sie sehen in dem Verzeichnis eine Datei mit dem Namen „w1_slave“
Lassen Sie sich den Inhalt dieser Datei mit folgenden Befehl ausgeben.

cat w1_slave

Die Ausgabe sollte nun in etwa so aussehen

37 00 4b 46 ff ff 02 10 e1 : crc=e1 YES
37 00 4b 46 ff ff 02 10 e1 t=27625

Am Ende der ersten Zeile sehen Sie die Prüfsumme (CRC) und die Information, ob der Temperaturwert richtig gelesen (YES) werden konnte.
Der Wert hinter t= steht für die aktuell ermittelte Temperatur des Sensors in tausendstel Grad Celsius.
Auf die Genauigkeit von 3 Stellen nach dem Komma sollte man hier nicht so viel geben. Wenn man das Datenblatt des DS1820 Sensors zur Hand nimmt, wird man sehen dass die reale Genauigkeit bei +-0,5 Grad Celsius liegt.

Um nun also den richtigen Temperaturwert zu erhalten muss man einfach den angezeigten Wert durch 1000 dividieren.
Bei wurden also 27,625 Grad Celsius oder real 27,6 Grad Celsius ermitteln.

Wenn man statt dem Verzeichniss eines Sensors mal in das Verzeichnis „w1_busmaster“ wechselt und sich mit ls den Inhalt ausgeben lässt, wird man auf die Datei „w1_master_slaves“ stoßen.

Schauen Sie sich doch mal mit „cat w1_master_slaves“ den Inhalt an.
Sie werden die Namen der erkannten Sensoren sehen.

10-000802573877
28-000003beaee3

Diese Ausgabe ist super praktisch wenn man z.B. ein Script schreiben will, mit dem man sich die Temperaturen sämtlicher Sensoren ausgeben lässt. Stellen Sie sich vor, Sie müssen mal einen Sensor wechseln oder tauschen. Jetzt müssten Sie die Sensor-Identifikationsnummer in Ihren Scripten von Hand anpassen. Wenn Sie den Inhalt dieser Datei in Ihren Scripts einbeziehen können Sie sich diese Arbeit im Nachhinein ersparen.

 

Temperatur auf Website ausgeben (PHP)

Da ich auf meinem Raspberry Pi auch einen NGinx Webserver installiert habe, habe ich mir direkt auch ein kleines PHP-Script geschrieben mit dem ich über das Internet die Temperatur der verschiedenen Sensoren anzeigen lassen kann. Später werde ich das PHP-Script mal dahingehend erweitern dass die Sensor-Identifikationsnamen wie oben beschrieben aus der Datei „w1_busmaster/w1_master_slaves“ ausgelesen und genutzt werden.

sudo mkdir /var/www/html/temperatur && cd /var/www/html/temperatur && sudo vim index.php

RaspiDS1820PHPAusgabet

<html>
<head>
  <title>Temperatursensoren</title>
  <style type="text/css">
    .box { margin:50px auto; width:800px;}
    .room { line-height:100px;width:500px; float:left; font-size:50pt; color:#009999; }
    .temp { line-height:100px;width:300px; float:left; font-size:50pt; color:#green; }
    .shadow { text-shadow: 0 0 5px #123; }
  </style>
</head>
<body>

<?php
#Mit folgender Zeile kann man die Verzeichnisse der angeschlossenen Sensoren auslesen
#Für jeden Sensor der angeschlossen wird, wird automatisch ein Unterverzeichnis erstellt
#cat /sys/bus/w1/devices/w1_bus_master1/w1_master_slaves


$sensors = array("Wohnzimmer"=>"28-000003beaee3",
                "Schlafzimmer"=>"10-000802573877");


foreach ($sensors as $room => $directory)
{
  $temp = exec('cat /sys/bus/w1/devices/'.$directory.'/w1_slave |grep t=');
  $temp = explode('t=',$temp);
  $temp = $temp[1] / 1000;
  $temp = round($temp,2);
  $temp = number_format($temp,1,',','.');

  echo "<div class=\"box\">";
  echo "<div class=\"room\">".$room.":</div>\n";
  echo "<div class=\"temp shadow\"> ". $temp . " °C</div>\n";
  echo "<div style=\"clear:both;\"></div>\n";
  echo "</div>";
}
?>
</body>
</html>

 

Temperatur über Terminal (Python) ausgeben

Ich melde mich an meinem Account (pi) an und lege zunächst das Verzeichnis „Scripts“ in meinem Home-Verzeichnis an. Dann springe ich in dieses Verzeichnis und lege die Datei „getOneWireTemperature.py“ an.

mkdir Scripts/temperatur && cd Scripts/temperatur && vim getOneWireTemperature.py

Fügen Sie nun folgenden Quelltext in die Datei „getOneWireTemperature.py“ ein und speichern Sie die Datei.

#!/usr/bin/python
# -*- coding: utf-8 -*-

# Import der Module
import sys
import os

# 1-Wire Slave-Liste lesen
file = open('/sys/devices/w1_bus_master1/w1_master_slaves')
w1_slaves = file.readlines()
file.close()

# Fuer jeden 1-Wire Slave aktuelle Temperatur ausgeben
for line in w1_slaves:
  # 1-wire Slave extrahieren
  w1_slave = line.split("\n")[0]
  # 1-wire Slave Datei lesen
  file = open('/sys/bus/w1/devices/' + str(w1_slave) + '/w1_slave')
  filecontent = file.read()
  file.close()

  # Temperaturwerte auslesen und konvertieren
  stringvalue = filecontent.split("\n")[1].split(" ")[9]
  temperature = float(stringvalue[2:]) / 1000

  # Temperatur ausgeben
  print(str(w1_slave) + ': %6.1f °C' % temperature)

sys.exit(0)

Machen Sie diese Datei nun mit folgendem Befehl ausführbar.

chmod +x getOneWireTemperature.py

Sie können die Datei nun mit folgendem Befehl aufrufen um sich die Tempoeratur aller angeschlossenen Sensoren ausgeben zu lassen.

./getOneWireTemperature.py

Die Ausgabe sieht dann so aus.

10-000802573877:   21.3 °C
28-000003beaee3:   21.4 °C

 

Ich hoffe ich konnte in diesem Beitrag verständlich machen wie man mit einfachen Mitteln die Temperature eines oder mehrerer DS1820 Sensoren mit dem Raspberry Pi auslesen kann.

Über Enrico S.

Programmierer, Webdesigner, Grafiker, Blogger, Screencaster, Arduino- und eMobility Enthusiast.

Ein Kommentar zu “Raspberry Pi – DS1820 Temperatursensoren auslesen

  1. HI.
    Super Tutorial! Danke dafür.
    Ich nutze das ganze, u mdie Temperatur in einem kleinen Netzwerkschrank zu überwachen.
    Ich hab leider keinerlei Programmiererfahrung, würde aber das ganze gerne erweitern. Vllt. kannst du mir dazu einen Tipp geben.

    Ich will, das der Pi bei einem bestimmten Temperaturwert, zB. 30 Grad, einen Shutdownbefehl an einen Windowsserver absetzt. Ist so etwas realisierbar?

Schreibe einen Kommentar

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