# Allgemein, Technik

DS18B20 mit Raspberry PI auslesen

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!