Skip to content

Instantly share code, notes, and snippets.

@haeshh
Last active Feb 4, 2021
Embed
What would you like to do?
Beispielcode zur Abfrage des BMP180-Luftdrucksensors (ESP32, Arduino)
/* BMP180 Luftdruck-Sensor abfragen
*
* siehe Beispielprogramm:
* github.com/adafruit/Adafruit_BMP085_Unified/blob/master/examples/sensorapi/sensorapi.pde
*
* 2020-12-13 Heiko (unsinnsbasis.de)
*/
#include <Wire.h> // Bibliothek für I2C einbinden
#include <Adafruit_Sensor.h> // Bibliotheken für den Sensor
#include <Adafruit_BMP085_U.h>
// Bitrate für die Datenübertragung zum seriellen Monitor
// (ESP: z.B. 115200, Arduino: zwingend 9600)
#define BITRATE 115200 // Arduino: 9600
// Für die exakte Berechnung der Höhe des Standorts über dem Meeres-
// spiegel wird der aktuelle Luftdruck auf Meereshöhe benötigt, wie
// ihn Wetterdienste liefern, z.B. Deutscher Wetterdienst (DWD)
// -> https://www.dwd.de/DE/leistungen/beobachtung/beobachtung.html
//
// Notfalls Standardwert verwenden: SENSORS_PRESSURE_SEALEVELHPA
// (1013,25 hPa; siehe <Adafruit_Sensor.h>; Standard-Druck auf Meereshöhe)
// #define PRESSURE_NULL SENSORS_PRESSURE_SEALEVELHPA
#define PRESSURE_NULL (1009.9F)
// Höhe des eigenen Standorts über Meereshöhe
#define LOCAL_ALTITUDE (10.0F)
// Sensor-Objekt anlegen (die Zahl "180" ist eine frei wählbare ID)
Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(180);
void setup() {
Serial.begin(BITRATE);
delay(500); // kurz warten, bis die ser. Schnittstelle bereit ist
Serial.println("---- Test BMP180 ----\n");
// Sensor initialisieren; ggf. Fehlermeldung ausgeben
if(!bmp.begin()) {
Serial.println("Sensor BMP180 nicht gefunden! Verkabelung ok?");
while(1); // leere Dauerschleife; Programm bleibt hier stehen
}
}
void loop() {
float tempC, // Temperatur in Grad Celsius
druck; // Luftdruck in Hekto-Pascal hPa
// Luftdruck und Temperatur ausgeben
// getPressure() liefert Pascal; für hPa durch 100 teilen
bmp.getPressure(&druck);
druck /= 100;
Serial.print("Luftdruck: ");
Serial.print(druck,1); // Ausgabe mit einer Nachkommastelle
Serial.println(" hPa");
bmp.getTemperature(&tempC);
Serial.print("Temperatur: ");
Serial.print(tempC,1);
Serial.println(" °C");
// aus dem gemessenen Druck und dem aktuellen Druck auf Meereshöhe
// die Höhe des Standorts berechnen
Serial.print("Höhe über Meer: ");
Serial.print(bmp.pressureToAltitude(PRESSURE_NULL, druck),1);
Serial.println(" m");
// mit der bekannten Höhe des Standorts den gemessenen Druck in
// Druck auf Meereshöhe umrechnen
Serial.print("Luftdruck (MH): ");
Serial.print(bmp.seaLevelForAltitude(LOCAL_ALTITUDE, druck),1);
Serial.println(" hPa\n");
delay(5000); // vor der nächsten Messung einige Sekunden warten
}
#define NUM_M 5 // Anzahl Messungen für Mittelwert
void loop(void) {
float tempC = 0.0, // Temperatur in Grad Celsius
druck = 0.0, // Luftdruck in Hekto-Pascal hPa
wert;
int i;
// Luftdruck und Temperatur ausgeben
// da die Werte leicht schwanken, mehrmals messen und mitteln
for (i=0; i<NUM_M; i++) {
bmp.getPressure(&wert);
druck += wert;
bmp.getTemperature(&wert);
tempC += wert;
if (i < NUM_M - 1) delay(500); // im letzten Schleifendurchlauf nicht mehr warten
}
tempC /= NUM_M;
// getPressure() liefert Pascal; für hPa zusätzlich durch 100 teilen
druck /= (NUM_M * 100);
Serial.print("Luftdruck: ");
Serial.print(druck,2);
Serial.println(" hPa");
Serial.print("Temperatur: ");
Serial.print(tempC,2);
Serial.println(" °C");
// aus dem gemessenen Druck und dem aktuellen Druck auf Meereshöhe
// die Höhe des Standorts berechnen
Serial.print("Höhe über Meer: ");
Serial.print(bmp.pressureToAltitude(PRESSURE_NULL, druck),1);
Serial.println(" m");
// mit der bekannten Höhe des Standorts den gemessenen Druck in
// Druck auf Meereshöhe umrechnen
Serial.print("Luftdruck (MH): ");
Serial.print(bmp.seaLevelForAltitude(LOCAL_ALTITUDE, druck),1);
Serial.println(" hPa\n");
delay(3000); // vor der nächsten Messung einige Sekunden warten
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment