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