Luftdrucksensor BMP085 von Bosch inkl. Temperatursenor für den Arduino

Der BMP085 ist ein Drucksensor mit hoher Präzision und ultra-niedrigem Stromverbrauch für den I2C-Bus.

Technische Daten:

  • Druckbereich: 300 – 1100 hPa (9000 Meter über dem Meeresspiegel bis -500 m)
  • Versorgungsspannung: 1.8V – 3.6 V (VDDA). 1.62V – 3.6 V (VDDD)
  • LCC8 Paket: bleifreie keramische Carrier Package (LCC)
  • Geringe Leistungsaufnahme: 5 μA im Standard-Modus
  • Hohe Präzision: Low-Power-Modus, die Auflösung von 0.06 hPa (0,5 m)
  • Hohe linearen Modus mit einer Auflösung von 0.03 hPa (0,25 m)
  • Mit Temperatur-Ausgang
  • I2C-Schnittstelle
  • Temperaturkompensation
  • Reaktionszeit: 7,5 ms
  • Standby-Strom: 0.1 μA
  • Beseitigt die Notwendigkeit für einen externen Taktgeber
  • Größe: 21 x 15 x 10 mm

Die Platine mit dem BMP085 (auf GY-65) ist nur 1,5 cm x 2 cm klein.
Von oben:

Luftdrucksensor von vorne
Luftdrucksensor von vorne

Von unten:

Luftdrucksensor für Arduino
Luftdrucksensor für Arduino

Anschlussbelegung:

BMP085 Luftdrucksensor
BMP085 Luftdrucksensor

Software:
Folgende beiden Libs von Adafruit downloaden und in das Lib Verheichnis kopieren. Evl. noch die Verzeichnisnamen umbenennen, da keine Sonderzeichen vorhanden sein dürfen.

1. Adafruit Unified Basis Sensor Driver

2. Adafruit Unified Drucksensor BMP085 Driver

Diesen Sketch TWDruck hochladen:


#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP085.h>

/* 
TWDruck Version 1.0 vom 06.07.2013

Thomas Wenzlaff http://www.wenzlaff.de

Programm Größe: 12296 Bytes

Dies Programm liest den Luftdrucksensor und den Temperatursensor endlos aus,
und gibt die Werte über die Serielle-Schnittstelle mit Leerzeichen getrennt aus.
Kommentare beginnen mit #.

z.B.
# Luftdruck und Temperatur Messprogramm
# TWDruck 1.0 vom 06.07.2013
# http://www.wenzlaff.de
# Sensor: BMP085
# Treiber Version: 1
# Unique ID: 10085

# [Luftdruck in hPa] [Temperatur in Grad Celsius] [Höhe in Meter] 

1022.59 26.84 -80.49
1022.73 26.84 -81.69
1022.63 26.85 -80.83
1022.51 26.85 -79.80
...

Anschluss an den Nanu Arduino:

Das BMP085 an:
    SCL   an A5
    SDA   an A4
    VDD   Plus 3.3V DC
    Masse Minus
    
*/
const long MESSINTERVAL = 5000; // Messintervall in milli Sekunden
const long SENSOR_ID = 10085; // eindeutige Sensor ID
String KOMMENTAR = "# "; // Kommentar präfix
String TRENNER = " "; // Trennzeichen der Werte

Adafruit_BMP085 bmp = Adafruit_BMP085(SENSOR_ID);

void anzeigeDetails(void)
{
  sensor_t sensor;
  bmp.getSensor(&sensor);
   
  Serial.println(KOMMENTAR +"Luftdruck und Temperatur Messprogramm");
  Serial.println(KOMMENTAR +"TWDruck 1.0 vom 06.07.2013");
  Serial.println(KOMMENTAR +"http://www.wenzlaff.de");
  Serial.print (KOMMENTAR + "Sensor: "); Serial.println(sensor.name);
  Serial.print (KOMMENTAR + "Treiber Version: "); Serial.println(sensor.version);
  Serial.print (KOMMENTAR + "Unique ID: "); Serial.println(sensor.sensor_id);
  delay(500);
}

void setup(void)
{
  Serial.begin(9600);
  
  if(!bmp.begin())
  {
    Serial.print(KOMMENTAR + "Kein BMP085 gefunden ... Prüfe I2C Adresse!");
    while(1);
  }
  
  anzeigeDetails();
}

void loop(void)
{
  sensors_event_t event; // neues Sensor ereignis
  bmp.getEvent(&event);
 
  if (event.pressure)
  {
    Serial.print(event.pressure); // Luftdruck in hPa
    Serial.print(TRENNER);
    
    /* Calculating altitude with reasonable accuracy requires pressure *
     * sea level pressure for your position at the moment the data is     *
     * converted, as well as the ambient temperature in degress           *
     * celcius.  If you don't have these values, a 'generic' value of     *
     * 1013.25 hPa can be used (defined as SENSORS_PRESSURE_SEALEVELHPA   *
     * in sensors.h), but this isn't ideal and will give variable         *
     * results from one day to the next.                                  *
     *                                                                    *
     * You can usually find the current SLP value by looking at weather   *
     * websites or from environmental information centers near any major  *
     * airport.                                                           *
     *                                                                    *
     * For example, for Paris, France you can check the current mean      *
     * pressure and sea level at: http://bit.ly/16Au8ol                   */
     

    float temperature;
    bmp.getTemperature(&temperature);

    Serial.print(temperature); // Temperatur in Grad Celsius
    Serial.print(TRENNER);

    /* Then convert the atmospheric pressure, SLP and temp to altitude */
    /* Update this next line with the current SLP for better results */
    float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA; // 1013.25F Average sea level pressure is 1013.25 hPa
   
    Serial.print(bmp.pressureToAltitude(seaLevelPressure,
                                        event.pressure,
                                        temperature)); // Höhe in Meter
    Serial.println();
  }
  else
  {
    Serial.println(KOMMENTAR +"Sensor error");
  }
  delay(MESSINTERVAL);
}

Mit diesen Daten, wird dieses Diagramm erzeugt:

Luftdruck und Temperatur Diagramm mit  gnuplot
Luftdruck und Temperatur Diagramm mit gnuplot

Die gerade Linie im Diagramm, rührt daher das der PC sich automatisch in den Standby-Betrieb schaltet und damit die Serielle-Verbindung nicht mehr abgefragt wird.
Der dritte Wert der Daten ist die Höhe, die ändert sich nicht gross und wird deshalb nicht im Diagramm dargestellt. Wie wird bei gnuplot die 3. Y-Achse erzeugt? Geht das überhaupt?