Präzise Temperatur-, Druck- und Höhenmessung mit BMP280 und Arduino UNO
Komponenten und Materialien
| Komponente | Anzahl |
|---|---|
| Arduino UNO | 1 |
| Adafruit BMP280 Sensor | 1 |
| Adafruit OLED 128x32 I2C Display | 1 |
Projektübersicht
In diesem Tutorial zeigen wir, wie Sie mit dem BMP280-Sensor Temperatur, Luftdruck und Höhe messen können – unterstützt von einem Arduino UNO und einem OLED-Display. Der BMP280 ist ein hochpräziser Barometer-Sensor mit folgenden Schlüsselspezifikationen laut Datenblatt:
- Druckmessbereich: 300–1100 hPa
- Temperaturbereich: -40 bis +85 °C
- Auflösung: 0,01 hPa (Druck), 0,01 °C (Temperatur)
- I2C- und SPI-Schnittstelle
- Versorgungsspannung: 1,71–3,6 V
Das Projekt deckt sowohl metrische als auch imperiale Einheiten ab. Die Umrechnung erfolgt direkt im Code. Im Folgenden finden Sie die Verdrahtung, den Programmcode und Tipps zur Fehlerbehebung.
Verdrahtung (Schaltplan)
Beide Module nutzen die I2C-Schnittstelle:
- BMP280: SDA → A4, SCL → A5, VCC → 5 V, GND → GND
- OLED-Display: SDA → A4, SCL → A5, VCC → 3,3 V, GND → GND
Hinweis: Der BMP280 wird mit 5 V betrieben (auf dem Modul befindet sich ein Spannungsregler), das OLED-Display benötigt 3,3 V.
Test und Fehlerbehebung
Nach dem Verdrahten empfiehlt es sich, zunächst das Bibliotheks-Beispiel BMP280test auszuführen. Wird der Sensor nicht erkannt (Fehlermeldung „Could not find a valid BMP280 sensor“), liegt oft eine abweichende I2C-Adresse vor.
I2C-Adresse ermitteln
- Trennen Sie alle anderen I2C-Geräte (z. B. OLED).
- Laden Sie einen I2C-Scanner-Sketch auf den Arduino.
- Öffnen Sie den Seriellen Monitor (9600 Baud). Der Scanner zeigt die gefundene Adresse an (typischerweise
0x76oder0x77).
Bibliothek anpassen
Die Adafruit-BMP280-Bibliothek ist standardmäßig auf Adresse 0x77 eingestellt. Falls Ihr Modul 0x76 verwendet, müssen Sie die Datei Adafruit_BMP280.cpp im Bibliotheksordner (Dokumente/Arduino/libraries/Adafruit_BMP280_Library) anpassen:
// Zeile ~41 ändern:
_i2caddr = 0x76; // statt 0x77
Speichern Sie die Datei, starten Sie die Arduino-IDE neu und führen Sie den Test erneut aus.
Programmcode
Vier Sketches stehen zur Verfügung – jeweils für serielle Ausgabe oder OLED-Display, in metrischen oder imperialen Einheiten.
1. Serielle Ausgabe – Metrisch (°C, hPa, m)
/* BMP280 Serielle Ausgabe (Metrisch)
* Misst Temperatur, Druck und Höhe
* Angepasstes Adafruit-Beispiel
*/
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp; // I2C-Schnittstelle
void setup() {
Serial.begin(9600);
Serial.println(F("BMP280 Test"));
if (!bmp.begin()) {
Serial.println(F("Kein gültiger BMP280 Sensor gefunden, Verdrahtung prüfen!"));
while (1);
}
// Standard-Einstellungen laut Datenblatt
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2, // Temp. Oversampling
Adafruit_BMP280::SAMPLING_X16, // Druck Oversampling
Adafruit_BMP280::FILTER_X16, // Filterung
Adafruit_BMP280::STANDBY_MS_500); // Standby-Zeit
}
void loop() {
Serial.print(F("Temperatur = "));
Serial.print(bmp.readTemperature());
Serial.println(" °C");
Serial.print(F("Druck = "));
Serial.print(bmp.readPressure() / 100.0); // Umrechnung in hPa
Serial.println(" hPa");
Serial.print(F("Ca. Höhe = "));
Serial.print(bmp.readAltitude(1019.66)); // Meeresspiegeldruck in hPa anpassen!
Serial.println(" m");
Serial.println();
delay(2000);
}
2. Serielle Ausgabe – Imperial (°F, inHg, ft)
/* BMP280 Serielle Ausgabe (Imperial) */
#include <Adafruit_BMP280.h>
Adafruit_BMP280 bmp;
void setup() {
Serial.begin(9600);
Serial.println(F("BMP280 Test"));
if (!bmp.begin()) {
Serial.println(F("Kein gültiger BMP280 Sensor gefunden!"));
while (1);
}
bmp.setSampling(Adafruit_BMP280::MODE_NORMAL,
Adafruit_BMP280::SAMPLING_X2,
Adafruit_BMP280::SAMPLING_X16,
Adafruit_BMP280::FILTER_X16,
Adafruit_BMP280::STANDBY_MS_500);
}
void loop() {
float tempF = bmp.readTemperature() * 9.0 / 5.0 + 32.0;
float pressureInHg = bmp.readPressure() / 3386.39;
float altitudeFt = bmp.readAltitude(1019.66) * 3.28084;
Serial.print(F("Temperatur = "));
Serial.print(tempF);
Serial.println(" °F");
Serial.print(F("Druck = "));
Serial.print(pressureInHg);
Serial.println(" inHg");
Serial.print(F("Ca. Höhe = "));
Serial.print(altitudeFt);
Serial.println(" ft");
Serial.println();
delay(2000);
}
3. OLED-Display – Metrisch
/* BMP280 + OLED 128x32 (Metrisch) */
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP280.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_BMP280 bmp;
void setup() {
bmp.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.print("BMP280 Monitor");
display.setCursor(32, 12);
display.setTextSize(2);
display.println("Ready");
display.display();
delay(2000);
}
void loop() {
display.clearDisplay();
float T = bmp.readTemperature();
float P = bmp.readPressure() / 100.0;
float A = bmp.readAltitude(1019.66); // Meeresspiegeldruck anpassen!
display.setCursor(0, 0);
display.setTextSize(2);
display.print("Temp");
display.setCursor(0, 18);
display.print(T, 1);
display.setCursor(50, 17);
display.setTextSize(1);
display.print("C");
display.setCursor(65, 0);
display.setTextSize(1);
display.print("Druck");
display.setCursor(65, 10);
display.print(P, 0);
display.setCursor(110, 10);
display.print("hPa");
display.setCursor(65, 25);
display.print("Hoehe");
display.setCursor(90, 25);
display.print(A, 0);
display.setCursor(110, 25);
display.print("m");
display.display();
delay(2000);
}
4. OLED-Display – Imperial
/* BMP280 + OLED 128x32 (Imperial) */
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <Adafruit_BMP280.h>
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
Adafruit_BMP280 bmp;
void setup() {
bmp.begin();
display.begin(SSD1306_SWITCHCAPVCC, 0x3C);
display.clearDisplay();
display.setTextColor(WHITE);
display.setTextSize(1);
display.print("BMP280 Monitor");
display.setCursor(32, 12);
display.setTextSize(2);
display.println("Ready");
display.display();
delay(2000);
}
void loop() {
display.clearDisplay();
float T = bmp.readTemperature() * 9.0 / 5.0 + 32.0;
float P = bmp.readPressure() / 3386.39;
float A = bmp.readAltitude(1019.66) * 3.28084;
display.setCursor(0, 0);
display.setTextSize(2);
display.print("Temp");
display.setCursor(0, 18);
display.print(T, 1);
display.setCursor(50, 17);
display.setTextSize(1);
display.print("F");
display.setCursor(65, 0);
display.setTextSize(1);
display.print("Druck");
display.setCursor(65, 10);
display.print(P, 2);
display.setCursor(100, 10);
display.print("inHg");
display.setCursor(65, 25);
display.print("Hoehe");
display.setCursor(90, 25);
display.print(A, 0);
display.setCursor(110, 25);
display.print("ft");
display.display();
delay(2000);
}
Wichtige Hinweise
- Meeresspiegeldruck: Der Wert
1019.66inreadAltitude()muss dem aktuellen Luftdruck auf Meereshöhe Ihres Standorts entsprechen. Passen Sie ihn an, bis die angezeigte Höhe stimmt. - I2C-Adresse: Prüfen Sie vor dem ersten Einsatz die Adresse mit dem Scanner.
- Bibliotheken: Installieren Sie über den Bibliotheksverwalter:
Adafruit BMP280 Library,Adafruit GFX Library,Adafruit SSD1306.
Weiterführende Links
Herstellungsprozess
- Integriertes QR-, RFID- und Temperatur-Verifikations-Zugangskontrollsystem
- Mehrere DS18B20 1-Wire Sensoren an Raspberry Pi anschließen für präzises Temperaturmonitoring
- Fern-Temperatursensor mit Raspberry Pi & Python bauen – Schritt-für-Schritt-Anleitung
- Nahtlose Temperatur- & Feuchtigkeitsüberwachung am Raspberry Pi mit EzTemp
- DIY Heimbrau-Temperaturregelung: Überwachen & Steuern mit Arduino
- Raspberry Pi BMP085: Präzise Temperatur- & Druckmessung via I2C
- Präzise Thermoelement-Messung & Logging für Labor & Wissenschaftsexperimente
- Multi-Sensor Temperatur- & Licht-Überwachung mit Raspberry Pi & DS18B20
- Präzise Druck- & Luftstrommessung mit analogem Sensor und Arduino
- Arduino Temperatur- & Feuchtelogger mit DHT11 & Ethernet Shield