Luftdrucksensor BMP180
Der Luftdrucksensor BMP180 von Fa. Bosch gibt den gemessenen Luftdruck und die Umgebungstemperatur als Rohwerte über I2C-Schnittstelle aus. Mit Hilfe von ca. 24 teils vorgegebenen, teils zu berechneten Koeffizienten kann dann aus den Rohwerten der Luftdruck am Standort (Stationsniveauluftdruck) und die Umgebungstemperatur ermittelt werden, sowie der reduzierte Luftdruck bezogen auf Meereshöhe.
BMP180-Breakout Boards kenne ich in zwei Ausführungen. Entweder mit 4 Anschlüssen (VCC, GND, SCL und SDA) wie im Bild 1 oder mit einem fünften Anschlüssen (3.3) wie im Bild 2 ersichtlich. Beide Ausführungen haben Spannungswandler von 5 V (bzw. 4,5 - 12 V) auf 3,3 V integriert, über die die Boards mit 3,3 V versorgt werden. In der zweiten Ausführung ist die 3,3 V Spannung als Anschluss ausgeführt und kann als Spannungsausgang zur Versorgung eines Logic-Level-Converters, oder als Eingang zur Versorgung des Boards mit einer Spannung von 3,3 V verwendet werden.
Bild 1: Luftdrucksensor BMP180 auf Breakout Board
Bild 2: Luftdrucksensor BMP180 auf Breakout Board mit zusätzlichem 3,3 V Anschluss (siehe Beispiel unter Punkt "Testaufbau Attiny45/85")
Da der BMP185-Chip mit max. 3,6 V Versorgungs- und Logikspannung betrieben wird und z.B. der Arduino Uno, Nano oder Mega oder der Attiny45/85 mit einer Logikspannung von 5 V arbeiten, ist für die Umsetzung der Spannungspegel der I2C-Signale ein Logic-Level-Converter erforderlich. Pullup-Widerstände werden an den SCL- und SDA-Leitungen auf beiden Spannungsebenen benötigt, diese befinden sich aber bereits auf dem Level-Converter und sind daher in den nachfolgenden fritzing-Bildern nicht dargestellt.
I2C-Adresse:
Die I2C-Adresse ist mit 0x77 fix vorgegeben.
Testaufbau:
Verwendete Bauteile:
- 1 Arduino Uno
- 1 Logic-Level-Converter
- 1 BMP180-Luftdrucksensor Breakout Board
Verwendung eines Attiny45/85:
Sofern, der 3,3 V Anschluss herausgeführt ist, kann bei Verwendung eines Attiny45/85 die 3,3 V Versorgungsspannung für den Logic-Level-Converter direkt vom BMP180-Breakout Board stammen. Das Breakout Board muss dann aber über den 5 V Spannungseingang (VCC) versorgt werden.
Innenbeschaltung des Breakout-Boards mit ausgeführtem 3,3 V Anschluss:
Quelle: Datenblatt 31546-MP, Fa. MARLIN P. JONES & ASSOC., IINC., P.O. Box 530400 Lake Park, Fl 33403 800-652-6733 FAX 561-844-8764
Testaufbau Attiny:
Verwendete Bauteile:
- 1 Attiny45/85
- 1 Logic-Level-Converter
- 1 BMP180-Luftdrucksensor Breakout-Board (mit ausgeführtem 3,3 V Anschluss)
- 1 Resettaster
- 1 Programmierstecker 4-pol.
Wie man eine Attiny mit Hilfe eines Arduino programmiert findet ihr hier: Attiny-Programmierung
Library MyBMP180:
Sowohl für Arduino als auch für Attiny habe ich für diesen Sensor eine Library mit folgenden Funktionen geschrieben:
- Abfrage, ob der Baustein über I2C ansprechbar ist
- Ermittlung der Kalibrierungskoeffizienten
- Ermittlung der Umgebungstemperatur
- Ermittlung des Luftdrucks am Standort (Stationsluftdruck)
- Ermittlung des reduzierten Luftdrucks bezogen auf Meereshöhe (Reduzierter Luftdruck)
Die Library kann hier heruntergeladen werden:
Sollte die Library jemand verwenden oder testen, würde ich mich über eine Rückmeldung sehr freuen!
Vers. 2.1:
Leider kann ich hier keine "cpp"- oder "h"-Files hochladen, daher zum Verwenden der Library das Suffix ".txt" aus diesen Dateinamen entfernen und in einem neuen Verzeichnis mit dem Namen "MyBmP180" im Sketchbook-Ordner im Ordner "libraries" speichern.
Zur Auflistung der Funktionen der Library geht es hier: Funktionen
Programmbeispiel MyBMP180 für Arduino:
Das Programm gibt alle 5 Sekunden die Temperatur, den Luftdruck und den reduzierten Luftdruck am Seriellen Monitor aus.
//Testprogramm für Luftdrucksensor BMP180
//Code fuer Arduino
//Author Retian
//Version 2.1
#include <MyBMP180.h>
MyBMP180 BMP(0x77);
float temp, druck, rDruck;
int hoehe = 460; //Meter ueber dem Meeresspiegel meines Wohnortes
void setup()
{
Serial.begin(115200);
BMP.init(BMP180_ULTRA_HIGH_RESOLUTION); //Vorgabe je nach Aufloesung und Wandlungszeit
}
void loop()
{
temp = BMP.readTemp();
druck = BMP.readPress(); //gemessener Luftdruck am Standort//gerechneter Luftdruck auf Meereshoehe bezogen
rDruck = BMP.readReducedPress(hoehe);
Serial.println();
Serial.print("Temperatur: ");
Serial.println(temp);
Serial.print("<Luftdruck: ");
Serial.println(druck);
Serial.print("Reduz. Luftdruck: ");
Serial.println(rDruck);
delay(5000);
}
Programmbeispiel MyBMP180 für Attiny85:
Das Programm gibt die Werte für Lufttemperatur, Luftdruck und reduzierten Luftdruck nacheinander auf einer 7-Segmentanzeige mit I2C-Schnittstelle aus. Dafür verwende ich eine Anzeige mit HT16K33-Chip.
Neben der Library MyBMP180 werden noch folgende Libraries benötigt:
- MyHT16K33_7Seg: Meine Library für die 7-Segmentanzeige kann hier heruntergeladen werden: 7-Segm.anz. HT16K33
- TinyWireM: Zur I2C-Kommunikation für Attiny, ein Link dazu ist hier zu finden: Fremd-Libraries
//Testprogramm für Luftdrucksensor BMP180
//Code fuer Attiny85
//Author Retian
//Version 2.1
#include <MyBMP180.h>
#include <MyHT16K33_7Seg.h>
MyBMP180 BMP(0x77);
MyHT16K33_7Seg Seg7(0x70);
float temp, druck, rDruck;
int hoehe = 460; //Meter ueber dem Meeresspiegel meines Wohnortes
void setup()
{
Seg7.init();
Seg7.sendBlank();
delay(1000);
if (BMP.isReady()) //Pruefe, ob der Sensor ansprechbar ist ...
{
Seg7.test7Seg();
BMP.init(BMP180_ULTRA_LOW_POWER); //Vorgabe je nach Aufloesung und Wandlungszeit
}
else while(1); //...sonst geht's hier nicht weiter
}void loop()
{
temp = BMP.readTemp();
druck = BMP.readPress(); //gemessener Luftdruck am Standort//gerechneter Luftdruck auf Meereshoehe bezogen
rDruck = BMP.readReducedPress(hoehe);
Seg7.sendFloatVal(temp);
delay(2000);
Seg7.sendFloatVal(druck);
delay(2000);
Seg7.sendFloatVal(rDruck);
delay(2000);
}