Am Raspberry Pi können auch 1Wire-Sensoren, wie der DS18B20 von Dallas eingesetzt werden. Es gibt keinen eigenen Hardware-Pin am Raspberry Pi, aber im aktuellen Kernel existieren Module, welche nur beim Boot freigeschaltet werden müssen. Diese Kernel-Module verwenden immer den GPIO-Pin

. Dieser kann dann nicht für andere Zwecke verwendet werden.

Hardware-Beschaltung

Den DS18B20 verbindet man mit drei Litzen an den Pfostenstecker des Raspberry Pi:

  • 1-Wire GND an GND vom Pi (Pin 6)
  • 1-Wire Datenleitung an GPIO04 (Pin 7)
  • 1-Wire VDD an +3,3V vom Pi (Pin 1)

Ausserdem ist noch ein Pullup-Widerstand von z.B. 4,7kOhm zwischen Pin1 und Pin7 zu schalten.

 

Installation

Um den Raspberry Pi auf den neusten Stand zu bringen, gibt man folgende Befehle ein:

sudo apt-get update
sudo apt-get dist-upgrade -f
sudo rpi-update
sudo reboot

Die Kernel-Module können nach dem Reboot von der Kommandozeile aus geladen werden:

sudo modprobe wire
sudo modprobe w1-gpio
sudo modprobe w1-therm

Sie sind allerdings nur bis zum nächsten Reboot verfügbar. Um sie permanent einzurichten, editiert man

sudo nano /etc/modules

und fügt diese drei Zeilen hinzu:

wire
w1-gpio
w1-therm

Anschließend ist die Datei zu speichern. Jetzt kann man testweise rebooten:

sudo reboot

Nach dem Reboot sollten die drei Module wieder geladen sein:

lsmod

Module Size Used by
w1_therm 3325 0
w1_gpio 4287 0
wire 31248 2 w1_gpio,w1_therm
cn 5756 1 wire
cfg80211 462846 0
rfkill 22347 1 cfg80211
snd_bcm2835 20818 0
snd_pcm 90778 1 snd_bcm2835
snd_seq 61097 0
snd_seq_device 7209 1 snd_seq
snd_timer 23007 2 snd_pcm,snd_seq
snd 66325 5 snd_bcm2835,snd_timer,snd_pcm,snd_seq,snd_seq_device
uio_pdrv_genirq 3666 0
uio 9897 1 uio_pdrv_genirq

Bei aktuellen Kernel-Versionen ab v3.18.3 muß man zusätzlich die Bootkonfiguration anpassen. Zuerst wird die Kernel-Version ermittelt:

uname -r

Man erhält diese Versionsinfo:

3.18.13+

In diesem Fall oder noch höheren Kernel-Versionen muß man noch eine Anpassung machen:

sudo nano /boot/config.txt

Am Ende der Datei fügt man diese beiden Zeilen ein:

# activating 1-wire with pullup
dtoverlay=w1-gpio-pullup

Anschließend speichern und einen Reboot machen:

sudo reboot

Nach erneuter Anmeldung als Benutzer 'pi' checkt man die angeschlossenen Sensoren. In meinem Fall sind es acht Stück:

cd /sys/bus/w1/devices

ls

28-000002385ee2 28-000002388764 28-000002389685
28-0000023872fd 28-000002388b27 28-00000238a003
28-000002387b65 28-000002388f2d w1_bus_master1

'w1_bus_master1' ist immer vorhanden. Die Verzeichnisse mit den kryptischen Nummern, z.B. '28-000002388b27' repräsentieren die 8 Sensoren mit Ihrer weltweit eindeutigen ID (vom Hersteller eingeprägt). Es empfiehlt sich die Sensoren einzeln, nacheinander an den Bus zu schalten, damit man weiß, welcher Sensor welche ID hat. Alternativ kann man mit der Hand einen Sensor anwärmen und seinen Temperaturwert auslesen.

Jeder Sensor hat einen eigenen Verzeichnispfad, in welchem sich seine Gerätedatei befindet. Die Gerätedatei enthält die Registerwerte des DS18B20 und zusätzlich die Temperatur im Klartext:

cd /sys/bus/w1/devices/28-000002388764

cat w1_slave

Dies liefert die Daten des Sensors:

65 01 4b 46 7f ff 0b 10 2c : crc=2c YES
65 01 4b 46 7f ff 0b 10 2c t=22312

Am Ende der zweiten Zeile findet man die Temperatur  't=22312' in 1/1000 °C. Diesen Wert muss man durch 1000 teilen und erhält den realen Wert von z.B. '22.312' °C.

 

Verwendung in PHP

Das Abfragen der Gerätedateien kann man auch in einem PHP-Skript automatisieren, z.B. wenn man die Temperaturen per Webseite abfragen möchte. Hierzu legt man im Verzeichnis ein PHP-Skript an:

sudo nano temperature.php

und gibt folgende Zeilen ein:

<?php
$temp = exec('cat /sys/bus/w1/devices/10-000802b5ab54/w1_slave | grep t=');
$temp = explode('t=',$temp);
$temp = $temp[1] / 1000;
$temp = round($temp,2);
echo $temp;
?>

Dabei ist zu beachten, dass man im Pfad die ID der eigenen Sensoren eingibt!

 

Weitere Infos

http://www.einplatinencomputer.com/raspberry-pi-1-wire-temperatursensor-ds1820-ansteuern/

http://www.fhemwiki.de/wiki/Raspberry_Pi_und_1-Wire#Konfiguration_von_1-wire-Komponenten_am_GPIO