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.

Ein Programm muss lediglich die Datei w1_slave auslesen.

Mit cat w1_slave kann die Temperatur ausgelesen werden. Hier entspricht t=21500 einer Temperatur von 21.500 °C.

Hintergrund

Software

Environment aktivieren

Aktiviere die Python-Environment

Die Programmierung erfolgt nun immer mit der gewählten Umgebung!

source ~/devel/projects/course_env/bin/activate

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

Temperature

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

Ausführen des Programms

pi@raspi88:~/devel/projects/temperature/src $ ./temperature.py 
Temperatur: 21.25 °C
projekt/python_projekt_ds18b20_digitaler_temperatursensor.1771602868.txt.gz · Zuletzt geändert: von torsten.roehl