Banana Pi Sensoren

Banana Pi: 1-wire Temperatursensor DS1820 ansteuern

Banana Pi und Temperatursensor DS1820
Geschrieben von Tony

Ein großer Vorteil des Banana Pi ist die Möglichkeit der freien Programmierung und Nutzung von GPIO-Pins. Die meisten Einplatinencomputer 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.

Wie die Ansteuerung des 1-Wire Bus unter dem Raspberry Pi funktioniert, haben wir bereits auf Einplatinencomputer in einem früheren Artikel erklärt. In Sachen Software muss man beim Banana Pi aber etwas anderes herangehen. Der Schaltungsaufbau ist allerdings identisch.

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 unser Tutorial verwenden wir den Temperatursensor DS1820. Dieser ist bei diversen Händlern erhältlich, unteranderem auch bei Amazon. Der Sensor besitzt 3 Pins und kann mit wenig Aufwand vom Pi angesteuert werden. Folgende drei Anschlüsse sind vorzufinden:

DS1820 (Bild: kompf.de)

DS1820 (Bild: kompf.de)

  • Pin 1: GND, Masse
  • Pin 2: DQ, Daten
  • Pin 3: VDD, Betriebsspannung

Schaltungsaufbau Temperatursensor DS1820

Üblicherweise wird der Sensor mit einer Betriebsspannung (Pin 3) zwischen 3 und 5 Volt betrieben, daher verbinden wir den Pin 3 mit dem 3,3 Volt-Pin des Banana Pi. Weiterhin schließen wir den Ground Pin 1 an einen Ground vom Pi (Pin 9), sowie die Datenleitung DQ des Sensors (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. Unabhängig davon, wie viele Sensoren wir verwenden, ist insgesamt nur ein 4k7 Ohm Wiederstand notwendig. Das GPIO-Headerlayout kann hier nachgelesen werden.

Aus den Angaben ergibt sich nun folgende Schaltung zur Ansteuerung von einem oder mehreren Sensoren.

DS1820 Ansteuerung

DS1820 Ansteuerung

Software: Vorbereitung

Nachdem die Hardware angebracht ist, können wir mit der Software fortfahren. In diesem Tutorial verwenden wir das Betriebssystem Raspbian. Anders als beim Raspberry Pi weichen wir auf ein Zusatztools von Github aus, um den 1-Wire-Bus zugänglich zu machen.

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

Anschließend müssen wir die binäre Konfigurationsdatei script.bin bearbeiten. Diese Datei wird vom Allwinner SoC verwendet und liegt unter /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. Abschließend ist ein Neustart erforderlich.

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

Software: Auslesen des DS1820 1-wire

Nachdem die Vorbereitung getroffen sind, kann mit dem Auslesen der Temperatur vom DS1820 Temperatursensor begonnen werden.

Da wir mit dem 1-Wire-Bus arbeiten, können mehrere Sensoren nach der oben gezeigten Schaltung am Pi ausgelesen werden. 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.

Zunächst mal müssen wir herausfinden welche Identifikationsnummer unser Sensor hat. Damit erfahren wir auch wie das dazugehörige Verzeichnis heißt. Wir wechseln also 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.

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

Über den Autor

Tony

Ich bin Tony, begeistert von Einplatinencomputer und berichte über meine Erfahrungen und Projekte mit dem Raspberry Pi, Banana Pi und anderen Minicomputern.

Hinterlasse eine Antwort

Kommentare

  • Hallo, habe einen Bananapro mit Lubuntu

    hier der Teminalauszug zur Sofwarevorbereitung:

    bananapi@lemaker:~$
    bananapi@lemaker:~$ sudo apt-get install git
    Reading package lists… Done
    Building dependency tree
    Reading state information… Done
    git is already the newest version.
    0 upgraded, 0 newly installed, 0 to remove and 48 not upgraded.
    bananapi@lemaker:~$ git clone https://github.com/linux-sunxi/sunxi-tools
    Cloning into ’sunxi-tools’…
    remote: Counting objects: 1113, done.
    remote: Compressing objects: 100% (18/18), done.
    remote: Total 1113 (delta 10), reused 0 (delta 0), pack-reused 1095
    Receiving objects: 100% (1113/1113), 391.34 KiB | 313.00 KiB/s, done.
    Resolving deltas: 100% (598/598), done.
    Checking connectivity… done.
    bananapi@lemaker:~$ cd sunxi-tools
    bananapi@lemaker:~/sunxi-tools$ make
    gcc -g -O0 -Wall -Wextra -std=c99 -D_POSIX_C_SOURCE=200112L -Iinclude/ -o fexc fexc.c script.c script_uboot.c script_bin.c script_fex.c
    ln -s fexc bin2fex
    ln -s fexc fex2bin
    gcc -g -O0 -Wall -Wextra -std=c99 -D_POSIX_C_SOURCE=200112L -Iinclude/ -o bootinfo bootinfo.c
    bootinfo.c: In function ‘print_script’:
    bootinfo.c:274:25: warning: unused parameter ‘script’ [-Wunused-parameter]
    void print_script(void *script)
    ^
    gcc -g -O0 -Wall -Wextra -std=c99 -D_POSIX_C_SOURCE=200112L -Iinclude/ pkg-config --cflags libusb-1.0 -o fel fel.c pkg-config --libs libusb-1.0
    gcc -g -O0 -Wall -Wextra -std=c99 -D_POSIX_C_SOURCE=200112L -Iinclude/ -o pio pio.c
    pio.c: In function ‘do_command’:
    pio.c:316:57: warning: unused parameter ‘argc’ [-Wunused-parameter]
    static int do_command(char *buf, const char **args, int argc)
    ^
    gcc -g -O0 -Wall -Wextra -std=c99 -D_POSIX_C_SOURCE=200112L -Iinclude/ -c -o nand-part-main.o nand-part-main.c
    gcc -g -O0 -Wall -Wextra -std=c99 -D_POSIX_C_SOURCE=200112L -Iinclude/ -c -o nand-part-a10.o nand-part.c -D A10
    gcc -g -O0 -Wall -Wextra -std=c99 -D_POSIX_C_SOURCE=200112L -Iinclude/ -c -o nand-part-a20.o nand-part.c -D A20
    gcc -o nand-part nand-part-main.o nand-part-a10.o nand-part-a20.o
    bananapi@lemaker:~/sunxi-tools$ sudo /home/bananapi/sunxi-tools/bin2fex script.bin bananapi.fex
    E: fexc: script.bin: No such file or directory

    mit: sudo nano bananapi.fex erscheint dann eine leere Datei

    wo ist der Fehler? befindet sich beim Bananapro die Datei woanderst? wer kann mir da weiterhelfen?

    Gruß Joe

    • Zumindest bei Bananian liegt die Datei nicht unter /boot, sondern auf dem Device /dev/mmcblk0p1. Falls das bei Lubuntu identisch ist: Einfach Device mounten und die Datei dort verwenden – der Rest stimmt mit diesem Howto überein.

  • Bananian kann bei mir die Datei bin2fex nicht finden. Ich habe schon in sämtlichen Verzeichnissen manuell geschaut. Ohne Ergebnis.

    • Statt sich erst github zu holen, dann noch make und gcc und dann doch auf Fehlermeldungen zu stoßen, tut es ein einfaches

      apt-get install sunxi-tools

      und das bin2fex ist fertig installiert. Geht echt einfacher …

  • Hallo Bastler,
    ich habe auch versucht an meinem Bananapi ein(ige) ds1820 auszulesen. Leider bin ich aber anfangs gescheitert. Zum Ersten muss in der (hier benutzt) bananapi.fex am Ende folgender Eintrag stehen:
    [w1_para]
    gpio = 4
    Der passende GPIO Pin dazu ist der Pin 12 (rechte Seite, sechs nach unten), nicht Pin 7. In dem Diagramm „Belegung GPIO für Raspberry Pi, Banana Pi und WiringPi im Vergleich“ auf https://www.elektronik-kompendium.de/sites/raspberry-pi/1907101.htm lässt sich erkennen „Pin:12 // GPIO 18 (GPIO_GEN1) // PH 02“ . Also Pin 12 ist PH02.
    In der bananapi.fex im Absatz [gpio_para] findet man folgende Zeile:
    gpio_pin_4 = port: PH02
    … Also Pin 12 –> PH02 –> gpio_pin_4 ([w1_para] … gpio = 4)
    Muss man nicht verstehen, geht jetzt aber bei mir…
    Danke Tony!
    Grüße
    Jonny & 73 de dg9oaa