Im Rahmen eines kleinen Projekts der Hausautomatisierung musste ich eine einfache Möglichkeit finden, die Umgebungstemperatur auszulesen.
Für relativ kleines Geld gibt es den DS18B20 von xxx. Dieser besitzt einen so genannten 1-Wire Bus. Das Raspberry Pi ist ebenfalls in der Lage per 1-Wire Bus zu kommunizieren.
Also los geht es!
Zuerst wird das Raspberry Pi mit dem DS18B20 verbunden. Dabei sollte ein 4,7k Widerstand zwischen „Data“ und „Gnd“ angeschlossen werden. Der Schaltungsaufbau sollte also so realisiert werden:
ANSCHLUSSSCHEMA
GRAFIK
Als nächstes werden für das Raspberry Pi die nötigen Kernel-Module nötig, um per 1-Wire Bus kommunizieren zu können. Diese werden einfach mit
sudo modprobe w1-gpio sudo modprobe w1-therm
nachgeladen.
In der aktuellen Konstellation sind so bis zu 10 weitere DS18B20 auf einem Bus möglich!
Als nächstes schauen wir in folgendes Verzeichnis:
cd /sys/bus/w1/devices
hier sollten per „ls“ eine Ausgabe ähnlich meiner erhalten:
pi@raspbmc:/sys/bus/w1/devices$ ls 28-0000056b0a19 w1_bus_master1
Der Ordner „28-0000056b0a19“ steht für die Id des gefundenen Sensores, folglich stehen hier also bei mehreren Sensoren mehr als nur der eine in der Ausgabe!
Wechseln wir also in den Ordner des Sensor und gegen dort mit „cat w1_slave“ den Inhalt aus:
pi@raspbmc:/sys/bus/w1/devices/28-0000056b0a19$ cat w1_slave 58 01 4b 46 7f ff 08 10 f9 : crc=f9 YES 58 01 4b 46 7f ff 08 10 f9 t=21500
Hier wird nun also das Datenpaket des Sensor sichtbar! „crc=f9“ Beschreibt das der CRC Check okay ist. „t=21500“ gibt die Temperatur mit 3.Nachkommastellen aus. 21500 entspricht also 21.5°C!
Als nächstes Bauen wir uns einen kleinen Python-Script der uns selbstständig die Temperatur ausgibt.
Legen wir als eine Leere Datei an und füllen sie mit folgendem Code:
#!/usr/bin/env python # -*- coding: utf-8 -*- # Importieren der Notwendigen Module import sys # Liest die Datei die alle Sensoren auflistet file = open('/sys/devices/w1_bus_master1/w1_master_slaves') # Datei einlesen w1_slaves = file.readlines() # Dateistrom beenden file.close() # Kleine Tabelle erstellen mit Überschriften print('Sensor ID | Temperature') print('-----------------------------') # Für jeden "Slave" wird folgendes Wiederholt for line in w1_slaves: # Auslesen aus dem Resultat w1_slave = line.split("n")[0] # Dazugehörige Datei im Ordner des Slaves öffnen file = open('/sys/bus/w1/devices/' + str(w1_slave) + '/w1_slave') # Inhalt der "w1_slave" Datei lesen filecontent = file.read() # Dateistrom beenden file.close() # Resultate der Datei zurecht spitten stringvalue = filecontent.split("n")[1].split(" ")[9] # Temperaturwert wandeln in float und anpassung der Nachkommastelle temperature = float(stringvalue[2:]) / 1000 # Ausgabe der Resultate print(str(w1_slave) + ' | %5.3f °C' % temperature) sys.exit(0)
Ein Aufruf des Python-Programms stellt dann folgendes dar:
pi@raspbmc:~$ python get_temp.py Sensor ID | Temperature ----------------------------- 28-0000056b0a19 | 21.625 °C
Als nächstes werde ich ein kleines Programm entwerfen das diese Werte zyklisch in eine Datenbank überträgt und darstellt!
Schreibe einen Kommentar