Luftdruckmessung mit dem BMP180 Sensor und Arduino
Mit dem Sensor BMP180 von Bosch gibt es die Möglichkeit den aktuellen Luftdruck und die Temperatur mit Hilfe eines Microcontrollers über das I2C Protokoll zu messen. Bosch stellt ein ausführliches Datenblatt zur Verfügung.
Der Sensor ist auf einem Breakout-Board günstig zu beziehen und direkt einsatzbereit. Er kann mit 5V oder 3.3V betrieben werden und hat die benötigten Pull-Up Widerstände des I2C Busses bereits aufgelötet.
- Download der Software Bibliothek für den BMP180 in Verwendung bei Arduino Projekten. Zum Quellcode.
- LDO (mit Aufdruck 662K) auf dem Modul: LM6206-3.3 N
Anschlüsse
PIN | Beschreibung | Uno | Leo | Due |
---|---|---|---|---|
VCC | 5V Versorgungsspannung | |||
GND | Masse | |||
SCL | Taktsignal von I2C | A5 | 3 | 21 |
SDA | Datensignal von I2C | A4 | 2 | 20 |
3.3 | 3.3K Pull-Up Widerstände |
Eigenschaften
- I2C Adresse ist 1110111 (0x77, 119).
- Luftdruck: Auflösung 16 bis 19 Bit bzw. 0,01 hPA. Messbereich von 300 bis 1100hPa.
- Temperatur: Auflösung von 16 Bit bzw. 0,1°C. Messbereich von -40 bis 85°C.
- Stromverbrauch bei Messung 1mA, Standby 4µA.
Verwendung
Der BMP180 hat in seinem EEPROM 11 individuelle Koeffizienten (je 16 Bit) gespeichert, welche zur Kalibrierung des Messdaten herangezogen werden müssen. Die Koeffizienten werden am besten einmal initial vor der ersten Messung ausgelesen und gespeichert. Danach kann zuerst die Temperatur und dann der Luftdruck gemessen werden. Je nach Auflösung dauert die Messung unterschiedlich lange. Es kann zwischen vier Auflösungen gewählt werden.
Der gemessene Luftdruck muss ggfs. auf den Luftdruck auf Normalnull mittels der Barometrischen Höhenformel normalisiert werden. Wie das gleeht, steht ebenfalls im Datenblatt. Genauso wie eine An Die Messwerte, Temperatur sowie Luftdruck, müssen dann mit den Koeffizienten aufwändig verrechnet werden (siehe Datenblatt).
Der gemessene Luftdruck ist natürlich der Luftdruck der aktuellen Höhe und unterscheidet sich eventuell vom Luftdruck auf Normalnull. Für metereologische Zwecke muss dieser mit der Barometrischen Höhenformel normalisiert werden. Weiter Infos dazu stehen auch im Datenblatt, genauso wie eine Anleitung die aktuelle Höhe über den Luftdruck zu ermitteln.
Register
Name | Adresse | Beschreibung |
---|---|---|
out_xlsb | 0xF8 | unterste 8 Bit der Messung (untersten 3 Bit sind immer 0) |
out_lsb | 0xF7 | mittlere 8 Bit der Messung |
out_msb | 0xF6 | oberste 8 Bit der Messung |
ctrl_meas | 0xF4 | Messung starten (siehe unten) |
soft reset | 0xE0 | Soft Reset - 0xB6 initialisiert Reset |
id | 0xD0 | ID - muss 0x55 sein |
MD | 0xBF | Kalibrierungs Koeffizient - 16 Bit |
MC | 0xBD | Kalibrierungs Koeffizient - 16 Bit |
MB | 0xBB | Kalibrierungs Koeffizient - 16 Bit |
B2 | 0xB9 | Kalibrierungs Koeffizient - 16 Bit |
B1 | 0xB7 | Kalibrierungs Koeffizient - 16 Bit |
AC6 | 0xB5 | Kalibrierungs Koeffizient - 16 Bit |
AC5 | 0xB3 | Kalibrierungs Koeffizient - 16 Bit |
AC4 | 0xB1 | Kalibrierungs Koeffizient - 16 Bit |
AC3 | 0xAF | Kalibrierungs Koeffizient - 16 Bit |
AC2 | 0xAD | Kalibrierungs Koeffizient - 16 Bit |
AC1 | 0xAB | Kalibrierungs Koeffizient - 16 Bit |
Das ctrl_meas Register wird für eine Messung wie folgt beschrieben:
- Temperatur messen: 0x2E
- Luftdruck messen: 0x34 + (OSS << 6)
OSS ist ein zwei Bit großer Flag, welcher die Auflösung der Messung bestimmt. Siehe nächste Tabelle.
Auflösungen
Auflösung | Bit | OSS | Zeit | Rauschen |
---|---|---|---|---|
ultra low power | 16 | 0x00 | 4,5ms | 0,06hpA |
standard | 17 | 0x01 | 7,5ms | 0,05hpA |
high resolution | 18 | 0x02 | 13,5ms | 0,04hpA |
ultra high resolution | 19 | 0x03 | 25,5ms | 0,03hpA |
Kontaktaufnahme
Um den ersten Kontakt mit dem BMP180 ohne Verwedung einer Bibliothek aufzunehmen, eignet sich das Auslesen des Chip-ID Register. Dieses hat stets den Wert 0x55.
#include <Wire.h>
void setup()
{
// welcome
Serial.begin(9600);
Serial.println("Read BMP180's ID");
Serial.println("must be 0x55 ...");
Serial.println();
// select register
Wire.begin();
Wire.beginTransmission(0x77);
Wire.write(0xD0);
Wire.endTransmission();
// read value
Wire.beginTransmission(0x77);
Wire.requestFrom(0x77, 1);
byte b = Wire.read();
Wire.endTransmission();
// output
Serial.print("ID is: 0x");
Serial.println(b, HEX);
}
void loop() {}