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.
- Luftdrucksensor BMP180 auf Amazon ansehen (ca. 8 Euro, wird hier verwendet)
- Luftdrucksensor BMP180 auf Amazon ansehen (ca. 7 Euro)
- Luftdrucksensor BMP180 auf Amazon ansehen (ca. 7 Euro)
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.
- 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/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.
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
Bei jedem Sensor können die Pins unterschiedlich angeordnet sein.
Siehe hier: http://codetrainer.de/de/trainer/view/43/123
“Leider kann es bei den BMP180 unterschiedlich sein, in welcher Reihenfolge die Pins sind. Wichtig ist dabei, dass du SDA vom BMP auch an den SDA Pin am Raspberry Pi anschließt. Selbiges gilt natürlich auch für die anderen Pins.”
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.