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.
- BMP180 Luftdrucksensor
- Female-Female Jumper Kabel
- (Breadboard)
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).
Sensor | Raspberry Pi |
---|---|
VCC | 3V3 (Pin 1) |
GND | GND (Pin 6) |
SCL | SCL (pin 5) |
SDA | SDA (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:
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/ git checkout 9ff733d59242a02f7ccd0222001ce80f6090a978 cd 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:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
#!/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 |
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.
23 Kommentare
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 !
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
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
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
Bei mir funktionierte der angegebene Pfad nicht. Ich habe nach vielen Versuchen rausbekommen: cd Adafruit_Python_BMP
Hallo Felix bzw. auch an die Mitleser!
Mittlerweile sieht ja der beispielcode von Adafruit wie folgt aus:
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
Woran scheitert es denn genau bzw. was hast du denn schon?
Hallo Roland.
Schau mal auf folgende Seite:
kompf.de/weather/pibaro.html
da wird mit rrd gearbeitet, ich gehe davon aus, das du die benötigten Anpassungen machen kannst.
Ansonsten kann ich dir auch eine detailiertere Anleitung zukommen lassen.
Freundliche Grüsse
Daniel
Hallo,
ich möchte den BMP 180 sehr gerne an meinem Raspi anschließen, leider sind beide I2Cs bei mir bereits durch andere User belegt. Gibt es eine Möglichkeit diese über SPI laufen zu lassen, die wären noch frei.
Danke für ne Rückmeldung,
Matthias
Hi Matthias,
du kannst mehr als zwei I2C Geräte nutzen, sofern sie nicht die selbe Adresse haben. Wenn du keinen BMP180 nutzt, solltest du diesen noch anschließen können.
Anders sieht es bei SPI aus: Da nur zwei ChipSelects auf dem Pi vorhanden sind, sind nur 2 SPI Module verwendbar.
Hallo Felix,
im Prinzip funktioniert der Python-Code hervorragend, allerdings habe ich Probleme mit den Pfaden. Gern würde ich den Python-Code von Adafruit für den BMP-Sensor wie für den DHT22-Sensor nach /usr/local/lib/python2.7/site-packages installieren, allerdings wird der dort nicht gefunden.
BTW: Funktioniert der BMP085-Code auch für den BMP280?
Hallo Jan,
das würde mich heute (29.Aug.2018 !) auch interessieren…scheint aber niemand zu stören…
ich kann nur den 180 „auslesen“ (0x77), der 280 hat ja scheinbar die 0x76 ….
Hallo zusammen,
Super Tutorial, vielen vielen Dank!
Stand heute (18.11.2017) funktioniert das wie oben beschrieben mit dem neuen git Link und Raspi 3 immer noch! Ich habe als absoluter Anfänger nur sehr lange nach einer Fehlerquelle gesucht: Es kamen immer irgendwelche IO errors. Schuld war die schlechte Verbindung auf dem Steckbrett. Ich hatte alles nur lose zusammengesteckt i2cdetect hat dann zwar auch Kontakt gemeldet aber ich bekam keine Werte ausgelesen.
Wenn ich dann per Hand den Sensor leicht am Brett festgedrückt habe ging es plötzlich (nach 3 Stunden Fehlersuche) 🙂
Eine Frage bleibt noch: Die Werte für Altitude liefern bei mir unsinnige Werte ( – 40 m) obwohl ich nicht in Israel sitze. Wie kann ich das anpassen?
Hallo Felix,
das ist jetzt schon die zweite Anleitung, die ich nutze und bin bis zum letzten Schritt (Anzeige mit Adafruit) ohne Probleme durchgekommen, Danke dafür!!
Ich plane zwei Scripte zu kombinieren: Vom DHT22 sende ich die Daten an Thingspeak (nach dem anderen Tutorial), jetzt möchte ich auch die Daten vom BMP dorthin senden. Wie genau geht das?
Gibt es da schon eine kombinierte Python-Datei? Oder zwei Dateien?
Im Grunde genommen identisch. Du rufst einfach eine andere Funktion auf (die den Wert vom BMP zurückgibt) und speicherst diesen. Geht in einer oder zwei Dateien – wie du möchtest.
Hallo zusammen,
die Anleitung war mal wieder tadellos. Allerdings misst mein Sensor folgende Werte:
Temperature: 12.80 C
Pressure: 127.51 hPa
Altitude: 14449.01
Der Sensor steht in meinem Wohnzimmer, welches in etwa 20-21 Grad warm ist. Auch der gemessene Luftdruck ist flasch. Muss der Sensor kalibriert werden? Oder hat sonst jemand eine Idee?
Habe das gleiche Problem
Wie ist denn der Username /Passwort für den Account auf Github der die Berechtigung hat die Bibliothek zu laden. Ich würde die sehr gerne verwenden.
Ich hab hier eine Anleitng entdekt die keine speziellen Berechtigungen abfragt:
https://learn.adafruit.com/using-the-bmp085-with-raspberry-pi/using-the-adafruit-bmp-python-library
Ansonsten danke für das Super Tutorial – bei mir geht der Sensor jetzt wie er soll!
verflixt nochmal,
gutes tutorial, auch für leute wie mich (anfänger) !
ABER :
bei der ausgabe des LUFTDRUCKS (hPa) bekomme ich immer 30 hPa ZU WENIG angezeigt.
WIE also kann ich diese irgendwie addieren ? bitte keine kommentare wie : datenblatt etc.
schrieb schon, bin blutiger anfänger, der sich wie bolle über jedes geglückte projekt freut !
Hallo,
das ist eine sehr schöne und hilfreiche Anleitung.
Ich kam gut damit zurecht – Danke.
aber:
Ich bekomme einen negativen Wert für den Druck und eine völlig abwegige Temperatur
Woran kann das liegen?
Temperature: 82.70 C
Pressure: -44569.37 hPa
Hab mir auch so einen BMP180 gekauft. Leider schlägt die Installation fehl da der Treiber dafür bei git wohl nicht mehr zu finden ist. Mein Englisch ist nicht so weit her das ich es selbst finde. Wer kann mir helfen die korrekte Datei zu finden. Mein Kleiner ist schon ganz traurig weil es nicht geht.
Sensor wird aber gefunden. Dkese Vorarbeit ist also gemacht.
Danke
Problem gelöst 🙂