41hzO2wpnZL

GPIO

Raspberry Pi und I2C Luftdrucksensor BMP180

Für Wetterstationen und ähnliche Projekte ist es oftmals wichtig den Luftdruck zu bestimmen. Wie man Temperatur und Luftfeuchtigkeit mit Sensoren bestimmt, wurde bereits in vorherigen Tutorials gezeigt. Mit Hilfe des Barometers BMP180 lässt sich über den I²C Bus des Raspberry Pi’s auch einfach der Luftdruck (in hPa / bar) bestimmen.



Im Gegensatz zum DHT11 / DHT22 lässt sich mit dem BMP180 keine Luftfeuchtigkeit messen, dafür aber der Luftdruck, was wiederum die anderen beiden Sensoren nicht können. Beide können aber darüber hinaus auch die Temperatur messen.

Zubehör

Das frühere Modell BMP085 wurde von Bosch hergestellt. In diesem Tutorial benutze ich ein Nachfolgemodell BMP180, wobei auch die vorherige Version kompatibel ist.

 

Aufbau

Jenachdem welches Modell (und von welchem Hersteller) du benutzt kann die Beschriftung unterschiedlich sein. Ich versuche daher eine allgemeine Beschreibung zu geben. Insgesamt werden nur vier Pins des Raspberry Pi’s gebraucht (3V3, GND, Datenleitung SDA, Takt SCL).

SensorRaspberry Pi
VCC3V3 (Pin 1)
GNDGND (Pin 6)
SCLSCL (pin 5)
SDASDA (Pin 3)

Alle anderen Pins des Sensors (z.B. 3.3 oder XCLR) müssen nicht angeschlossen werden.
Hier noch die Pin Belegung des Raspberry Pi’s:
RaspberyPI_GPIO_Belegung

 

I²C aktivieren

Da der BMP180 Sensor über den I²C Bus arbeitet, muss dieser erst freigeschaltet werden, da er standardmäßig deaktiviert ist (falls du das bereits getan hast, kannst du zum nächsten Kapitel springen).

Wir bearbeiten dazu erst folgende Datei:

sudo nano /etc/modules

An das Ende der Datei werden diese beiden Zeilen hinzugefügt:

i2c-bcm2708
i2c-dev

Mittels STRG+O und STRG+X speichern und beenden wir.
Nun können wir die blacklist einträge auskommentieren (in manchen Versionen ist die Datei nicht vorhanden, dann einfach zum nächsten Befehl übergehen):

sudo nano /etc/modprobe.d/raspi-blacklist.conf

Hier können wir mittels einer Raute # die entsprechenden Einträge auskommentieren.

#blacklist spi-bcm2708
#blacklist i2c-bcm2708

In Raspbian Versionen ab 2015 ist außerdem noch zusätzlich eine Aktivierung des Devietrees nötig. Das kann in der Konfiguration vorgenommen werden:

sudo raspi-config

Unter „Advanced Options“ aktivierst du das automatische Laden des I2C Bus. Starte deinen Raspberry neu.

Nun installieren wir noch drei benötigte Tools:

sudo apt-get install python-smbus i2c-tools git

Anschließend kannst du mittels

i2cdetect -y 1

testen, ob alles geklappt hat. Es sollte ein Gerät angezeigt werden. Bei mir sieht es folgendermaßen aus:

pi@raspberrypi ~ $ i2cdetect -y 1
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- 77

 

Software

Der einfachste Weg den Sensor anzusprechen ist eine bestehende Bibliothek zu nehmen, die bereits alle Funktionen hat. Adafruit bietet solch eine Bibliothek an, mit Beispielen auch zu anderen Sensoren.

Wir klonen das Repository von Adafruit (git muss installiert sein).

git clone https://github.com/adafruit/Adafruit-Raspberry-Pi-Python-Code.git && cd Adafruit-Raspberry-Pi-Python-Code/Adafruit_BMP085

Anschließend können wir bereits einen ersten Test machen:

sudo python Adafruit_BMP085_example.py

Das Skript wird eine Ausgabe ähnlich zu dieser liefern:

Temperature: 25.70 C
Pressure:    1007.08 hPa
Altitude:    50.83

In meinem Test waren es also 1007 hPa (was 100700 Pascal oder 1,007 bar entspricht).

 

Nun können wir die Datei natürlich auch in ein anderes Projekt einbinden. Dazu kopieren wir lediglich die einzubindende Datei und bearbeiten die eben aufgerufene Adafruit_BMP085_example.py, welche so aussieht:

Wie du siehst, gibt es mehrere Modi (Ultralowpower, etc) die du angeben kannst. Dir steht es nun frei die Datei deinen Wünschen nach anzupassen und/oder zu verändern.

 



, , , , , , , , ,


6 Kommentare

  1. Heinz sagt:

    Aus dem Artikel entnehme ich, dass bis auf 1 Pascal genau ausgegeben wird. Wie genau sind diese Werte ?
    Ich möchte eine Differenzdruckmessung mit einem Prandtl – Rohr durchführen. Dabei geht es um wenige Pascal Druckunterschied. Ich müsste zwei Drucksensoren am Raspi haben und die Differenz bilden. Ist das wohl vernünftig und einigermassen genau mit der vorgeschlagenen Anordnung ?

    Danke für eine Einschätzung !

    • Felix sagt:

      Hallo Heinz,
      laut Datenblatt gibt der Sensor die Werte in 0.01 hPa Schritten an, wobei die Ungenauigkeit zwischen 0.02 und 0.06 hPa liegen kann, was 2-6 Pascal oder 0.00002 und 0.00006 Bar entspricht.
      Wenn es deine Anwendung zulässt, messe mehrmals und nimm den Durchschnitt oder besser den Median.
      LG Felix

  2. Frank sagt:

    Hallo Felix,

    kann es sein, das das Repository von Adafruit aktuell nicht mehr vollständig ist?

    Es wird im Verzeichnis nur noch die README.md angezeigt. Die Repositorys zu den einzelnen Sensoren liegen jetzt scheinbar einzeln in Github verteilt.

    Grüße

    Frank

    • Jens sagt:

      Hallo zusammen,
      Adafruit hat die Ablage der Repository geändert. Dieses hier kann man sich jetzt folgendermßen holen:
      git clone https://github.com/adafruit/Adafruit_Python_BMP.git && cd Adafruit-Raspberry-Pi-Python-Code/Adafruit_BMP085
      Im Verzeichnis mit der setup.py muss noch folgendes ausgeführt werden:
      sudo python setup.py install

  3. Roland sagt:

    Hallo Felix bzw. auch an die Mitleser!
    Mittlerweile sieht ja der beispielcode von Adafruit wie folgt aus:

    #!/usr/bin/python
    # Copyright (c) 2014 Adafruit Industries
    # Author: Tony DiCola
    #
    # Permission is hereby granted, free of charge, to any person obtaining a copy
    # of this software and associated documentation files (the "Software"), to deal
    # in the Software without restriction, including without limitation the rights
    # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
    # copies of the Software, and to permit persons to whom the Software is
    # furnished to do so, subject to the following conditions:
    #
    # The above copyright notice and this permission notice shall be included in
    # all copies or substantial portions of the Software.
    #
    # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
    # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
    # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
    # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
    # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
    # THE SOFTWARE.
    
    # Can enable debug output by uncommenting:
    #import logging
    #logging.basicConfig(level=logging.DEBUG)
    
    import Adafruit_BMP.BMP085 as BMP085
    
    # Default constructor will pick a default I2C bus.
    #
    # For the Raspberry Pi this means you should hook up to the only exposed I2C bus
    # from the main GPIO header and the library will figure out the bus number based
    # on the Pi's revision.
    #
    # For the Beaglebone Black the library will assume bus 1 by default, which is
    # exposed with SCL = P9_19 and SDA = P9_20.
    sensor = BMP085.BMP085()
    
    # Optionally you can override the bus number:
    #sensor = BMP085.BMP085(busnum=2)
    
    # You can also optionally change the BMP085 mode to one of BMP085_ULTRALOWPOWER,
    # BMP085_STANDARD, BMP085_HIGHRES, or BMP085_ULTRAHIGHRES.  See the BMP085
    # datasheet for more details on the meanings of each mode (accuracy and power
    # consumption are primarily the differences).  The default mode is STANDARD.
    #sensor = BMP085.BMP085(mode=BMP085.BMP085_ULTRAHIGHRES)
    
    print('Temp = {0:0.2f} *C'.format(sensor.read_temperature()))
    print('Pressure = {0:0.2f} Pa'.format(sensor.read_pressure()))
    print('Altitude = {0:0.2f} m'.format(sensor.read_altitude()))
    print('Sealevel Pressure = {0:0.2f} Pa'.format(sensor.read_sealevel_pressure()))

    Die Ausgabe funktioniert auch so weit. Nun würde ich gerne die Daten in eine rrd DB schreiben, woran ich kläglich scheitere. Kann mir da jemand auf die Sprünge helfen, wie der Code in etwa auszusehen hat?

    Ich dank euch!
    Grüße
    Roland

Schreibe einen Kommentar

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

Blog abonnieren

Abonniere Tutorials-RaspberryPi, um kein Tutorial mehr zu verpassen!