Dies ist eine alte Version des Dokuments!
Inhaltsverzeichnis
Projekt DS18B20 digitaler Temperatursensor
BEITRAG IN ENTSTEHUNG
Überblick
- Voraussetzungen
- 1-Wire aktivieren
- Hardware ansteuern
- Messprinzip
- Software
- Environment aktivieren
- Beispiel Programm
Details
Voraussetzungen
Hardware ansteuern
Verdrahtung:
- GND → Raspberry Pi GND
- DATA → GPIO4 (Pin 7)
- VCC → 3.3 V (Pin 1)
Es kann nicht jeder beliebige GPIO-Pin verwendet werden. Standardmäßig ist dafür GPIO4 vorgesehen. Andere Pins müssen explizit über das Device-Tree-Overlay konfiguriert werden; dies wird hier nicht behandelt.
Beim DS18B20 gilt:
- Auflösung: 0,0625 °C (12 Bit)
- Genauigkeit: ±0,5 °C
Messprinzip
![]() |
Mit cat w1_slave kann die Temperature ausgelesen werden. Hier entspricht t=21500 einer Temperatur von 21.500 °C. |
Das Messprinzip ist unter Linux sehr einfach
Nach Aktivierung von 1-Wire über raspi-config stellt der Kernel die Temperatur als Datei im Sysfs bereit, z. B.: /sys/bus/w1/devices/28-000000714b90/w1_slave
Der Name 28-000000714b90 ist die eindeutige 64-Bit-ROM-ID des DS18B20 und ist bei jedem Sensor unterschiedlich (Familiencode 28).
Ein Programm muss lediglich diese Datei auslesen. Die gesamte 1-Wire-Kommunikation übernimmt der Kernel.
- Bei jedem Lesezugriff auf diese Datei stößt der Kernel automatisch eine neue Temperaturumwandlung an.
- In der ersten Zeile signalisiert „YES“, dass die CRC-Prüfung erfolgreich war.
- In der zweiten Zeile steht der Temperaturwert hinter „t=“ in Milligrad Celsius.
Details
Software
Environment aktivieren
DS18B20 API
- hardware.py
import glob import time # ----------------------------- # API-Funktionen ds18b20 # ----------------------------- SENSOR_TIMEOUT = 1 # Sekunden def is_sensor(): """Prüft, ob mindestens ein DS18B20 Sensor angeschlossen ist""" sensors = glob.glob("/sys/bus/w1/devices/28-*") return len(sensors) > 0 def get_sensor(): """Gibt den ersten DS18B20 Sensor zurück oder None""" if not is_sensor(): return None sensors = glob.glob("/sys/bus/w1/devices/28-*") return sensors[0] + "/w1_slave" def get_temperature(): """Liest Temperatur vom ersten Sensor aus, None bei Fehler oder Timeout""" sensor_file = get_sensor() if sensor_file is None: return None start_time = time.time() while True: with open(sensor_file, "r") as f: lines = f.readlines() if lines[0].strip().endswith("YES"): break if time.time() - start_time > SENSOR_TIMEOUT: return None time.sleep(0.1) temp_line = lines[1] temp_str = temp_line.split("t=")[1] return float(temp_str) / 1000.0
Test
- temperature.py
from hardware import get_temperature def main(): temp = get_temperature() if temp is not None: print(f"Temperatur: {temp:.2f} °C") else: print("Sensor nicht gefunden!") if __name__ == "__main__": main()




