Raspberry Pi: Temperaturmessung mit dem DS1820
In dieser Anleitung zeigen wir euch wie ihr ganz einfach den Raspberry Pi zur Temperaturmessung einsetzen könnt. Dabei wollen wir mit dem „DS1820“-Sensor nur die Umgebungstemperatur bestimmen, im Gegensatz zu Komplettplatinen mit Luftfeuchtigkeit, Luftdruck & Co. ist die reine Temperaturmessung so wesentlich günstiger umsetzbar. Dies macht vor allem Sinn wenn ihr gleich mehrere Sensoren einsetzen wollt (z.B. zum Messen der Innentemperatur und Außentemperatur).
Warum den DS1820 und kein Fertigmodul?
Wer lediglich die reine Temperatur messen will kommt mit dem einzelnen Sensor wesentlich günstiger als mit einem Fertigmodul. Ein weiterer Vorteil ist, dass man den DS1820 problemlos in Reihe schalten kann – somit werden keine zusätzlichen GIPO-Pins auf dem Raspberry Pi belegt & verschwendet. Preislich liegt man bei dem Einzelsensor und dem Anschlussmaterial bei 1,50 – 2 Euro pro Stück – Fertigmodule liegen im Bereich von 6 – 25 Euro (je nach Ausstattung).
Die Sensoren erfassen einen Bereich von -55°C bis +125°C, die Toleranz liegt bei Temperaturen zwischen -10° bis + 85°C bei lediglich 0,5°C Abweichung. Es existieren von dem Sensor auch Wasserfeste-Varianten* für den Außenbereich.
Einkaufsliste
Logischerweise wird ein Raspberry Pi* mit entsprechender Stromversorgung und installiertem Raspbian vorausgesetzt. Außerdem werden neben dem eigentlichen DS1820-Sensor noch 3 Verbindungskabel sowie ein Widerstand benötigt. Möchte man weitere Sensoren anschließen werden nur noch weitere Verbindungskabel benötigt, da man das ganze problemlos in Reihe schalten kann.
DS1820 Sensor (10er Pack) – ca. 13 Euro – siehe z.B. bei Amazon*
Verbindungskabel (40er Pack) – ca. 6 Euro – siehe z.B. bei Amazon*
4,7 kΩ Widerstand (gemischt, 1280 St.) – ca. 10 Euro – siehe z.B. bei Amazon*
Schaltplan
Das anschließen eines DS1820-Sensors an den Raspberry Pi ist einfach, neben drei Verbindungskabeln benötigt ihr noch einen 4,7 k Ohm Widerstand den ihr zwischen der 3,3 Volt Stromversorgung und der GPIO-Verbindung anbringt. Die Kabel können nun an den Temperatursensor angeschlossen werden – wenn ihr die flache Seite des Sensors betrachtet findet ihr links „Ground“, in der Mitte den Anschluss für „GPIO“ und rechts den Pin für die 3,3-Volt Versorgung.
Wenn ihr einen weiteren Sensor anschließen möchtet könnt ihr einfach eine Direktverbindung zwischen dem ersten DS1820 herstellen. Dadurch wird weder ein zusätzlicher Widerstand noch wird ein Pin auf eurem Raspberry für die Datenübertragung benötigt – alle Temperatursensoren können auf einem Kabel gleichzeitig die Daten senden.
Vorbereitung
Um den DS1820-Sensor überhaupt mit eurem Raspberry Pi ansprechen zu können muss zunächst der entsprechende GPIO-Pin in der Boot-Configuration festgelegt werden. Dazu ruft im Hauptverzeichnis mittels folgendem Konsolen-Befehl die Boot-Config eures Raspberrys auf:
sudo nano /boot/config.txt
Scrollt anschließend ziemlich ans Ende der Datei und fügt die folgende Zeile ein – beachtet bzw. ändert hier den GPIO-Pin, an den ihr den Temperatursensor angeschlossen habt:
dtoverlay=w1-gpio,gpiopin=17,pullup=on
Speichert die Datei anschließend mit der Tastenkombi Strg + X und bestätigt die Änderungen mit „J“. Jetzt solltet ihr noch eine Änderung in der „/etc/modules“-Datei vornehmen – um diese zu bearbeiten, führt im Hauptordner folgenden Befehl aus:
sudo nano /etc/modules
Anschließend fügt ihr folgende Angaben der Datei hinzu und speichert diese anschließend wieder ab:
# /etc/modules
w1-gpio pullup=1
w1-therm
Führt nun einen Reboot eures Raspberrys durch, damit die neue Boot-Configuration übernommen werden kann.
Nun müssen wir noch die erforderlichen Softwaretreiber laden, um damit unter anderem die ID des Sensors festzustellen – dazu führt folgende Konsolenbefehle aus, damit ist die Grundeinrichtung des Temperatursensors abgeschlossen:
sudo modprobe w1-gpio pullup=1
sudo modprobe w1-therm
Temperatur auslesen
Nachdem alle oberen Schritte erfolgreich ausgeführt wurden, sollten sich nun im Unterordner /sys/bus/w1/devices neue Ordner mit den gefundenen Sensoren vorfinden. Dazu geben wir folgendes in die Konsole ein:
cd /sys/bus/w1/devices
dir
Mit „dir“ listen wir nun die Verzeichnisse auf – der DS1820-Sensor lässt sich an einer Zahlennummer wie z.B. „28-0000075a79f2“ erkennen – die genaue Nummer ist bei jedem Sensor unterschiedlich. Mit „cd SENSORNUMMER“ wechseln wir nun ein weiteres Verzeichnis tiefer und fragen nun mit dem „cat w1_slave“-Befehl den Temperatursensor ab:
cd 28-00000XXXXXXXX
cat w1_slave
Als Ausgabe sollte es dann wie in dem nachfolgenden Screenshot aussehen, am ende der Textzeile befindet sich ein „t=22250“ – die Temperatur beträgt in diesem Fall 22,250 °C:
Temperatur mit Programm ausgeben
Die Temperaturmessung funktioniert also schonmal, jedoch ist die Abfrage noch relativ umständlich und auch die ordentliche Formatierung des Messwerts fehlt noch. Um dieses Problem zu beheben schreiben wir uns ein kleines Python-Programm um den Messwert leichter auswerten zu können:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
print("Temperatur")
print("##########")
# ACHTUNG - Hier müsst ihr die Nummer gegen eure eigene austauschen
file = open('/sys/bus/w1/devices/' + '28-0000075a79f2' + '/w1_slave')
filecontent = file.read()
file.close()
stringvalue = filecontent.split("n")[1].split(" ")[9]
temperature = float(stringvalue[2:]) / 1000
print("%5.3f °C" % temperature)
sys.exit(0)
Kopiert einfach dieses Programm in eure Zwischenablage und legt mittels Konsolenbefehl eine neue Datei an:
sudo nano temperatur-test.py
Nachdem ihr nun mittels Strg + V das Programm in das Konsolenfenster kopiert habt, speichert das Programm noch mit Strg + X ab und bestätigt wieder mit Taste „J“. Anschließend könnt ihr das Python-Programm mit folgendem Befehl testen:
sudo python temperatur-test.py
Die Konsolen-Ausgabe sollte nun wie folgt aussehen – und damit ist diese Anleitung vorerst auch abgeschlossen, falls ihr noch Fragen habt schreibt diese einfach in die Kommentare:
stringvalue = filecontent.split(„n“)[1].split(“ „)[9]
stringvalue = filecontent.split(“ \n“)[1].split(“ „)[9]
funktionierte bei mir
„Ein weiterer Vorteil ist, dass man den DS1820 problemlos in Reihe schalten kann […]“
Eigentlich ist es parallel. 😉