Banana Pi: DS1820 Temperatursensor 1-Wire auslesen

Banana Pi und Temperatursensor DS1820
Banana Pi und Temperatursensor DS1820

Der Einplatinencomputer Banana Pi ist mit einer Vielzahl an Schnittstellen ausgestattet und eignet sich daher für die verschiedensten Projekte. Eine besondere Stärke des Pi ist die freie Programmierung Nutzung der GPIO-Pins. Der Banana Pi unterstützen außerdem eine Reihe von gängigen Bussystemen. Dadurch können verschiedene kompatible Geräte über ein Leitungssystem mit unterschiedlichen Befehlen angesteuert werden. Das sogenannte 1-wire Bussystem ist ein möglicher Bus, den der Pi unterstützt. Bei diesm findet der Datenaustausch über eine Signalleitung statt.

Temperatursensor DS1820

Ein beliebtes Projekt unter den Pi-Anwendern ist die Messung der Raum- und Außentemperatur mit Hilfe des Temperatursensors DS1820. Verwandte Temperatursensoren sind der DS18S20 und DS18B22. Die integrierten Schaltkreise sind in einem TO-92 Gehäuse untergebracht und beinhalten den Temperatursensor, einen Analog-Digitalwandler und ein 1-wire Interface. Die genannten Sensoren unterscheiden sich prinzipiell im Preis und der Messgenauigkeit. Für unsere Anleitung verwenden wir den dreibeinigen Temperatursensor DS1820:

  • Pin 1: GND, Masse
  • Pin 2: DQ, Daten
  • Pin 3: VDD, Betriebsspannung
DS1820 (Bild: kompf.de)
DS1820 (Bild: kompf.de)

Schaltungsaufbau Temperatursensor DS1820

Der Temperatursensor wird mit einer Betriebsspannung (Pin 3) zwischen 3 und 5 Volt betrieben. Aus diesem Grund verbinden wir Pin 3 des Sensors mit dem 3,3 Volt-Pin des Banana Pi. Außerdem wird der Ground-Pin (Pin 1) des Sensors mit einem Ground-Pin am Pi verbunden (Pin 9), sowie die Datenleitung DQ (Sensor Pin 2) mit dem GPIO Pin 4.

Zwischen die Datenleitung und die 3,3 Volt Spannungsversorgung schalten wir einen 4k7 Ohm Widerstand. Weitere Temperatursensoren können auf gleichem Weg parallel über den 1-wire Bus angeschlossen und ausgelesen werden. Insgesamt ist nur ein 4k7 Ohm Wiederstand notwendig. Das GPIO-Headerlayout kann hier nachgelesen werden.

DS1820 Ansteuerung
DS1820 Ansteuerung

Empfehlung: Solltet ihr öfters Basteln und verschiedene Schaltungen aufbauen, dann lohnt es sich von verschiedenen Bauteilkategorien Sets zu holen: Widerstandsset, Led-Set, Kondensator Sortiment

Software: Vorbereitung

Nachdem die Hardware ordnungsgemäß mit dem Banana Pi verbunden ist kann das Auslesen der Temperatur beginnen. Dazu installieren wir zunächst ein Softwarepaket, mit welchem wir den 1-Wire Bus zugänglich machen.

sudo apt-get install git
git clone https://github.com/linux-sunxi/sunxi-tools
cd sunxi-tools
make

Im nächsten Schritt wird die binäre Konfigurationsdatei script.bin bearbeiten. Diese Datei wird vom Allwinner SoC verwendet und liegt im Verzeichnis /boot/bananapi/. Mit dem gerade heruntergeladenem Tool laden wir aus der binären Datei eine fex-Datei.

sudo /home/bananapi/sunxi-tools/bin2fex script.bin bananapi.fex

Die fex-Datei bearbeiten wir im Anschluss mit dem Editor nano.

sudo nano bananapi.fex

Am Ende der Datei fügen wir folgenden Inhalt ein.

[w1_para]
gpio = 4

Anschließend können wir die Datei schließen und wandeln die bearbeitete fex-Datei zurück in die binäre Datei script.bin. Damit die Einstellungen übernommen werden ist ein Neustart notwendig.

sudo /home/bananapi/sunxi-tools/fex2bin bananapi.fex script.bin
sudo reboot

Software: Auslesen des DS1820 1-wire

Zum Auslesen der Temperatur eines Sensors am 1-Wire Bus müssen wir den entsprechenden Sensor selektiere. Wie in der Schaltung oben gezeigt können mehrere Sensoren angeschlossen sein. Zur Identifikation besitzt jeder Temperatursensor einen vom Hersteller eindeutig vergebenen Code. Jeder angeschlossene Sensor bekommt im Verzeichnis /sys/bus/w1/devices/ sein eigenes Unterverzeichnis. Innerhalb des Verzeichnisses eines Sensor findet man immer die Datei w1_slave. Mit dem cat Befehl können wir daraus (via Terminal) die Temperatur auslesen. Wie das geau funktioniert wird nun nochmal Schritt für Schritt beschrieben.

Zum Ermitteln der Identifikationsnummer und des entsprechenden Verzeichnisses wechseln wir zunächst in das Verzeichnis /sys/bus/w1/devices/ und lassen uns dort alle drin befindlichen Ordner und Dateien anzeigen.

cd /sys/bus/w1/devices/
ls

In meinem Fall habe ich einen Sensor angeschlossen mit der Identifikationsnummer 10-000802b5ab54. Anschließend wechseln wir in das gleichnamige Verzeichnis. Dort sehen wir das die genannte Datei w1_slave vorhanden ist.

cd /sys/bus/w1/devices/10-000802b5ab54
ls

Mit dem cat Befehl lesen wir anschließend die Datei und damit die momentane Temperatur aus. Es ergibt sich insgesamt folgender Verlauf und die im Bild dargestellte Ausgabe.

cat /sys/bus/w1/devices/10-000802b5ab54/w1_slave

Sreenshot Temperatur DS1820
Sreenshot Temperatur DS1820

Am Ende der Ausgabe finden wir die Angabe t=18687. Teilen wir diese Zahl durch 1000 ergibt sich eine aktuelle Temperatur von 18,687 °C.

Temperaturdaten mit PHP verarbeiten

Jetzt wo wir wissen wie man die Temperatur mit dem Sensor DS1820 ermittelt, kann man dies in vielen Varianten und Programmiersprachen umsetzen. An dieser Stelle möchte ich zeigen wie man mittels PHP die Temperatur auslesen und anschließend weiterverarbeiten könnte. Die Weiterverarbeitung der Temperatur in Form von einem Datenlogger mit einer Datenbank und einem entsprechendem Webinterface ist möglich und mit wenig Aufwand realisierbar. Vorraussetzung für eine Lösung mit PHP ist ein eingerichteter Webserver, wie zum Beispiel der Apache, mit den entsprechenden PHP Modulen.

Das auslesen der Temperatur kann in PHP mit folgenden Zeilen erledigt sein. Im Webinterface sollte damit die aktuelle Temperatur in °C ersichtlich werden.

<?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 . " &#x00B0;C";

?>

Ursprünglich und in ähnlicher Weise wurde das Tutorial auf Einplatinencomputer veröffentlich.

Quellen: linuxx.eu, Bild DS1820: kompf.de