Raspberry Pigilt für Raspberry Pi OS Bookworm
Wie lese ich einen DS18B20-Temperatursensor am Raspberry Pi aus?
Ein DS18B20 soll am Raspberry Pi die Temperatur messen, im Aquarium, im Gewächshaus oder am Heizungsrohr. Der Sensor hat drei Beine oder drei Kabel und spricht das 1-Wire-Protokoll. Wie schließe ich ihn an, und wo finde ich danach den Messwert?
Lösung
Kurz: VDD an 3,3 V, GND an Masse, Daten an GPIO 4, dazu ein 4,7-kΩ-Widerstand zwischen Daten und 3,3 V. Dann 1-Wire mit sudo raspi-config einschalten und neu starten. Der Messwert steht in /sys/bus/w1/devices/28-…/temperature, in tausendstel Grad.
Welche Pins verbinde ich?
| DS18B20 | Raspberry Pi | Hinweis |
|---|---|---|
| VDD | Pin 1 (3,3 V) | nicht an 5 V |
| DQ (Daten) | Pin 7 (GPIO 4) | 4,7 kΩ nach 3,3 V |
| GND | Pin 6 (GND) | gemeinsame Masse |
Der Widerstand zwischen der Datenleitung und 3,3 V heißt Pull-up. Ohne ihn findet der Pi den Sensor nicht. Bei der wasserdichten Kabelversion sind die Adern meist rot für VDD, schwarz für GND und gelb für die Daten. Festgelegt ist das nicht, manche Hersteller nehmen Blau oder Weiß für GND. Vertauschte Versorgungsadern können den Sensor zerstören, deshalb vorher das Produktdatenblatt lesen oder mit dem Multimeter prüfen.
1-Wire einschalten
sudo raspi-config
Dort Interface Options → 1-Wire → Ja wählen und neu starten. Wer lieber die Datei bearbeitet:
In /boot/firmware/config.txt die Zeile dtoverlay=w1-gpio ergänzen. Ohne weitere
Angabe nutzt sie GPIO 4, einen anderen Pin wählt dtoverlay=w1-gpio,gpiopin=17.
Temperatur auslesen
ls /sys/bus/w1/devices/
cat /sys/bus/w1/devices/28-*/temperature
Jeder DS18B20 erscheint als Ordner mit einer eigenen Nummer, die mit 28- beginnt. Die Datei
temperature liefert zum Beispiel 21437, das sind 21,437 °C. Diese Datei gibt es seit
Linux-Kernel 5.10, unter Bookworm also immer.
Mit Python auslesen
from pathlib import Path
for sensor in Path("/sys/bus/w1/devices").glob("28-*"):
wert = int((sensor / "temperature").read_text()) / 1000
print(f"{sensor.name}: {wert:.1f} °C")
Das Skript liest alle angeschlossenen Sensoren nacheinander aus.
Nachträge
Kann ich mehrere Sensoren an eine Leitung hängen?
Ja, dafür ist 1-Wire gemacht. Alle Sensoren kommen parallel an dieselben drei Leitungen, der eine 4,7-kΩ-Widerstand reicht. Jeder DS18B20 hat eine fest eingebrannte Nummer und erscheint als eigener Ordner. Welcher Sensor welcher ist, findet man heraus, indem man einen kurz in der Hand anwärmt.
Warum zeigt der Sensor 85 °C?
85 °C ist der Wert, den der DS18B20 nach dem Einschalten im Speicher hat, bevor er zum ersten Mal gemessen hat. Taucht er im Betrieb auf, hat keine gültige Messung stattgefunden. Meist bekommt der Sensor nicht genug Strom oder die Leitung ist gestört. Zuerst Anschluss und Pull-up prüfen.
Wie lang darf die Leitung sein?
Einige Meter sind mit dem 4,7-kΩ-Pull-up meist kein Problem, am besten mit verdrillten Adern. Für wirklich lange Busse empfiehlt Analog Devices in der Application Note 148 eine aktive Treiberschaltung mit kleinerem Pull-up. Deren Werte beziehen sich auf 5 V und lassen sich nicht einfach auf die 3,3 V des Pi übertragen. Wer viele Meter überbrücken muss, setzt besser einen fertigen 1-Wire-Busmaster ein.
Funktioniert das auch am Raspberry Pi 5?
Ja, der Weg über raspi-config ist derselbe. Für den Pi 5 enthält Raspberry Pi OS eine eigene
Fassung des Overlays namens w1-gpio-pi5, weil der Pi 5 seine Pins über einen anderen Baustein
steuert. Einzelne Nutzer berichten auf dem Pi 5 von aussetzenden Messungen an GPIO 4. Wer das beobachtet,
weicht mit gpiopin= auf einen anderen Pin aus.
Wie genau ist der DS18B20?
Laut Datenblatt misst er von −55 °C bis +125 °C und ist zwischen −10 °C und +85 °C auf ±0,5 °C genau. Für Raum, Aquarium und Heizung reicht das gut. Wer genauere Werte braucht, vergleicht ihn einmal mit einem geeichten Thermometer und rechnet die Abweichung heraus.
Was steht in der Datei w1_slave?
Ältere Anleitungen lesen w1_slave statt temperature. Die Datei enthält zwei Zeilen:
Endet die erste mit YES, war die Übertragung fehlerfrei, und am Ende der zweiten steht der Wert
als t=21437. Die Datei temperature liefert nur die Zahl und ist einfacher zu
verarbeiten.