Raspberry Pi

Raspberry Pi: Luftdrucksensor BMP180 ansteuern

BMP180

Der Raspberry Pi unterstütz durch die GPIO-Pins zahlreiche Protokoll und ermöglicht somit das Beschalten von diversen Sensoren und anderen Geräten. Der Luftdrucksensor BMP180 eignet sich besonders zur Realisierung einer Wetterstation oder ähnlichem. Der BMP180 Sensor misst neben dem Luftdruck auch die Temperatur und wird über I2C ausgelesen. Wie man den Luftdrucksensor BMP180 mit dem Raspberry Pi ansteuern und verwenden kann, wird im Folgenden erklärt.

Luftdrucksensor BMP180

Das Barometer BMP180, auch bezeichnet als GY-68, misst neben dem Luftdruck auch die aktuelle Temperatur der Umgebung und wird über den seriellen Datenbus I2C mit dem Raspberry Pi verbunden und ausgelesen. Der Vorgänger des BMP180 ist der Luftdrucksensor BMP085 (oder auch GY-65). Die beiden Sensoren unterscheiden sich prinzipiell in der Genauigkeit: Beim älteren Modell BMP085 weicht die Temperatur um ±2°C und der Luftdruck um -4 bis +4 hPa ab. Beim Luftdrucksensor BMP180 sind die Abweichungen mit ±1°C und -4 bis +2 hPa für Temperatur und Luftdruck etwas geringer.

Weiterhin unterscheiden sich die Sensorplatinen in der Anzahl der Pins. Dennoch werden für die Ansteuerung nur 4 Pins verwendet – bei beiden Modellen. Je nach Hersteller kann die Pinanzahl der Sensorplatine anders sein. Dennoch funktionieren von der Beschaltung und Ansteuerung her alle gleich. Im Folgenden sind einige Links zu den Sensoren aufgelistet. Preislich wird der Luftdrucksensor BMP180 von 3 bis 8 Euro angeboten, je nachdem wie die dazugehörigen Versandkosten ausfallen.

Für dieses Tutorial verwende ich den markierten Link in der Auflistung. Wie bereits erläutert, gibt es das Sensormodul auch von anderen Herstellern. Diese wurden aber an dieser Stelle nicht getestet, sodass ich dazu keine Aussage über die Qualität treffen kann. prinzipiell sollten diese Module aber gleichermaßen funktionieren, da alle notwendigen Pins vorhanden sin.

Pinbelegung Luftdrucksensor BMP180

Der Luftdrucksensor BMP180 wird mittels dem I2C Bus an den Raspberry Pi angeschlossen und mit 3,3 Volt versorgt. Dafür können direkt die 3,3 Volt des Pi genutzt werden. Im Folgenden ist der Sensor und die Bedeutung der Pins erläutert. Andere BMP180 Sensorplatinen (siehe Links) bringen nur 4 Pins mit. Dabei ist der letzte Pin, welcher nicht benötigt wird, bereits vernachlässigt wurden.

BMP180

BMP180

  • Pin 1: VCC, Betriebsspannung 3,3 Volt
  • Pin 2: GND, Masse
  • Pin 3: I2C (SCL)
  • Pin 4: I2C (SDA)
  • Pin 5: 3,3 (nicht benötigt)
]

Schaltungsaufbau

Um den Luftdrucksensor BMP180 mit dem Raspberry Pi anzusteuern müssen 4 Pins mit dem Pi verbunden werden. Versorgt wird der Sensor mit 3,3 Volt des Raspberry Pi. Dazu wird Pin 1 des Sensors mit Pin 1 des Raspberry Pi verbunden. Gleichzeitig wird der Masse-Pin des BMP180 (Pin 2) mit einem GND-Pin des Raspberry Pi verbunden (Pin 6). Als Datenleitung(en) kommt hier der I2C Bus zum Einsatz: Pin 3 (SCL) des BMP180 wird an Pin 5 des Pi und Pin 4 des Sensors (SDA) wird mit Pin 3 verbunden.

[table id=29 /]

Raspberry Pi: I2C aktivieren

Die Ansteuerung des BMP180 erfolgt wie schon erläutert über den I2C Datenbus. I2C ist von Haus aus nicht am Raspberry Pi aktiviert, sodass dies softwareseitig der erste Schritt ist, um den Luftdrucksensor zu verwenden. Im Artikel Raspberry Pi: I2C aktivieren kann nachgelesen werden, wie man I2C am Raspberry Pi aktiviert. Dennoch hier nochmal in der Kurzfassung, wie man I2C am Raspberry Pi aktiviert.

I2C Kernel Suppert aktivieren

Zunächst können wir I2C über das Konfigurationsmenü des Pi aktivieren.

sudo raspi-config

Dazu navigiert man in der Oberfläche zu Advanced Options – I2C um den Datenbus zu aktivieren (Enable).

/etc/modules

In der Datei /etc/modules wird festgelegt, welche Kernel-Module beim Systemstart geladen werden soll. Dort müssen relevante Einträge für I2C ebenfalls eingetragen sein bzw. eingetragen werden.

sudo nano /etc/modules

In die Datei müssen folgende Zeilen stehen.

i2c-bcm2708
i2c-dev

/etc/modules

/etc/modules

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

In der Datei /etc/modprobe.d/raspi-blacklist.conf stehen Module, die während des Betriebs nicht geladen werden. Das bedeutet konkret, dass hier keine Einträge zu I2C enthalten sein dürfen.

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

Die folgenden Zeilen dürfen nicht in der Datei stehen bzw. müssen durch voranstellen des Zeichens # pro Zeile auskommentiert werden, damit I2C aktiv wird.

# blacklist spi and i2c by default
# blacklist spi-bcm2708
# blacklist i2c-bcm2708

Damit alle Einstellungen zu I2C übernommen werden, muss der Raspberry Pi neugestartet werden.

sudo reboot

Luftdrucksensor BMP180 auslesen mit Python

Zum Auslesen des angeschlossenen Luftdrucksensor BMP180 über den I2C Datenbus nutzen wir in diesem Fall die Programmiersprache Python. Dazu bringen wir das System zunächst auf den aktuellsten Stand und installieren relevante Pakete.

sudo apt-get update
sudo apt-get install git build-essential python-dev python-smbus i2c-tools

Als nächstes Testen wir zunächst, ob der BMP180 auf unserem I2C Bus auftaucht.

i2cdetect -y 1

In der Ausgabe auf diesen Befehl sollte der Sensor unter der Adresse 77 sichtbar werden. Damit wissen wir, dass der BMP180 erfolgreich an den Raspberry Pi angeschlossen ist.

i2cdetect BMP180

i2cdetect BMP180

Um nun den Sensor auszulesen greifen wir auf die entsprechende Python-Bibliothek von Adafruit zurück. Diese bringt bereit alle notwendigen Funktionen mit, welche zum Auslesen des BMP180 notwendig sind und funktioniert außerdem auch mit dem Vorgängermodell BMP085. Die Bibliothek laden wir uns zunächst vom Git-Repository herunter und wechseln in das entsprechende Verzeichnis.

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

Anhand des Ordners ist zu erkennen, das es sich hierbei um die Bibliothek des BMP085 handelt. Diese ist aber mit dem BMP180 kompatibel, sodass wir diese dafür gleichermaßen nutzen können. Zu der Bibliothek wird auch ein Beispiel-Skript mitgebracht, welches wir für den ersten Test nutzen.

sudo python Adafruit_BMP085_example.py

Als Ausgabe erhalte ich folgende Zeilen.

Temperature: 24.10 C
Pressure: 989.78 hPa
Altitude: 197.09

Eigener Skript

Um die Ansteuerung aus einem eigenen Pythin Code heraus zu realisieren können die Codezeilen aus dem Beispiel-Skript der Bibliothek einfacher Weise direkt übernommen werden und auf die eigenen Bedürfnisse zur Weiterverarbeitung angepasst werden. Dabei ist es sinnvoll sich die Beispieldatei zu kopieren und einfach abzuändern. Die Beispiel-Datei ermöglicht mit folgenden Zeilen das Auslesen des BMP180 bzw. des BMP085 mittels Python.

#!/usr/bin/python

from Adafruit_BMP085 import BMP085

# ===========================================================================
# Example Code
# ===========================================================================

# Initialise the BMP085 and use STANDARD mode (default value)
# bmp = BMP085(0x77, debug=True)
bmp = BMP085(0x77)

# To specify a different operating mode, uncomment one of the following:
# bmp = BMP085(0x77, 0)  # ULTRALOWPOWER Mode
# bmp = BMP085(0x77, 1)  # STANDARD Mode
# bmp = BMP085(0x77, 2)  # HIRES Mode
# bmp = BMP085(0x77, 3)  # ULTRAHIRES Mode

temp = bmp.readTemperature()

# Read the current barometric pressure level
pressure = bmp.readPressure()

# To calculate altitude based on an estimated mean sea level pressure
# (1013.25 hPa) call the function as follows, but this won't be very accurate
altitude = bmp.readAltitude()

# To specify a more accurate altitude, enter the correct mean sea level
# pressure level.  For example, if the current pressure level is 1023.50 hPa
# enter 102350 since we include two decimal places in the integer value
# altitude = bmp.readAltitude(102350)

print "Temperature: %.2f C" % temp
print "Pressure:    %.2f hPa" % (pressure / 100.0)
print "Altitude:    %.2f" % altitude

Hinterlasse eine Antwort

Kommentare

  • Hallo Tony,

    vielen Dank für das tut, echt gut und die Beispiel-Datei funktioniert auch.

    Nun habe ich das in mein Projekt einfließen lassen, aber das Script bricht mit folgender Meldung ab:

    Traceback (most recent call last):
    File “/home/pi/Documents/Python-Projects/gardendisplay.py”, line 18, in
    from Adafruit_BMP085 import BMP085
    ImportError: No module named Adafruit_BMP085

    Wie Du siehst, befindet sich Datei in einem anderen Ordner, was zu allen anderen Sensoren Problemlos war. Jetzt findet er die Bibliothek nicht. Muss ich den Pfad mit angeben und wenn ja, wie?

    Ich habe selbst schon den Pfad zum Speicherort der Bibliothek angegeben, da meldet er einen Syntaxfehler.

    Vielen Dank im voraus.

    Lg, Heiko

    • Versuche mal die Dateien Adafruit_BMP085.py Adafruit_I2C.py in deinen Projektordner “/home/pi/Documents/Python-Projects/”.

      Gruß
      Nordländer

  • Hallo und vielen Dank für die Anleitung.
    Leider hat es bei mir nicht ganz funktioniert…

    Mein Baro wird zwar richtig erkannt:

    pi@raspberrypi:~/dev/Adafruit_Python_BMP/examples $ sudo 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

    Bei Ausführen des Beispielcodes erhalte ich jedoch folgende Meldung:

    pi@raspberrypi:~/dev/Adafruit_Python_BMP/examples $ sudo python simpletest.py
    Traceback (most recent call last):
    File “simpletest.py”, line 37, in
    sensor = BMP085.BMP085()
    File “build/bdist.linux-armv7l/egg/Adafruit_BMP/BMP085.py”, line 69, in __init__
    File “build/bdist.linux-armv7l/egg/Adafruit_BMP/BMP085.py”, line 72, in _load_calibration
    File “build/bdist.linux-armv7l/egg/Adafruit_GPIO/I2C.py”, line 201, in readS16BE
    File “build/bdist.linux-armv7l/egg/Adafruit_GPIO/I2C.py”, line 178, in readS16
    File “build/bdist.linux-armv7l/egg/Adafruit_GPIO/I2C.py”, line 165, in readU16
    File “build/bdist.linux-armv7l/egg/Adafruit_PureIO/smbus.py”, line 173, in read_word_data
    IOError: [Errno 121] Remote I/O error

    Hast du eine Idee, wie ich das lösen könnte?
    Habe schon viele Tutorials durchgespielt, jedoch immer mit dem gleichen Ergebnis.

    Danke
    Gruß
    Jörg

  • Mittlerweile gibt es in dieser Serie (BMP085/180) auch neuere Sensoren (BMP280/BME280/BMP680) mit höherer Genauigkeit. Der BME280 zusätzlich auch noch mit Feuchtemessung. Der BMP680 miss auch noch zusätzlich die Luft-Qualität.
    Die neueren Sensoren können wahlweise mit I2C- bzw. SPI-Interface betrieben werden.