Benutzer-Werkzeuge

Webseiten-Werkzeuge


projekt:python_projekt_ds18b20_digitaler_temperatursensor

Dies ist eine alte Version des Dokuments!


Projekt DS18B20 digitaler Temperatursensor

☚ zurück

FIXME BEITRAG IN ENTSTEHUNG

Überblick

  • Voraussetzungen
    • 1-Wire aktivieren
  • Hardware ansteuern
    • Messprinzip
  • Software
    • Environment aktivieren
    • Beispiel Programm

Details

Voraussetzungen

In raspi-config wird die 1-Wire Schnittstelle aktiviert. Danach ist das Verzeichnis /sys/bus/w1/devices vorhanden. Hier erscheint dann der Sensor, falls er korrekt angeschlossen wurde.

Hardware ansteuern

Für Einsteiger sind die etwas teureren Fertigmodule sinnvoller, da die benötigten Zusatzbauteile (hier insbesondere der 4,7 kΩ Pull-Up-Widerstand) bereits integriert sind. Dadurch kann der DS18B20 mit nur drei Leitungen (VCC, GND, DATA) direkt angeschlossen und getestet werden.

Verdrahtung:

  • GND → Raspberry Pi GND
  • DATA → GPIO4 (Pin 7)
  • VCC → 3.3 V (Pin 1)
Wichtig

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

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.

Wichtig:

- 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.

Beispiel:

80 01 7f 80 7f ff 10 10 49 : crc=49 YES 80 01 7f 80 7f ff 10 10 49 t=24000

Hier entspricht t=24000 einer Temperatur von 24.000 °C.

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()

projekt/python_projekt_ds18b20_digitaler_temperatursensor.1771602207.txt.gz · Zuletzt geändert: von torsten.roehl