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.

Breakout-Board mit BMP180

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

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:

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() {}