Raspi und 1-Wire

Im RaspberryPi sind schon die Module enthalten, um auf GPIO-Port 4 (P1 Anschluss 7) eine 1-Wire Verbindung zu betreiben. Allerdings sollten die Leitungen nur kurz sein, da der Pi nur wenig Strom liefern kann unddie Eingänge in kleinster Weise "abgesichert" sind. Besser ist hier eine aktive Anbindung über USB oder I2C. Auch wenn 1-Wire "eigentlich" nur eine Leitung (+Masse) braucht, sollten speziell bei längeren Leitungen die Sensoren getrennt mit Strom und Masse versorgt werden und die Signalleitung nur mit einem 4k7-Ohm Widerstand auch "high" gehalten werden.

Achtung: Der Raspberry verträgt auf den Datenleitungen nur 3,3V. Daher nie mit 5V arbeiten.

Anschlussarten

Drei Anschlussarten am RasPi sind denkbar. Der RasPI ist links angeschlossen und das blaue "DS1820B" ist ein einfacher 1-Wire Themperaturfühler.

Bild Beschreibung

Kurze Leitung

Über einen einfachen 4k7 Ohm Wiederstand wird die Datenleitung über die +3,3V Leitung auf "High" gehalten. Sowohl der RasPi als auch ein angeschlossener Sensor kann die Datenleistung problemlos auf Masse ziehen. Durch die geringen Pegel der Versorgungsspannung eignet sich diese Verdrahtung eher für kurze Strecken.

Längere Leitungen

Wenn wir die Versorgungsspannung für die Sensoren nicht aus dem 3,3V Zweig sondern aus dem 5V-Anschluss des RasPi beziehen, sind die Sensoren besser bedient. Aufgrund der 3,3V Abhängigkeit des RasPi-GPIO-Pins darf die Datenleitung aber nicht aus 5V gespeist werden. Auch wenn dieser Aufbau etwas robuster ist, sollten Sie die Leitungslänge im Blick behalten.

Parasitärer Moduls

Der Name 1-Wire kommt ja gerade davon, nur eine Leitung zu ziehen und die Masse irgendwo her zu holen. In dem Betrieb muss die Datenleisung aber auch die Speisung der Sensoren übernehmen, die dann über einen internen Kondensator sich am Leben erhalten, während die Datenleistung bei der Übertragung auf Masse gezogen wird.

Mit 3,3V als Versorgung der Datenleitung tun sich viele Sensoren schwer. Der Betrieb scheint sehr unsicher zu sein. Bei mir wurde nicht mal ein DS1820B direkt am Pin erkannt.

Sinnvoll nutzbar sind aber nur die linke für sehr kurze Leitungen, z.B.: um einen Temperatursensor nahe am Pi anzuschließen (Eigenüberwachung oder Meßobjekt nahe bei. Etwas besser geht mit einer 5V Speisespannung, wobei die 3,3V für die Datenleitung klar getrennt sein muss.

Achtung: Der Raspberry verträgt auf den Datenleitungen nur 3,3V. Daher nie mit 5V arbeiten.

Die dritte Version mit der parasitären Stromversorgung ist mit dem Pi nicht stabil einsetzbar. Da die Datenleitung hier auch Strom liefern muss aber nicht mehr als 5V verträgt, ist dies nicht stabil. Wenn Sie wirklich neben der Masse nur einen Draht ziehen sollen, dann müssen sie aufwändige elektrische umsetzer bauen oder besser einen USB oder seriellen Adapter für 1-Wire anschließen.

Exemplarischer Sensor

Ich habe auf meiner eigenen GPIO-Platine einfach einen DS1820B direkt angeschlossen. So kann ich die Funktion zeigen und zugleich ein bisschen die Umgebungsthemperatur überwachen:

Links sehen Sie den DS1820 und den 4k7-Ohm-Widerstand. Rechts die Rückseite, mit dem Anschluss an Pin 1 (+3,3V), Pin 7 (GPIO4). Die Leitung zur Masse rechts raus ist nur teilweise sichtbar. Auf die drei Pfostenstecker kann ich den 1-Wire Bus verlängern. Nicht schön aber für erste Versuche ausreichend.

Einbindung im Kernel

Der RasPi liefert das passende Modul schon mit, um den GPIO-Pin 4 als 1-Wire Pin zu verwenden. Die 1-Wire-Unterstützung muss im Kernel als Modul nachgeladen werden werden.

modprobe w1-gpio
modprobe w1-therm

Damit diese Aktivierung "permanent" ist, müssen diese Aufrufe in die Startup-Datei addiert werden. Maßgeblich ist dabei die Datei ""/etc/modules", in der einfach die Module eingetragen werden:

sudo nano "/etc/modules

Addieren "w1-gpio" (ohne Anführungszeichen)
Addieren "w1-therm" (ohne Anführungszeichen)

Der Zugriff auf die Sensoren erfolgt über das Dateisystem. Jeder Sensor wird mit seiner ID als Verzeichnis eingebunden.

ls /sys/bus/w1/devices
cat /sys/bus/w1/devices/10-123232/w1_slave

crc = 5e YES
t=20435

Das Ergebnis des Sensors mit der Nummer 10-123232 steht in der Datei "w1_slave" und enthält Angaben zur Prüfsummer und den Ergebniswert. Hier ist es eine Temperatur, die bei dem Sensor durch 1000 geteilt werden muss. (20,435 Grad). Wie die Werte zu interpretieren sind, ist im Datenblatt zum Sensor zu sehen.

Der Kernel-Treiber kann über eine Konfigurationsdatei "/etc/modprobe.d/1-wire.conf" gesteuert werden.

sudo nano /etc/modprobe.d/1-wire.conf

options wire max_slave_count=20

Webserver

Über einfach Datei-IOs jeder beliebigen Programmiersprache können Sie auf die Ergebnisse darauf zugreifen. Ein denkbar einfacher Weg ist einfach die Einbindung dieses Teilbaums als virtuelles Verzeichnis im Webserver (z. B. NGENX Raspberry - WebServer)

Also schnell mal die Datei /etc/nginx/sites-available/default editiert

sudo nano /etc/nginx/sites-available/default

Und eine neue Location addiert

        location /1wire {
                alias /sys/bus/w1/devices/;
                autoindex on;
        }

Dann noch ein Restart des Webservers

sudo /etc/init.d/nginx restart

Und schon kann man den Sensor per HTTP einfach abfragen und das Verzeichnis durchlaufen.

So kann nahezu jedes Programm per HTTP die Dateien herunter laden und den Inhalt auswerten. Dann bleibt es nur noch an PRTG und anderen Tools hängen, die Daten entsprechende zu parsen. Alternativ können Sie natürlich auch den Webserver mit einer PHP-Logik ausstatten und die Daten auch mehrerer Sensoren schön auszuwerten.

Anscheinend liest der RasPi Kernel die Werte beim Zugriff erst ein, was natürlich etwas länger dauert. Es könnte also sinnvoller sein, z.B. per Script die Werte zu kopieren und nur nach Ablauf einer Zeitspanne neuzuladen.

Weitere Links