Im Artikel „Temperaturmessung mit dem Raspberry Pi“ haben wir mit einem Raspberry Pi den Temperatursensor DHT22 ausgelesen. Den deutlich günstigeren Sensor DS1820 haben wir im Artikel „Temperaturmessung mit dem Arduino“ mittels eines Ardiuno-Board angesteuert. Heute stellt sich uns die Frage, wie wir mittels eines Raspberry Pi drei oder mehrere DS1820 Temperatursensoren auslesen und die Temperaturwerte mit einem Python-Skript in separaten Dateien speichern.
Der DS1820 Temperatursensor ist sehr beliebt, da er sehr günstig und durch seine kleine Bauform sehr gute Einbaumöglichkeiten bietet. Im Gegensatz zum DHT22 kann er jedoch keine Luftfeuchtigkeit messen, was aber oftmals auch gar nicht gefordert wird.
Sehr interessant ist der Temperatursensor DS18b20. Bei diesem Sensor handelt es sich um einen wasserdichten Messfühler, der mit einem rund einem Meter langen flexiblen Kabel geliefert wird. Dieser Sensor eignet sich hervorragend für unterschiedliche Temperaturmessungen im Umkreis der Kabellänge.
Wir möchten im heutigen Projekt zwei DS18b20 Sensoren anschließen um mit ihnen zwei unterschiedliche Temperaturmessungen an einem elektrischen Gerät durchführen. Ein dritter Sensor, der klassische DS1820, soll auf der Platine verbleiben und als Referenz die Umgebungstemperatur messen. Für jeden Temperatursensor soll fortlaufen eine eigene Datei geschrieben werden, in die neben eines Zeitstempels die Werte des zugeordneten Temperatursensors geschrieben werden.
Die Vorbereitung – das Material
Für unser Projekt benötigen wir einen Raspberry Pi 3. Prinzipiell kann auch ein älterer Raspi diese Aufgabe erledigen. Wir nutzen hier jedoch das aktuelle Modell, da dieses bereits über einen WLAN-Adapter verfügt (ein Raspberry Pi Zero W sollte ebenfalls nutzbar sein).
Als Speicherkarte benötigen wir eine mindestens 8GB große SD-Karte. Bei einer Neuanschaffung sollte man eine 16GB große Karte bevorzugen.
Material
- Raspberry Pi
- SD-Karte (mind. 8GB)
- Netzteil
- DS1820 Temperatursensor
- DS18B20 IC digital Temperatursensor
- 4,7 K-Ohm Widerstand
- Diverse Kabel
- Steckboard
Der Anschluss an den Raspberry Pi erfolgt über den Pin 1 (3,3 Volt Spannung), Pin 6 (GND) und Pin7 (Datenleitung). Zwischen die 3,3Volt-Leitung und die Datenleitung wird ein 4,7 K-Ohm Widerstand geschaltet.
Die DS180 in Reihe schalten
Gemäß dem Schaubild sind die Temperatursensoren in Reihe zu schalten. Die Stromversorgung erfolgt über den Pin 1 (3,3 Volt Spannung) und Pin 6 (GND) des Raspberry. Für die Daten wird der Port GPIO4 verwendet.
Die Schaltung lässt sich beliebig erweitern. Es wird in jedem Fall nur ein Widerstand benötigt. Interessant wäre sicherlich zu erfahren, ob es eine maximale Anzahl an Temperatursensoren gibt.
Anschluss des DH1820
Vielleicht kann hier jemand für Aufklärung sorgen, warum es DH1820-Sensoren gibt, deren Polung vertauscht ist. Beachtet bitte, wie ich den Sensor eingebaut habe. Ich habe jedoch auch 1820-Sensoren in meiner Sammlung, die genau gedreht richtig angeschlossen werden.
Was passiert? Wenn der Sensor verkehrt herum angeschlossen ist, wird er sofort sehr heiß und brennt wahrscheinlich irgendwann durch.
Wenn er heiß wird, sofort den Strom trennen. Dann warten und den Sensor abkühlen lassen. Die Warnung klingt unnötig; ich habe mir jedoch schon die Finger verbrannt … 🙂
In meinem Fall konnte ich dann im abgekühlten Zustand den Sensor drehen und den Raspberry erneut starten. Der Sensor hat danach noch korrekt funktioniert.
Anschluss des DH18B20
Am Ende des Kabels des DH18B20 befinden sich drei Kabel in den Farben ROT, SCHWARZ und GELB. Zur besseren Orientierung habe ich die entsprechenden Kabel zum Pin bereits in diesen Farben gesetzt.
Es macht Sinn, die Enden der Kabel mit Pins zu versehen (verlöten), damit diese einfach auf ein Steckboard gesteckt werden können. Die blanken Litzen in das Steckboard zu stecken ist keine gute Idee.
Die Basis: Das Raspberry-Betriebssystem
Als Basis nehmen wir das Image „Rasbpian Lite“ des Rasbian-Projektes, welches Sie HIER herunterladen können. Wir das Image auf die SD-Karte kommt, haben wir im Artikel „Babyphone selber bauen: Der Raspberry Pi mit Handy als Überwachungskamera“ ausführlich beschrieben. Im Zweifelsfall auch das dort verlinkte Video anschauen.
Voraussetzung: Image auf SD-Karte kopiert, SSH-Datei vor dem ersten Start auf der SD-Karte erstellt.
Karte wurde in den Raspberry Pi eingelegt, der Raspberry gestartet und eine Putty-Verbindung mit dem Raspberry besteht.
Zuerst wird das Betriebssystem mit den nachfolgenden Befehlen auf den neusten Stand gebracht:
sudo apt-get update
sudo apt-get upgrade
Temperaturwerte der DH1820-Sensoren auslesen
Die Temperatursensoren sind an dem Raspberry angeschlossen, das Betriebssystem ist auf dem neusten Stand und eine Putty-Verbindung besteht – dann kann es losgehen.
Im ersten Schritt muß der 1-Wire Bus aktiviert werden. Dies geschieht mit den folgenden Befehlen:
sudo modprobe wire
sudo modprobe w1-gpio
sudo modprobe w1-therm
Damit die Module in Zukunft automatisch geladen werden, editieren wir eine Datei mit einem beliebigen Editor (hier: nano) mittels:
sudo nano /boot/config.txt
An das Ende der Datei werden die folgenden Zeilen angehängt:
# 1-Wire Temperatursensor, Daten an Pin 4
dtoverlay=w1-gpio
gpiopin=4
Hier definieren wir also auch , dass wir die Daten über den Pin „GPIO4“ auslesen möchten.
Mit dem folgenden Befehl starten wir den Raspberry durch:
sudo shutdown –r now
Was passiert nun? Wenn alles korrekt funktioniert, wird nun fortlaufend für jeden Sensor eine Datei im Filesystem des Raspberrys aktualisiert. Aus dieser Datei können wir dann die Temperatur extrahieren.
Zuerst gehen wir in das korrekte Verzeichnis un schauen uns den Ordnerinhalt an:
cd /sys/bus/w1/devices
ls
Hier sollten nun für jeden Sonsor ein Ordner auftauchen, dessen Name „etwas kryptisch“ ist. Beim Ordnernamen (in meinem Fall beispielsweise „28-0517a2b482ff“) handelt es sich um die individuelle Kennung des Sensors. Dies bedeutet, dass man hier also immer die Daten des speziellen Sensors findet.
Im Ordner befindet sich jeweils die Datei „w1_slave“. Es lohnt sich, die Datei einmal mit einem Editor (zum Beispiel „nano“) anzuschauen. Am Ende findet man den Wert „t=xxxxx“. Der Wert hinter „t=“ ist unser Temperaturwert ohne Komma.
Temperaturwerte mittels Python-Skript auslesen und in eine Datei schreiben
Im „root“ von „pi“ erstellen wir ein Python-Skript
nano auslesen.py
Der nachfolgende Code kann erst einmal zu Testzwecken hineinkopiert werden. Dann sind jedoch folgende Zeile(n) anzupassen:
temperatur = LeseAktuelleTemperatur('/sys/bus/w1/devices/28-0517a2b482ff/w1_slave')
Hier muss der kryptische Ordnername manuell an den im Dateisystem ersichtlichen Ordnernamen angepasst werden.
#!/usr/bin/python
# coding=utf-8
# auslesen.py
# Programm liest die drei DH1820 Sensoren aus und schreibt diese in jeweils eine Datei
#----------------
import os, sys, time
def LeseAktuelleTemperatur(pfad):
# 1-wire Slave Datei lesen
file = open(pfad)
filecontent = file.read()
file.close()
# Temperaturwerte auslesen und konvertieren
stringvalue = filecontent.split(„\n“)[1].split(“ „)[9]
temperature = float(stringvalue[2:]) / 1000
# Temperatur ausgeben
rueckgabewert = ‚%6.2f‘ % temperature
return(rueckgabewert)
Lauf = 0
Durchlauf = 120
WartenSek = 30
filename = time.strftime(„%Y%m%d.%m“)
while Lauf <= Durchlauf:
timestamp = time.strftime(„%d.%m.%Y %H:%M:%S“)
# Temperatur 1 messen
temperatur = LeseAktuelleTemperatur(‚/sys/bus/w1/devices/28-0517a2fd99ff/w1_slave‘)
print „1 – „, timestamp, „: „, temperatur, „°C“
f = open(filename + ‚_1.txt‘, ‚a‘)
f.write(timestamp + „;“ + temperatur + „\n“)
f.close();
# Temperatur 2 messen
temperatur = LeseAktuelleTemperatur(‚/sys/bus/w1/devices/28-0517a2b482ff/w1_slave‘)
print „2 – „, timestamp, „: „, temperatur, „°C“
f = open(filename + ‚_2.txt‘, ‚a‘)
f.write(timestamp + „;“ + temperatur + „\n“)
f.close();
# Temperatur 3 messen
temperatur = LeseAktuelleTemperatur(‚/sys/bus/w1/devices/28-031604ff71ff/w1_slave‘)
print „3 – „, timestamp, „: „, temperatur, „°C“
f = open(filename + ‚_3.txt‘, ‚a‘)
f.write(timestamp + „;“ + temperatur + „\n“)
f.close();
time.sleep(WartenSek)
Lauf = Lauf + 1
print "Temperaturabfrage beendet"
Was macht das Python-Programm?
Das Programm liest alle 30 Sekunden (Variable: „WartenSek = 30“) die drei Temperatursensoren aus. Für denen Sensor wird der Wert sowie ein Zeitstempel („timestamp“) fortlaufend in eine Datei geschrieben. Der Dateiname wird mittels Datum und einem angehängten „_1“ für den ersten Sensor generiert.
Die Variable „Durchlauf = 120“ gibt an, wieviel Durchläufe die Schleife haben soll. Bei 30 Sekunden Wartezeit und einem maximalen Durchlauf von 120 werden also eine Stunde lang alle Sensoren abgefragt und jeweils in einer Datei protokolliert.
Was kann man verbessern?
Das Programm hat mindestens zwei Punkte, die man verbessern kann. Zum einen der Sleep-Befehl. Dadurch, dass der Schleifendurchlauf nicht immer gleich lang ist, findet nicht wirklich alle 30 Sekunden eine Protokollierung statt. Eine Lösung wäre hier, gar keine Schleife zu nehmen, sondern das Skript so zu verändern, dass es nur einmal durchläuft und sich dann beendet. Über einen Cronjob könnte man dann das Skript zur gewünschten Zeit starten.
Die zweite „Schwachstelle“ sind die „hardcodierten“ Temperatursensoren. Als Lösung kann man das Verzeichnis „/sys/bus/w1/devices“ auslesen und so erkennen, wieviel Sensoren angeschlossen sind.
Über Anregungen, Verbesserungen und Meinungen freuen wir uns natürlich. Happy coding!
Hallo Rainer,
vielen Dnak für deine tolle Seite. Ich versuche gerade mit deiner Anleitung 3 DS20B18-Sensoren anzuschließen.
Den Python Code habe ich mit copy&paste übernummern und jediglich Gänsefüßchen und Kommas hochgesetzt. „“ und aus , ‚ wurde ‚ ‚
Nun bekomme ich in line 22 beim Temperaturauslesen eine Fehlermeldung und zwar:
SyntaxError: ‚return‘ outside function
Ich finde den Fehler leider nicht. Über einen Tipp würde ich mich sehr freuen.
Vielen Dank.
Guten Morgen, verlgeichend mit anderen Schaltbildern ist die Schaltung der Sensoren prallel 🙂
„Die DS180 in Reihe schalten
Gemäß dem Schaubild sind die Temperatursensoren in Reihe zu schalten…“
Ehrlich? Das funktioniert?
Auf dem Steckbrett ist jedenfalls eine Parallelschaltung der Sensoren zu sehen. Da hapert´s wohl bei ein paar Grundlagen der E-Technik.
Frank
Es geht hier nicht um die Stromversorung der Sensoren. Diese in Reihe zu schalten wäre ziemlich sinnlos, denn wenn mal einer ausfällt sind gleich alle tot. Es geht um die Datenleitungen die an einem GPIO hängen, was streng genommen auch keine Reihenschaltung ist und auch keine Parallelschaltung, sondern eine Aufschaltung.
Du wirst wahrscheinlich nicht richtig eingerückt haben, markiere alles was zur Funktion gehört(inkl. return) und drücke einmal Tab, sollte dann funktionieren 🙂
Viele Grüße
Pascal
Hallo
Ich habs versucht 10 Sensoren in reihe hängen, gehen leider max nur 5. Wollte RPi als Temperatur auslesegerät machen für meine Heizung, dass alles im Homebridge einknöpfen.
Es funktioniert tadellos aber wie schon gesagt mit max 5 Sensoren DS18B20. Leider
Kennt jemand eine Lösung wie man weitere Sensoren dazu hängen kann? ohne natürlich größeren aufwand.
Mit freundlichen Grüßen tomgme
Mal versuchen, den Pull-Up-Widerstand schrittweise zu reduzieren.
Rasputin