1-Wire Sensoren am Raspberry Pi über i2c-Bus auslesen

Der Raspberry Pi (kurz RPi) lässt sich mit wenig Aufwand zum Auslesen von Werten aus 1-Wire-Sensoren, wie z.B. dem DS18B20 verwenden.

In diesem Tutorial werden die Sensoren über eine Erweiterungsplatine 1 Wire Pi Plus der Fa. AB Electronics UK mit dem Raspberry Pi verbunden.

Die Platine enthält einen DS2482-100 Chip, die Schnittstelle zwischen i2c-Bus und 1-Wire-Bus, einen Pegelkonverter von 5V auf 3,3V auf Basis eines FDC6301N und eine Schutzdiode DS9503 die gegen elektrostatische Entladungen auf den 1-Wire-Bus schützt. Als Stecker für die Sensoren dient eine Modularbuchse RJ12.

Die Schaltung findet man hier.

Als Basis wird ein Raspberry Pi mit installiertem Raspbian Stretch Lite verwendet.
Eine Anleitung für die Installation und Konfiguration von Raspbian gibt es bald hier.

I2C-Module Installieren

Wir testen als erstes nach ob die benötigten i2c-Module geladen wurden.

root@rpionewire:~# lsmod|grep i2c
i2c_bcm2835             7167  1
i2c_dev                 6913  2

Falls die Module nicht geladen wurden, aktivieren wir sie in der raspi-config unter 5 Interfacing Options und weiter P5 I2C oder tragen sie manuell in die /etc/modules ein:

root@rpionewire:~# echo i2c-dev >> /etc/modules

und starten sie mit:

root@rpionewire:~# modprobe i2c_dev
root@rpionewire:~# modprobe i2c_bcm2835

Nun installieren wir das Paket i2c-tools um den Bus zu testen

root@rpionewire:~# apt-get install i2c-tools

und scannen den i2c-Bus nach Geräten:

root@rpionewire:~# i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- 18 -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

Nachdem ein Bus erkannt wird können wir mit der Installation der 1-Wire Software beginnen.

OWFS Installieren

Im aktuellen Debian Stretch liegt das Paket owfs in der Version 3.1p5-1 auf, dieses installieren wir mit:

root@rpionewire:~# apt-get install owfs

Die ausführbaren Programme sollten nun hier zu finden sein:

root@rpionewire:~# cd /usr/bin/

root@rpionewire:/usr/bin# ls -la ow*
-rwxr-xr-x 1 root root 26152 Jän  8  2017 owexternal
-rwxr-xr-x 1 root root    59 Jän  8  2017 owfs
-rwxr-xr-x 1 root root 63176 Jän  8  2017 owftpd
-rwxr-xr-x 1 root root 30208 Jän  8  2017 owhttpd
-rwxr-xr-x 1 root root 26152 Jän  8  2017 owserver

Die Installation von den Diensten owserver und owhttpd ist beendet, wir können nun die Konfiguration durchführen.

OWFS Konfigurieren

Um festzustellen wie unser i2c-Device heißt schauen wir in das Verzeichnis /dev:

root@rpionewire:~# ls -la /dev |grep i2c*
crw-rw---- 1 root i2c 89, 1 Mai 12 17:25 i2c-1

Wir editieren die owfs.conf

root@rpionewire:~# touch /etc/owfs.conf

und setzen die Einträge für den owserver und owhttpd.

# This is the main OWFS configuration file.

######################## SOURCES ########################

!server: server = localhost:4304
server: device = /dev/i2c-1

####################### OWHTTPD #########################

http: port = 2121
#alias = /etc/owhttpalias

####################### OWSERVER ########################

server: port = 4304

Wir legen eine Datei owhttpalias im Verzeichnis /etc an

root@rpionewire:~# touch /etc/owhttpalias

in welche wir später Aliase für die Sensoren eintragen.

Einrichten der Start/Stop-Dienste

Die mit dem Paket gelieferten Start/Stop-Scripte basieren noch auf dem init-System und lassen den owserver und den owhttpd mit root-Rechten laufen.

Wir wollen die jedoch mit einem eigenen User laufen lassen und stellen auch die Start/Stop-Scripte auf Systemd um.

Dazu erstellen wir einen neuen User

root@rpionewire:~# adduser ow

verhindern, dass er sich am System anmelden kann

root@rpionewire:~# usermod -s /usr/sbin/nologin ow

und fügen ihn zum Schluß der Gruppe i2c zu:

root@rpionewire:~# addgroup ow i2c

Dann wechseln wir ins Verzeichnis der Start/Stop-Scripte

root@rpionewire:~# cd /lib/systemd/system/

und erstellen die Datei owserver.service

root@rpionewire:/lib/systemd/system/# touch owserver.service

welche wir in einem Editor wie folgt anpassen:

[Unit]
Description=Backend server for 1-wire control
Documentation=man:owserver(1)
After=network.target

[Service]
Type=notify
NotifyAccess=all
ExecStart=/usr/bin/owserver -c /etc/owfs.conf --debug
Restart=on-failure
User=ow
Group=ow

[Install]
WantedBy=multi-user.target

Als nächstes erstellen wir die Datei owhttpd.service wie folgt

root@rpionewire:/lib/systemd/system/# touch owhttpd.service

und passen sie im Editor wie folgt an:

[Unit]
Description=Tiny webserver for 1-wire control
Documentation=man:owhttpd(1)
After=avahi-daemon.service owserver.service

[Service]
Type=notify
NotifyAccess=all
ExecStart=/usr/bin/owhttpd -c /etc/owfs.conf --pid-file /var/run/owfs/owhttpd.pid --debug
User=ow
Group=ow

[Install]
WantedBy=multi-user.target

Um die Änderungen für den systemd zu Übernehmen tippen wir:

root@rpioneroot@rpionewire:~# systemctl daemon-reload

Wir starten nun den owserver-Dienst

root@rpionewire:~# systemctl start owserver.service

und im Anschluß daran den owhttpd-Dienst.

root@rpionewire:~# systemctl start owhttpd.service

Nun sehen wir nach ob die Dienste laufen.

root@rpionewire:~# ps -u ow
  PID TTY          TIME CMD
  388 ?        00:00:01 owserver
 1468 ?        00:00:00 owhttpd

Damit die Dienste automatisch starten tippen wir noch:

root@rpionewire:~# systemctl enable owserver.service
root@rpionewire:~# systemctl enable owhttpd.service

Nach einem Neustart prüfen wir nochmals ob die Dienste laufen.

root@rpionewire:~# ps -u ow
  PID TTY          TIME CMD
  451 ?        00:00:01 owserver
 1214 ?        00:00:00 owhttpd

Wenn beide laufen öffnen mit einen Browser unsere 1-wire Web-Seite (IP-Adresse:2121).

Wenn wir jetzt auf eine der Sensoren (z.B.: 28.CB2526000080) klicken bekommen wir die aktuellen Werte

Da wir nun die Adressen der Sensoren kennen, können wir diese mit Aliase versehen. Dazu öffnen wir die Datei /etc/owhttpalias und tragen wie folgt ein:

28.CB2526000080 = magenta
28.FF8442841604 = blue
28.FF86B2831603 = white
28.FF753D841604 = red

Nach einen Neustart von owserver und owhttpd werden im 1-Wire Web die Aliase angezeigt.

Die Installation ist somit abgeschlossen.