Raspberry Pi: 1-Wire Temperatursensor 18B20 auslesen unter Linux und CODESYS


Wer sich mal etwas mit dem kostengünstigen verdrahten moderner Häuser oder Wohnungen auseinander gesetzt hat, wird schon auf den 1-Wire oder OneWire Bus gestoßen sein. Dieser Bus ermöglicht es, mit einem geringen Verdrahtungsaufwand zum Beispiel Sensoren an ein Gerät anzuschließen. Es werden mindestens zwei Adern benötigt, besser drei oder vier, es können jedoch mehrere Sensoren parallel angeschlossen werden.

Ein sehr beliebter Sensor ist der Temperatursensor 18B20 bzw. DS18B20, er misst die Temperatur auf 0,5°C genau und gibt diese als tausendstel aus, 21,5°C zeigt der Sensor also als 21500 an. Die Messung wird über eine Prüfsumme validiert.

1-Wire am Raspberry Pi aktivieren

Der Raspberry Pi bringt einen 1-Wire-Bus mit, der über die GPIO-Pins läuft. Der Bus mus jedoch zuerst eingeschaltet werden, dies geschieht über die Datei /boot/config.txt, hier muss eine Zeile mit folgendem Inhalt eingetragen werden:

dtoverlay=w1-gpio

Dies aktiviert im Device Tree die 1-Wire-Schnittstelle auf dem Standard-GPIO-Pin, also Pin 7. Nach dieser Änderung muss ein Neustart durchgeführt werden, der Bus ist nun aktiv.

DS18B20 an den Raspberry Pi anschließen

Der Sensor hat drei Beinchen. Schaut man auf die abgeflachte Seite mit der Beschriftung, ist das linke Beinchen die Nummer 1 und damit GND (also 0V), das mittlere die Nummer 2 und damit DQ (die Datenleitung) und das rechte Beinchen ist die Nummer 3 und stellt die Versorgungsleitung VCC (3,3V) dar.

Belegung der Pins des DS18B20
Belegung der Pins des DS18B20

In diesem Beispiel schließen wir den DS18B20 mit drei Adern an die 3,3V Versorgungsspannung des Raspberry Pi an. Bei größeren Leitungslängen empfiehlt es sich, für die Versorgungsspannung 5V zu nehmen und den Widerstand von DQ auf eine separate Ader mit 3,3V zu ziehen. Zum Testen reicht dieser Aufbau aber allemal.

So wird der Sensor DS18B20 an die GPIO-Pins des Raspberry Pi angeschlossen
So wird der Sensor DS18B20 an die GPIO-Pins des Raspberry Pi angeschlossen

Die Verkabelung kann entweder fliegend verlötet werden, oder aber (etwas eleganter und einfacher) auf einem Breadboard aufgesteckt werden. Ich tat letzteres, wenn auch wegen akuten Jumperwire-Mangels nicht besonders ordentlich:

Der DS18B20 auf dem Breadboard, verbunden mit dem Rsspberry Pi
Der DS18B20 auf dem Breadboard, verbunden mit dem Rsspberry Pi

Sensordaten abfragen im Linux-Terminal

Jeder Sensor hat eine einmalige Kennung, unter dieser Kennung wird auch ein Geräteordner unter /sys/bus/w1/devices angelegt. In meinem Falle hat der Sensor die Kennung 28-021600bb4dff, daher ist der Geräteordner /sys/bus/w1/devices/28-021600bb4dff. In diesem Ordner befindet sich die Gerätedatei w1_slave. Lässt man sich diese Datei beispielsweise mit cat ausgeben, wird der Sensor abgefragt und die Checksumme, sowie die Temperatur ausgegeben:

Die Ausgabe der Gerätedatei des DS18B20
Die Ausgabe der Gerätedatei des DS18B20

Stimmen beide Checksummen überein, ist das Ergebnis plausibel und hinter der crc steht „YES“. Im Fehlerfall würde dort „NO“ stehen. In der zweiten Zeile wird die Temperatur angezeigt, teilt man diesen Wert durch 1000 kommt man auf die Temperatur in °C, bei mir also 20,125°C.

Das ist eigentlich schon alles. Diese Datei kann man natürlich über Scripte oder Programme auslesen und weiter verwenden.

Sensordaten abfragen unter CODESYS

Seit längerem gibt es ja von 3S die CODESYS Laufzeit für den Raspberry Pi, eine meiner Meinung nach für Privatanwender und Bastler schöne Lösung in die Automatisierung einzusteigen, ohne hohe Ausgaben für „echte“ SPS-Hardware zu haben.

Über CODESYS auf dem Raspberry Pi habe ich schon zwei Artikel verfasst. Im ersten Artikel wird unter anderem erklärt, wie die Laufzeit auf dem Gerät installiert wird und wie eine Verbindung zum Raspberry Pi hergestellt wird, im zweiten geht es eher um die Python-Bibliothek Pymodbus, die die Modbus-Kommunikation zum Beispiel zwischen einem Raspberry Pi und einem Controller mit CODESYS ermöglicht.

Wir benötigen also einen Raspberry Pi mit installierter CODESYS Laufzeit, sowie dem angeschlossenen und funktionierenden Sensor wie oben beschrieben.

Im CODESYS legen wir ein neues Projekt an und wählen als Zielsystem den Raspberry Pi.

CODESYS Projekt anlegen für DS18B20 auf Raspberry Pi
CODESYS Projekt anlegen für DS18B20 auf Raspberry Pi

Nachdem das Programm angelegt ist, baut sich automatisch die Struktur auf und man sieht auch schon den Punkt für 1-Wire (bzw. Onewire).

Zunächst muss eine Verbindung zum Raspberry Pi hergestellt werden, dafür werden per Doppelklick auf den Raspberry die Geräteeinstellungen geöffnet und die IP des Gerätes eingetragen (und die Zugangsdaten, falls nicht zuvor schon einmal geschehen). Wenn die Verbindung grün angezeigt wird, ist alles in Ordnung.

CODESYS verbinden mit dem Raspberry Pi im Device Manager
CODESYS verbinden mit dem Raspberry Pi im Device Manager

Nun kann mit der Konfiguration des 1-Wire Sensors begonnen werden. Per Rechtsklick auf den Eintrag „Onewire“ öffnet sich das Kontextmenü, hier wird über den Menüpunkt „Gerät anhängen“ das Gerät „Onewire_master“ angehängt.

Das Gerät Onewire_master anhängen
Das Gerät Onewire_master anhängen

Auf die selbe Art wird nun noch der Sensor DS18B20 angehängt: Rechtsklick auf Onewire_master, Gerät anhängen, DS18B20 auswählen.

Nun sind alle Geräte vorhanden, die benötigt werden. Der Sensor muss nun noch Parametriert werden, die Gerätekennung muss eingetragen werden. Hierzu öffnet man das Device per Doppelklick und trägt im Reiter „1-wire bus Parameter“ in der Spalte „Wert“ die Kennung ein, die eben schon in der Konsole angezeigt wurde, bei mir also 28-021600bb4dff. Das ganze als String, also in Hochkommata ‚.

Der Sensor DS18B20 wird parametriert, die Gerätekennung wird eingetragen.
Der Sensor DS18B20 wird parametriert, die Gerätekennung wird eingetragen.

Das war eigentlich schon alles, der Sensor sollte nun im Programm benutzbar sein. Den Temperaturwert kann man recht einfach nutzen, indem man den String rTemp des Sensors ausliest und beispielsweise auf eine Variable schreibt. Der Wert rTemp ist ein REAL, die Variable muss also auch den Typ REAL haben.

Der Temperaturwert wird über rTemp ausgelesen.
Der Temperaturwert wird über rTemp ausgelesen.

Im laufenden Programm sieht das ganze dann so aus:

Die Livedaten des DS18B20 werden im laufenden Programm angezeigt.
Die Livedaten des DS18B20 werden im laufenden Programm angezeigt.

Eigentlich recht simpel. Da mehrere Sensoren parallel angeschlossen werden können, kann man so einfach die Temperatur in einem ganzen Haus messen und dank der HTML5-WebVisu von CODESYS 3.5 auch optisch ansprechend im Netzwerk abrufbar machen. Eine Heizungssteuerung wäre natürlich auch ein guter Anwendungszweck.


2 Antworten zu “Raspberry Pi: 1-Wire Temperatursensor 18B20 auslesen unter Linux und CODESYS”

  1. Hi
    How codesys code should like when reading more than 1 DS18B20?
    Is it possible to sent this reading via modbus to anotfer codesys PLC? How can i do this?

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert