Der DS18B20 Sensor wandelt analoge Temperaturen in digitale um. Die Daten überträgt er seriell an den Raspberry Pi über ein sogenanntes 1-wire-Interface. Der DS18B20 hat den Vorteil, dass man sehr einfach bis zu zehn dieser Sensoren an einen Raspberry über gemeinsame Leitungen anschließen kann.
Sie benötigen einen Rasperry Pi mit Raspi-OS. Wie Sie Raspi-OS aufsetzen, lesen Sie hier …
Eine Übersicht über alle Raspberry Pi bezogenen Artikel …
Beschaltung
Abb. 1 zeigt die Beschaltung des DS1820. Der Widerstand mit 4,7 Kilo-Ohm ist ein sogenannter Pull-Up-Widerstand und sorgt dafür, dass der Anschluss DQ eine definierte Spannung hat.
Abb. 1: Beschaltung des Temperatursensors DS1820
Verkabelung des DS1820 mit dem Raspberry Pi
Den Sensor DS1820 stecken Sie nun auf das Breadboard, möglichst genau so wie in Abb 2. Achtung: Die flache Seite zeigt zu den Kabeln, falsch herum verkabelt zerstört den Sensor
mit Anschluss GND 1 (Ground) in E1,
Anschluss DQ 2 (Signal) in E2,
Anschluss VDD 3 (3,3 V) in E3.
Abb. 2: Verkabelung des Raspberry Pi mit dem Sensor DS1820
Sensor in E1, E2 und E3
Widerstand in C2 und C6
Jumperkabel in A1 und Pin 39
Jumperkabel in A2 und Pin 40
Jumperkabel in A6 und Pin 17
Erklärung: Die Abrundung des Sensors muss in Richtung F schauen, siehe Abb. 2
Es ist auch möglich, den Temperatursensor über nur zwei Anschlussleitungen mit dem Raspberry zu verbinden („parasitäre Spannungsversorgung“). Beim Betrieb mit mehreren parallelen Sensoren im Außeneinsatz hat sich diese Lösung allerdings als weniger stabil entpuppt.
Vorbereiten des Raspberry Pi für die Temperaturmessung
Schritt 1: Konfigurationsdatei config.txt im Verzeichnis /boot mit nano öffnen:
sudo nano /boot/config.txt
Schritt 2: Folgenden Inhalt unten in config.txt hinzufügen:
dtoverlay=w1-gpio,gpiopin=21
Erklärung:
Für den verbunden Pin muss die GPIO-Nummer angeben werden.
Beispiel: Verbunden mit Pin 40 (=GPIO Nummer 21)
Beipiel 2: Verbunden mit Pin 11 (=GPIO Nummer 17)
Wollen Sie den Anschluss für etwas anderes verwenden, müssen Sie den Eintrag wieder auskommentieren, indem Sie ein „#“ davorschreiben
Schritt 3: System rebooten (damit die Änderungen gültig werden) mit
sudo reboot
Schritt 4: Geben Sie folgende Befehle in die Konsole ein
update 12.06.2021, aktuelles Raspi-OS: der komplette Schritt 4 konnte weg gelassen werden.
sudo modprobe w1-gpio pullup=1 sudo modprobe w1-therm
Schritt 5: Gehen Sie mit cd ins Verzeichnis für die angeschlossenen 1-wire-Geräte
cd /sys/bus/w1/devices/
und geben sie den Befehl
ls
ein, um eine Übersicht die Temperatursensoren zu erhalten.
Es sollten zwei Ordner vorhanden sein, die so ähnlich aussehen wie
28-00000XXXXXXX W1_bus_master1
Schritt 6: Gehen Sie in das Verzeichnis, das so heißt wie die Zahlenkolonne, z.B.
cd 28-00000XXXXXXX
Schritt 7: Lesen Sie testweise die Temperatur aus mit
cat w1_slave
Erklärung: Der Befehl cat zeigt den Inhalt einer Datei an.
Abb. 9: Ausgabe des DS1820
Erklärung: t=18875 muss durch 1000 geteilt werden, um die Temperatur 18,875 °C zu erhalten
Ein Python-Programm für die Temperaturmessung erstellen
Schritt 1: Datei für das Python-Programm mit nano anlegen mit
nano temp.py
Schritt 2: Schreiben Sie den Quellcode in die Datei:
#!/usr/bin/python # misst Temperaturen mit DS1820 import time while 1: time.sleep(2) #Die Devicenummer 28-0000074b57ed muss angepasst werden #und so lauten wie Ihr Verzeichnis tempfile = open("/sys/bus/w1/devices/28-0000074b57ed/w1_slave") inhalt = tempfile.read() tempfile.close() tempdata = inhalt.split("\n")[1].split(" ")[9] temperatur = float(tempdata[2:]) temperatur = temperatur/1000 print "Temperatur betraegt: " + str(temperatur) + " Grad"
und speichern Sie die Dateien mit Strg+o, schließen Sie nano mit Strg+x.
Schritt 3: Geben Sie dem Programm Ausführungsrechte:
sudo chmod 777 temp.py
Schritt 4: Führen Sie das Programm aus mit dem Befehl
./temp.py
Fassen Sie den Sensor mit Daumen und Zeigefinger an. Die Temperatur sollte sich erhöhen.
Erläuterung zum Quellcode:
#!/usr/bin/python ….. sorgt dafür, dass Ihr Quelltext direkt mit dem Programm Python ausgeführt wird
import time ….. bindet Funktionen für die Zeitbehandlung mit ein
while 1: … damit startet eine Endlosschleife
time.sleep(2) … wartet zwei Sekunden
inhalt = tempfile.read() … liest den Inhalt einer Datei in die Variable mit dem Namen inhalt
tempfile.close()
tempdata = inhalt.split(„\n“)[1].split(“ „)[9]
temperatur = float(tempdata[2:])
temperatur = temperatur/1000 … die drei Zeilen extrahieren die Temperatur
print „Temperatur betraegt: “ + str(temperatur) + “ Grad“ …. die Temperatur wird formatiert ausgegeben.
Sie sollten nun alle zwei Sekunden eine neue Zeile mit der aktuellen Temperatur auf dem Bildschirm sehen (Abb. 3).
Abb. 3 Screenshot mit der Ausgabe der Daten des DS18B20
Bei mir ist es leider so, dass das w1_slave File bei jeder 2 – 4 Abfrage leer ist. Daher läuft dann auch das Python-Programm in einen Fehler. Hat das sonst noch jemand? Wenn das File nicht leer ist, passt die Temperatur auch.
Hallo Claus,
wir haben 3 DS1820 über eine Leitungslänge von jeweils ca.15m angeschlossen, das funktioniert problemlos. Jetzt sollte ein vierter DS1820 ebenfalls mit einer Leitungslänge von 13m hinzukommen, sobald ich den anschließe sind die Daten der andern 3 weg. Kann es sein das wir bei der Leitungslänge den Widerstand verändern müssen. Die Leitungen haben einen Eigenwiderstand jeweils von 1,8 Ohm.
Vielleicht weis jemand eine Lösung.
VG Thomas
Hallo Thomas, der Leitungswiderstand ist nicht störend (ich arbeite mittlerweile mit 100 Ohm Schutzwiderständen in den Zuleitungen, damit mir beim verpolen nichts durchbrennt).
Bis zu 12 DS18B20 hatte ich an einer Leitung, das funktioniert. Was nicht gut funktioniert sit, wenn die Versorgungsspannung unter 2,4 Volt sinkt (Erfahrungswert).
Außerdem kanibalisieren sich die Datenübertragungen etwas. Um den Effekt abzumildern, verwende ich tatsächlich mittlerweile unterschiedliche Pull-Up-Widerstände bei 3,3V Versorgungsspannung:
bis 4 Sensoren: 4,7k
5-8 Sensoren: 3,3k
ab 9 Sensoren: 2,8k
Achtung ein kleiner Fehler ist hier zu Beginn!
Das gelbe Kabel wird in der Darstellung in den GPIO24 (Pin 18) reingesteckt, aber das ist falsch!
Das gelbe Kabel muss in das 3V3 (Pin 17) gesteckt werden. Quasi gleich gegenüber vom Pin 18.
Trotzdem eine gute Hilfe, aber ich hab mich 1 Stunde rumgeärgert wieso es nicht funktioniert.
Ist beim Bild für die Verkabelung das gelbe Kabel nicht falsch ? Sollte doch beim 3.3V Anschluss in der Reihe darunter sein.
Guten Abend Claus,
habe mich nun auch mit den DS1820 beschäftigt und wollte eigentlich im Laufe des kommenden Jahres meine Heizungsregelung auf Komplett digital umstricken.
Aber:
Der Befehl „cat“ liest eigentlich nur den Inhalt einer Datei aus, aber ich habe doch noch gar keinen Befehl zur Wandlung der Temperatur dem DS1820 gegeben? Wie kann da eine aktuelle Temperatur drin stehen?
Des Rätsels Lösung legt in dem OS des Raspi: (ob es bei andern OS ähnlich habe ich jetzt nicht geforscht!)
Wird das One Wire Interface im Raspi Config enabled, dann wird (nach meiner Messung) automatisch und ohne weiteres Zutun alle acht Sekunden der Bus master (also der raspi) aktiv. Wahrscheinlich nur mit „Wer ist da“ und Auslese Befehl
So steht dementsprechend die aktuelle Temperatur in der entsprechenden Datei. Darüber hinaus wird bei einem Konsole cat Befehl für die entsprechende Datei diese vorher nochmals aktualisiert.
Selbst wenn ich also gar keine Temperaturen abfrage, habe ich immer Verkehr auf der Datenleitung. Eigentlich sollten die Leitungen ja verdrillte Leitungen sein, aber bei meiner oben genante Heizungsregelung sind das nur einfache Unterputzleitungen. Und die führen darüber hinaus auch noch sternförmig zu der Regelung. Würde also andauend mehr oder weniger heftig HF mäßig stören. und ob es überhaupt funktioniert?!
Tja, da muß ich erst mal weiter schauen …
Grüße und schon einen Tag zu früh einen Guten Rutsch
Norbert
Das wird sicherlich funktionieren (technisch). Was mich bisher von der kompletten Eigenlösung abgehalten hat, ist, dass diese dann von mir als Person abhängig ist. Meine Frau kann also nicht einfach einen Installateur anrufen, der es repariert, wenn ich gerade nicht da bin …