projekt:python_projekt_ds18b20_digitaler_temperatursensor
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| projekt:python_projekt_ds18b20_digitaler_temperatursensor [2026/02/20 08:04] – torsten.roehl | projekt:python_projekt_ds18b20_digitaler_temperatursensor [2026/02/23 12:09] (aktuell) – [Ausführen des Programms] torsten.roehl | ||
|---|---|---|---|
| Zeile 3: | Zeile 3: | ||
| [[python| ☚ zurück]] | [[python| ☚ zurück]] | ||
| - | FIXME BEITRAG IN ENTSTEHUNG | + | |
| + | //In diesem Projekt wird ein digitaler Temperaturfühler vom Typ DS18B20 am Raspberry Pi per 1-Wire-Schnittstelle betrieben. Nach Aktivierung der 1-Wire-Schnittstelle liefert der Kernel die Messwerte über das // | ||
| + | // | ||
| + | |||
| ====== Überblick ====== | ====== Überblick ====== | ||
| - | * Hardware ansteuern | + | |
| - | * Environment aktivieren | + | * 1-Wire aktivieren |
| + | | ||
| + | * Messprinzip | ||
| * Software | * Software | ||
| + | * Environment aktivieren | ||
| + | * Beispiel Programm | ||
| ---- | ---- | ||
| - | |||
| ====== Details ====== | ====== Details ====== | ||
| + | ===== Voraussetzungen ===== | ||
| - | <code python> | + | |{{ : |
| - | # ds18b20_smart.py | + | |<WRAP> In '' |
| - | import glob | + | |
| - | import time | + | |
| - | def is_sensor(): | + | ===== Hardware ansteuern |
| - | """ | + | |
| - | sensors | + | |
| - | return len(sensors) > 0 | + | |
| - | def get_sensor(): | + | Der DS18B20 kommuniziert über die 1-Wire-Schnittstelle. Dabei erfolgt die gesamte Datenübertragung seriell über die DATA-Leitung |
| - | """ | + | |
| - | Gibt automatisch den ersten Sensor zurück. | + | |
| - | Ruft intern is_sensor() auf. | + | |
| - | Gibt None zurück, wenn kein Sensor da ist. | + | |
| - | """ | + | |
| - | if not is_sensor(): | + | |
| - | return None | + | |
| - | sensors = glob.glob("/ | + | |
| - | return sensors[0] + "/ | + | |
| - | def get_temperature(): | + | |{{ :raspberry_pi: |
| - | """ | + | | Für Einsteiger sind die //etwas teureren Fertigmodule// |
| - | Liest die Temperatur vom ersten Sensor aus. | + | |
| - | Nutzt intern get_sensor(). | + | |
| - | Gibt None zurück, wenn kein Sensor gefunden wird. | + | |
| - | """ | + | |
| - | sensor_file = get_sensor() | + | |
| - | if sensor_file is None: | + | |
| - | return None # Clever: kein Fehler, einfach None | + | |
| - | with open(sensor_file, | + | |
| - | lines = f.readlines() | + | |
| - | while lines[0].strip()[-3: | + | |
| - | time.sleep(0.2) | + | |
| - | with open(sensor_file, " | + | |
| - | lines = f.readlines() | + | |
| - | temp_line = lines[1] | + | |
| - | temp_str = temp_line.split(" | + | |
| - | return float(temp_str) / 1000.0 | + | |
| - | # -------- Beispiel Nutzung -------- | ||
| - | if __name__ == " | ||
| - | temp = get_temperature() | ||
| - | if temp is None: | ||
| - | print(" | ||
| - | else: | ||
| - | print(f" | ||
| + | Verdrahtung: | ||
| + | |||
| + | ^ Modul ^ Raspberry Pi GPIO ^ | ||
| + | | GND | beliebigen GND | | ||
| + | | <color # | ||
| + | | <color # | ||
| + | |||
| + | |||
| + | |||
| + | |||
| + | <note tip> | ||
| + | |||
| + | 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: | ||
| + | * Messbereich −55 °C bis +125 °C | ||
| + | ==== Messprinzip ==== | ||
| + | |||
| + | < | ||
| + | |||
| + | **Ein Programm muss lediglich die Datei '' | ||
| + | </ | ||
| + | |||
| + | |{{ : | ||
| + | |Mit '' | ||
| + | |||
| + | ++++ Hintergrund | | ||
| + | |||
| + | Nach Aktivierung von 1-Wire über '' | ||
| + | |||
| + | Der Name '' | ||
| + | |||
| + | 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. | ||
| + | ++++ | ||
| + | |||
| + | ===== Software ===== | ||
| + | === Programmstruktur === | ||
| + | |{{ : | ||
| + | |Im Projektordner „course_temp_reader“ befinden sich im Verzeichnis '' | ||
| + | |||
| + | ==== Environment aktivieren ==== | ||
| + | |||
| + | |||
| + | <note important> | ||
| + | **Aktiviere die Python-Environment** | ||
| + | |||
| + | Die Programmierung erfolgt nun immer mit der gewählten Umgebung! | ||
| + | < | ||
| + | source ~/ | ||
| </ | </ | ||
| + | </ | ||
| + | ==== DS18B20 API ==== | ||
| + | Unsere Beispiel-API ist bewusst einfach gehalten und unterstützt hier nur einen einzelnen Sensor. Bei Bedarf kann die Implementierung problemlos auf mehrere Sensoren erweitert werden; darauf wird in diesem Projekt jedoch verzichtet. | ||
| + | |||
| + | |||
| + | <code python hardware.py > | ||
| - | <code python> | ||
| - | # ds18b20_smart.py | ||
| import glob | import glob | ||
| import time | import time | ||
| - | # ------------------------------------------------- | + | # ----------------------------- |
| - | # Sensor holen (nur erster gefundener) | + | # API-Funktionen ds18b20 |
| - | # ------------------------------------------------- | + | # ----------------------------- |
| + | SENSOR_TIMEOUT = 1 # Sekunden | ||
| + | |||
| + | def is_sensor(): | ||
| + | """ | ||
| + | sensors = glob.glob("/ | ||
| + | return len(sensors) > 0 | ||
| def get_sensor(): | def get_sensor(): | ||
| - | """ | + | """ |
| - | | + | |
| - | Gibt None zurück, wenn kein Sensor vorhanden ist. | + | |
| - | | + | |
| - | | + | |
| - | if not sensors: | + | |
| return None | return None | ||
| - | return sensors[0] | + | |
| + | | ||
| - | + | def get_temperature(): | |
| - | # ------------------------------------------------- | + | """ |
| - | # Temperatur auslesen | + | |
| - | # ------------------------------------------------- | + | |
| - | + | ||
| - | def get_temperature(timeout=5): | + | |
| - | """ | + | |
| - | | + | |
| - | Mit Timeout-Schutz gegen Endlosschleife. | + | |
| - | Gibt Temperatur in °C zurück oder None bei Fehler. | + | |
| - | | + | |
| sensor_file = get_sensor() | sensor_file = get_sensor() | ||
| if sensor_file is None: | if sensor_file is None: | ||
| Zeile 104: | Zeile 129: | ||
| start_time = time.time() | start_time = time.time() | ||
| - | |||
| while True: | while True: | ||
| - | | + | with open(sensor_file, |
| - | | + | lines = f.readlines() |
| - | lines = f.readlines() | + | |
| - | except OSError: | + | |
| - | return None | + | |
| - | # Prüfen ob Messung gültig | ||
| if lines[0].strip().endswith(" | if lines[0].strip().endswith(" | ||
| break | break | ||
| - | | + | if time.time() - start_time > SENSOR_TIMEOUT: |
| - | | + | |
| return None | return None | ||
| - | time.sleep(0.2) | + | time.sleep(0.1) |
| - | | + | |
| - | temp_str | + | temp_str = temp_line.split(" |
| - | return float(temp_str) / 1000.0 | + | return float(temp_str) / 1000.0 |
| - | | + | </ |
| - | return None | + | |
| + | |||
| + | ==== Temperature ==== | ||
| - | # ------------------------------------------------- | + | <code python temp_reader.py > |
| - | # Beispiel Nutzung | + | #!/ |
| - | # ------------------------------------------------- | + | |
| - | if __name__ == " | + | from hardware import get_temperature |
| - | | + | def main(): |
| + | temp = get_temperature() | ||
| + | if temp is not None: | ||
| + | | ||
| + | else: | ||
| + | print(" | ||
| - | while True: | + | if __name__ == " |
| - | temp = get_temperature() | + | main() |
| + | </ | ||
| - | if temp is None: | + | ==== Ausführen des Programms ==== |
| - | | + | Nach dem Programmstart wird auf der Kommandozeile die Temperatur in Grad Celsius ausgegeben, sofern der Sensor |
| - | else: | + | |
| - | print(f" | + | |
| - | time.sleep(2) | + | <code bash> |
| + | cd ~/ | ||
| + | chmod 755 temp_reader.py | ||
| + | ./ | ||
| + | |||
| + | # Beispielausgabe: | ||
| + | Temperatur: 21.25 °C | ||
| </ | </ | ||
| + | |||
| + | |||
projekt/python_projekt_ds18b20_digitaler_temperatursensor.1771574677.txt.gz · Zuletzt geändert: von torsten.roehl
