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?

Wie können mit gnuplot Temperatur-Diagramm erstellt werden?

Habe mit dem Arduino und dem Temperatursensor DS18B20 mal zwei Stunden die Temperatur mit einem Java Programm gemessen.

Die erzeugte Logdatei hat folgenden Aufbau:
[Messzeitpunkt] [Gemessener Wert in Grad/Celsius]
Z.b.:

2013.06.22_17:56:18 29.25
2013.06.22_17:56:23 29.25
2013.06.22_17:56:29 29.25
# ...
2013.06.22_20:15:00 27.56
2013.06.22_20:15:06 27.56
2013.06.22_20:15:12 27.56

Folgende gnuplot Befehle sind nötig (guter Überblick zu gnuplot):

set title "Temperaturverlauf"
set ylabel "Temperatur in Grad/Celsius"
set xlabel "Messzeitpunkt"
set xdata time # x-Achse wird im Datums/Zeitformat skaliert
set timefmt "%Y.%m.%d_%H:%M:%S" # Format Zeitangaben yyyy.mm.dd_hh:mm:ss
set format x "%H:%M" # Format für die Achsenbeschriftung
set yrange [27:30] # die y-Achse geht von:bis
set terminal png
set output "temp-verlauf.png"
plot "log-temp.txt" using 1:2 title "Sensor DS18B20" with lines

Um folgendes Ergebnis zu erhalten. Der peek am Anfang, ist entstanden, weil ich den Sensor kurz angefasst haben.

Mit gnuplot erstellt Grafik zum Temperaturverlauf eines DS18B20
Mit gnuplot erstellt Grafik zum Temperaturverlauf eines DS18B20

Oder hier mit points anstatt lines:

Gnuplot Temperaturverlauf mit Messpunkte
Gnuplot Temperaturverlauf mit Messpunkte

Temperatur Messung mit dem DS18B20 und Arduino Nano

Habe heute einen One-Wire DS18B20 Temperatursensor erhalten und ihn mit dem Arduino Nano verbunden. Der Messbereich des Sensors beträgt von -55°C bis +125°C bei ± 0,5°C Genauigkeit.

Mit den OneWire 2.2 und Dallas Temperature Control Library 3.7.2 Bibliotheken ist die
Temperaturmessung schnell zusammengebaut.

Hier das Foto des Aufbaus mit Schaltplan:

Arduino Nano Temp. Messung via 1-Wire
Arduino Nano Temp. Messung via 1-Wire

Das Programm (8038 byte) gibt zuerst die eindeutige ID des Sensors aus, (28-A2-9D-8A-04-00-00-2B) und dann jede Sekunde den neuen Messwert:


/* 
TWTemp Version 1.0 vom 14.06.2013 

8038 bytes

Thomas Wenzlaff http://www.wenzlaff.de

Temperature Sensor DS18B20 an Digitalen Port Pin 2 wie folgt verbunden
Links=Masse, 
Mitte=Data, 
Rechts=+5V, 
3300 to 4700 Ohm Widerstand von +5V nach Data.

Es wird erst die Adresse des 1-Wire-Device ausgegeben und dann wird die Temperaturmessung gestartet.

*/

/* Benötigte Bibliotheken importieren */
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2 /* Digitalport Pin 2 definieren */

OneWire ourWire(ONE_WIRE_BUS); /* Ini oneWire instance */

DallasTemperature sensors(&ourWire);/* Dallas Temperature Library für Nutzung der oneWire Library vorbereiten */

void setup()
{
delay(1000);
Serial.begin(9600);
Serial.println("Temperatur Messprogramm");
Serial.println("TWTemp 1.0 vom 14.06.2013");
Serial.println("http://www.wenzlaff.de");
delay(1000);

sensors.begin();/* Inizialisieren der Dallas Temperature library */

adresseAusgeben(); /* Adresse der Devices ausgeben */

Serial.print("Starte Temperatur abfragen ...");
}

void loop()
{
Serial.println();

sensors.requestTemperatures(); // Temp abfragen

Serial.print(sensors.getTempCByIndex(0) );
Serial.print(" Grad Celsius");
}

void adresseAusgeben(void) {
  byte i;
  byte present = 0;
  byte data[12];
  byte addr[8];

  Serial.print("Suche 1-Wire-Devices...\n\r");// "\n\r" is NewLine
  while(ourWire.search(addr)) {
    Serial.print("\n\r\n\r1-Wire-Device gefunden mit Adresse:\n\r");
    for( i = 0; i < 8; i++) {
      Serial.print("0x");
      if (addr[i] < 16) {
        Serial.print('0');
      }
      Serial.print(addr[i], HEX);
      if (i < 7) {
        Serial.print(", ");
      }
    }
    if ( OneWire::crc8( addr, 7) != addr[7]) {
      Serial.print("CRC is not valid!\n\r");
      return;
    }
  }
  Serial.println();
  ourWire.reset_search();
  return;
}

Um die höchstmögliche Genauigkeit des Sensors auszulesen ist im Setup noch dieser Befehl nötig, damit dauert die Messung aber etwas länger: „Temperatur Messung mit dem DS18B20 und Arduino Nano“ weiterlesen