QG-ITG

Das alte QG-Wiki

Benutzer-Werkzeuge

Webseiten-Werkzeuge


nwt:arduino:bauteile:bmp180:start

BMP-180 Luftdrucksensor

Technische Daten

  • Spannung 1,8 V bis 3,6V
  • Leistungsaufnahme 0,5µA bei 1Hz
  • Genauigkeit 0.02hPa
  • Messbereich 300hPa bis 1100hPa
  • Entspricht einer Höhe bzw Tiefe von +9000m bis – 500m.

Bibliotheken

Anschließen des Sensors

Achtung: Der BPM180 muss mit 3.3V betrieben werden, nicht mit 5V. Bei zu großer Spannung kann er Schaden nehmen!

Beispielsketch

#include <SFE_BMP180.h>
#include <Wire.h>
 
// Wir erzeugen ein SFE_BMP180 "Objekt", hier nennen wir es "pressure".
// Über dieses "Objekt" können wir auf "Methoden" der Bibliothek
// zugreifen, um z.B. den Luftdruck auszulesen
SFE_BMP180 pressure;
 
void setup()
{
  Serial.begin(9600);
  Serial.println("REBOOT");
 
  // Um den Sensor später nutzen zu können muss man in "initialisieren". 
  // das passiert mit der Methode "begin":
  // "pressure.begin()" ruft die Methode "begin" des oben 
  // erzeugten Objekts "presure" auf. Wir machen nur weiter, 
  // wenn das klappt.
 
  if (pressure.begin())
    Serial.println("BMP180 init success");
  else
  {
    // der Sensor konnte nicht initialisiert werden
    // Überprüfe die Anschlüsse...
    Serial.println("BMP180 init fail\n\n");
    while(1); // Hier bleiben, nicht weitermachen.
  }
}
 
void loop() {
 
  char status;
  double P=0;     // Druck
  double T=20.0;  // Temperatur in Grad Celsius
 
  // Starte eine Druckmessung:
  // Der Parameter gibt das "Oversampling" an, von 0 bis 3.
  // Wenn die Anfrage erfolgreich ist, wird die Wartezeit in ms zzurückgegeben.
  // Bei einem Fehler ist der Rückgabewert 0
 
  status = pressure.startPressure(3);
  if (status != 0) {
        // Wait for the measurement to complete:
        delay(status);
 
        // Der Druck hängt von der Temperatur ab, 
        // daher benötigt die Methode 
        // getPressure zwei Parameter:
        // Den Druck "P" und die Temperatur "T".
        status = pressure.getPressure(P,T);
 
        if (status != 0) {
          // Messung ausgeben:
          Serial.print("Absoluter Druck am Sensor bei ");
          Serial.print(T,2);
          Serial.print(" Grad Celsius:");
          Serial.print(P,2);
          Serial.println(" mbar");
        }
        else {
          Serial.println("error retrieving pressure measurement\n");
        }
  }
  else {
      Serial.println("error starting pressure measurement\n");
  }
 
  delay(5000);  // Pause for 5 seconds.
}

Basisaufgabe

  • Schließe den Sensor an
  • Übertrage den Sketch auf den Arduino
  • Beobachte auf dem seriellen Monitor (MenüWerkzeugeSerieller Monitor), ob der Sensor richtig angeschlossen ist und Werte liefert.
  • Verändere den Wert der Temperaturvariablen T im Sketch und beobachte die Auswirkungen bei der Messung.

Etwas Theorie: Wetter, Luftdruck und Höhe

Der BMP180 kann den aktuellen, absoluten Luftdruck messen. Wir haben jedoch gesehen, dass der gemessene Wert davon abhängt, welchen Temperaturwert wir dem Sensor bei der Messung mitgeben. Um zu verstehen, was da passiert, benötigen wir ein paar Begriffe. Bearbeite zum besseren Verständnis diesen Text.

Vollständige Druckmessung

Um den Luftdruck mit dem BMP 180 korrekt zu messen, muss man zwei Schritte ausführen:

  1. Messung der Temperatur
  2. Messung des Luftdrucks unter Verwendung der gerade gemessenen Temperatur

Man benötigt hierzu keinen gesonderten Temperatursensor, da der BMP 180 einen Temperatursensor eingebaut hat.

Prinzipieller Ablauf

Sketch

Im Flussdiagramm oben fehlen die Fehlerbehandlungen: Im Prinzip geben alle Methoden, die von der Bibliothek zur Messung von Temperatur und Druck zur Verfügung gestellt werden einen Statuswert zurück. Wenn dieser Rückgabewert 0 ist, bedeutet das, dass ein Fehler bei der Ausführung der Methode aufgetreten ist. der Sketch fragt darum bei jeder Aktion, ob der Rückgabewert ungleich 0 ist und gibt im Fehlerfall eine Meldung aus.

#include <SFE_BMP180.h>
#include <Wire.h>
 
// You will need to create an SFE_BMP180 object, here called "pressure":
 
SFE_BMP180 pressure;
 
#define ALTITUDE 1655.0 // Altitude of SparkFun's HQ in Boulder, CO. in meters
 
void setup()
{
  Serial.begin(9600);
  Serial.println("REBOOT");
 
  // Initialize the sensor (it is important to get calibration values stored on the device).
 
  if (pressure.begin())
    Serial.println("BMP180 init success");
  else
  {
    // Oops, something went wrong, this is usually a connection problem,
    // see the comments at the top of this sketch for the proper connections.
 
    Serial.println("BMP180 init fail\n\n");
    while(1); // Pause forever.
  }
}
 
void loop()
{
  char status;
  double T,P,p0,a;
 
  // Loop here getting pressure readings every 10 seconds.
 
  // If you want sea-level-compensated pressure, as used in weather reports,
  // you will need to know the altitude at which your measurements are taken.
  // We're using a constant called ALTITUDE in this sketch:
 
  Serial.println();
  Serial.print("provided altitude: ");
  Serial.print(ALTITUDE,0);
  Serial.print(" meters, ");
  Serial.print(ALTITUDE*3.28084,0);
  Serial.println(" feet");
 
 
  // Zuerst muss die Temperatur gemessen werden:
 
  // Starte eine Temperaturmessung
  // Wenn die Anfrage erfolgreich ist, wird die Zeit in ms zurückgegeben, die man für die 
  // Messung veranschlagen muss
  // wenn der Sensor nichts liefert, wird 0 zurückgegeben.
 
  status = pressure.startTemperature();
 
  // wenn die Messung erfolgreich ist, also status nicht 0...
  if (status != 0)
  {
    // Abwarten, bis die Messung ausgeführt wurde
    delay(status);
 
    // Messwert holen
    status = pressure.getTemperature(T);
    if (status != 0)
    {
      // Print out the measurement:
      Serial.print("temperature: ");
      Serial.print(T,2);
      Serial.print(" deg C, ");
      Serial.print((9.0/5.0)*T+32.0,2);
      Serial.println(" deg F");
 
      // Nun kann man wie im Basissketch den Luftdruck bestimmen, wobei man die eben gemessene 
      // Temperatur verwendet:
      status = pressure.startPressure(3);
      if (status != 0)
      {
        // Wait for the measurement to complete:
        delay(status);
 
        // T wurde oben ermittelt!
        status = pressure.getPressure(P,T);
        if (status != 0)
        {
          // Print out the measurement:
          Serial.print("absolute pressure: ");
          Serial.print(P,2);
          Serial.print(" mb, ");
          Serial.print(P*0.0295333727,2);
          Serial.println(" inHg");
 
          // The pressure sensor returns abolute pressure, which varies with altitude.
          // To remove the effects of altitude, use the sealevel function and your current altitude.
          // This number is commonly used in weather reports.
          // Parameters: P = absolute pressure in mb, ALTITUDE = current altitude in m.
          // Result: p0 = sea-level compensated pressure in mb
 
          p0 = pressure.sealevel(P,ALTITUDE); // we're at 1655 meters (Boulder, CO)
          Serial.print("relative (sea-level) pressure: ");
          Serial.print(p0,2);
          Serial.print(" mb, ");
          Serial.print(p0*0.0295333727,2);
          Serial.println(" inHg");
 
          // On the other hand, if you want to determine your altitude from the pressure reading,
          // use the altitude function along with a baseline pressure (sea-level or other).
          // Parameters: P = absolute pressure in mb, p0 = baseline pressure in mb.
          // Result: a = altitude in m.
 
          a = pressure.altitude(P,p0);
          Serial.print("computed altitude: ");
          Serial.print(a,0);
          Serial.print(" meters, ");
          Serial.print(a*3.28084,0);
          Serial.println(" feet");
        }
        else Serial.println("error retrieving pressure measurement\n");
      }
      else Serial.println("error starting pressure measurement\n");
    }
    else Serial.println("error retrieving temperature measurement\n");
  }
  else Serial.println("error starting temperature measurement\n");
 
  delay(5000);  // Pause for 5 seconds.
}
nwt/arduino/bauteile/bmp180/start.txt · Zuletzt geändert: 07.06.2019 08:33 von sbel