Was ist der BME280?
Ein digitaler Umweltsensor von Bosch, der Temperatur, rel. Luftfeuchte und Luftdruck misst.
Funktion: Sensor (digital), auslesbar über I²C oder SPI.
Typische Einsatzgebiete:
Wetterstationen, Raumklima, Höhenmessung (Barometer), Lüftungs-/HVAC-Steuerung, IoT-Geräte, Datenlogger.
2. Technische Grundlagen
Pinout (typisches Breakout-Board, I²C/SPI kombi):
- VCC: Versorgung (meist 3,3 V; viele Breakouts haben 3,3 V-Regler und Level-Shifter → dann 3,3–5 V möglich)
- GND
- SCL: I²C-Takt
- SDA: I²C-Daten
- CSB (oder CS): Chip Select (für SPI; bei I²C meist auf VCC)
- SDO: I²C-Adresswahl (0x76/0x77) oder SPI-MISO
- SDI/SCK: (für SPI) – je nach Board-Beschriftung
Kommunikation:
- I²C (Standard, schnell & simpel) – Adresse 0x76 oder 0x77 (per SDO/Adress-Jumper wählbar)
- SPI (falls viele I²C-Geräte oder höhere Samplingraten nötig)
Spannungspegel:
- ⚠️ Der BME280-Chip arbeitet nur mit 3,3 V!
- Breakouts: oft mit LDO & Level-Shiftern ⇒ VCC 3,3–5 V möglich, I²C-Pegel 5 V-tolerant.
- Arduino UNO/Nano (5 V): nimm ein 5 V-kompatibles Breakout.
- ESP8266/ESP32 (3,3 V): direkt 3,3 V.
Besonderheiten:
- Kalibrierung: Werkskalibriert; Bibliotheken nutzen interne Kalibrierdaten – kein manueller Abgleich nötig.
- Adresskonfiguration: SDO = GND → 0x76, SDO = VCC → 0x77 (häufig per Lötjumper).
- Pull-ups: I²C braucht Pull-ups auf SDA/SCL (oft auf dem Breakout vorhanden). Bei ESP-Boards keine zusätzlichen nötig, wenn auf dem Modul verbaut.
- Verwechslung: Achte auf echte BME280 (mit Luftfeuchtigkeitsmessung!) vs. BMP280 (ohne Luftfeuchtigkeitsmessung).
3. Anschluss an Arduino / ESP
I²C (empfohlen)
Arduino UNO/Nano (ATmega328P)

BME280 | Arduino |
---|---|
VCC | 5 V* (nur bei 5 V-festem Breakout; sonst 3,3 V) |
GND | GND |
SCL | A5 |
SDA | A4 |
SDO | (frei) auf GND = 0x76 / VCC = 0x77 |
CSB | VCC (für I²C) |
* Wenn dein Board KEIN 5 V-tolerantes Breakout ist → alles strikt 3,3 V!
ESP8266 (NodeMCU)

BME280 | ESP8266 |
---|---|
VCC | 3V3 |
GND | GND |
SCL | D1 (GPIO5) |
SDA | D2 (GPIO4) |
SDO | GND=0x76 / 3V3=0x77 |
CSB | 3V3 |

ESP32
BME280 | ESP32 (Standard-Pins) |
---|---|
VCC | 3V3 |
GND | GND |
SCL | GPIO22 |
SDA | GPIO21 |
SDO | GND=0x76 / 3V3=0x77 |
CSB | 3V3 |
SPI (optional – wenn gebraucht)
- Arduino UNO: SCK=13, MISO=12, MOSI=11, wähle einen freien CS (z. B. 10)
- ESP8266 (HSPI): SCK=14, MISO=12, MOSI=13, CS=beliebig
- ESP32: frei wählbar, aber nutze am besten VSPI (SCK=18, MISO=19, MOSI=23, CS=5)
Aufbauhinweise:
- Breadboard: kurze Leitungen, saubere Masseführung.
- Versorgung: stabile 3,3 V (ESP) bzw. 5 V nur, wenn Breakout das zulässt.
- Stolperfallen: falsche Adresse (0x76/0x77), „falscher“ BME (eigentlich BMP280), fehlende GND-Verbindung, doppelte Pull-ups auf I²C sehr groß/klein dimensioniert, UNO + 3,3 V-only-Board ohne Levelshifter.
4. Software & Code
Bibliotheken (Arduino IDE → Bibliotheksverwalter):
- Adafruit BME280 Library (benötigt Adafruit Unified Sensor)
- Alternativ: SparkFun BME280, Bosch BME280 Driver (etwas „näher am Metall“)
Minimalbeispiel (I²C) – „Hello World“
Funktioniert auf UNO/Nano, ESP8266, ESP32. Passe ggf. die I²C-Adresse (0x76/0x77) an.
#include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> Adafruit_BME280 bme; // I2C // Falls nötig, Adresse explizit setzen: bme.begin(0x76) oder (0x77) void setup() { Serial.begin(115200); // für UNO evtl. 9600 delay(1000); Serial.println(F("BME280 Test")); bool status = bme.begin(0x76); // probier 0x76, sonst 0x77 if (!status) { Serial.println(F("BME280 nicht gefunden. Adresse prüfen (0x76/0x77), Verdrahtung checken!")); while (1) delay(10); } } void loop() { float tempC = bme.readTemperature(); // °C float hum = bme.readHumidity(); // % float pres = bme.readPressure() / 100.0; // hPa Serial.print(F("T=")); Serial.print(tempC, 2); Serial.print(F(" °C ")); Serial.print(F("RH=")); Serial.print(hum, 1); Serial.print(F(" % ")); Serial.print(F("p=")); Serial.print(pres, 1); Serial.println(F(" hPa")); delay(2000); }
Code-Erklärung (blockweise):
Adafruit_BME280 bme;
wählt I²C-Modus.bme.begin(addr)
initialisiert Sensor mit I²C-Adresse.readTemperature/Humidity/Pressure
gibt Messwerte zurück (Druck in Pa → durch 100 zu hPa).
Fehlerquellen & Debugging:
- Kein Sensor gefunden → Adresse tauschen (0x76 ↔ 0x77), Verkabelung, Stromversorgung prüfen.
- I²C-Scan-Sketch nutzen, um die Adresse zu ermitteln.
- ESP-Stromversorgung: USB-Port evtl. grenzwertig; notfalls extern versorgen.
- Kein Feuchtewert: Checke, ob’s wirklich BME280 ist (nicht BMP280).
5. Praxisbeispiele
A) Einfache Anwendung: serieller Output (oben gezeigt)
- Ergänze ggf. Mittelwertbildung oder Oversampling (Adafruit-API:
setSampling(...)
) für stabilere Messungen.
B) Erweiterte Anwendung: MQTT-Publish (ESP8266/ESP32)
Beispiel mit PubSubClient, WLAN & MQTT-Broker (z. B. Mosquitto). Ersetzt
WIFI_SSID
,WIFI_PASS
,MQTT_HOST
.
#include <Wire.h> #include <WiFi.h> // ESP32; für ESP8266: <ESP8266WiFi.h> #include <PubSubClient.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> Adafruit_BME280 bme; WiFiClient espClient; PubSubClient mqtt(espClient); const char* WIFI_SSID = "YOUR_SSID"; const char* WIFI_PASS = "YOUR_PASS"; const char* MQTT_HOST = "192.168.1.10"; // Broker-IP const int MQTT_PORT = 1883; void setup() { Serial.begin(115200); delay(500); WiFi.begin(WIFI_SSID, WIFI_PASS); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWiFi connected"); mqtt.setServer(MQTT_HOST, MQTT_PORT); if (!bme.begin(0x76)) { Serial.println("BME280 not found!"); while(1){} } } void loop() { if (!mqtt.connected()) { while (!mqtt.connected()) { if (mqtt.connect("bme280-client")) break; delay(1000); } } mqtt.loop(); float t = bme.readTemperature(); float h = bme.readHumidity(); float p = bme.readPressure() / 100.0; char payload[128]; snprintf(payload, sizeof(payload), "{\"temp\":%.2f,\"hum\":%.2f,\"pres\":%.2f}", t, h, p); mqtt.publish("sensors/room1/bme280", payload); Serial.println(payload); delay(5000); }
Grafana/Influx/Telegraf-Hinweis:
MQTT → Telegraf (input.mqtt_consumer) → InfluxDB → Grafana Dashboard. Topics sauber strukturieren (z. B. home/room1/env
).
C) Anzeige auf OLED (SSD1306, I²C)
- Bibliotheken: Adafruit SSD1306, Adafruit GFX
- SDA/SCL parallel klemmen, Adresse meist 0x3C.
- Messwerte alle 1–2 s aktualisieren (Flackern vermeiden).
D) Aktor-Steuerung (Relais/Lüfter)
- Beispiel: Bei RH > 60 % Lüfter ON, sonst OFF.
- Relais-Modul unbedingt mit Freilaufdiode (bei Spule) bzw. fertiges Modul mit Optokoppler nutzen.
- ESP/Arduino-Pin → Relais-Eingang (logikkompatibel prüfen).
6. Tipps & Tricks
Energieverbrauch (ESP):
- Deep Sleep nutzen (ESP8266: D0 (GPIO16) mit RST brücken; ESP32: EXT0/EXT1 Wake).
- Messzyklus: aufwachen → messen → MQTT publish → schlafen. Batterie hält deutlich länger.
Genauigkeit & Vergleich:
- BME280 ist i. d. R. genauer/stabiler als DHT22, v. a. bei Druck.
- Feuchtewerte können je nach Umgebung (Luftbewegung, Gehäuse) leicht abweichen. Nutze ggf. Oversampling & IIR-Filter (API vorhanden).
Langzeitstabilität:
- Sensor altert langsam; keine direkte Feuchte-Kondensation zulassen.
- Schutz: Membran/Filterkappe, Spritzwasserschutz, Kondenswasser vermeiden.
- Für Outdoor: strahlungs-/regen-geschütztes Gehäuse (z. B. Stevenson Screen).
Gehäuse & Praxis:
- Thermische Kopplung beachten: nicht direkt über Spannungsreglern/MOSFETs montieren (Eigenwärme verfälscht Messung).
- Kabellängen: I²C eher kurz halten oder Pull-ups anpassen; bei längeren Wegen ggf. I²C-Extender/SPI.
7. Weiterführende Ressourcen
Datenblätter / Offizielle Quellen:
- Bosch BME280 Datasheet
Bibliotheken (Arduino IDE – Namen im Bibliotheksverwalter suchen):
- Adafruit BME280 Library (+ Adafruit Unified Sensor)
- SparkFun BME280
- PubSubClient (MQTT)
- Adafruit SSD1306 & Adafruit GFX (für OLED)
GitHub (Beispielcode & Issues):
- adafruit/Adafruit_BME280_Library
- sparkfun/SparkFun_BME280_Arduino_Library
- knolleary/pubsubclient
- adafruit/Adafruit_SSD1306
Ähnliche Module / Alternativen:
- BMP280 (ohne Feuchte), BME680 (zusätzlich Luftgüte/VOC), SHT31/35 (Temp/Feuchte sehr präzise, kein Druck), LPS22HB/HP (Druck).
Bonus: Oversampling & IIR (Adafruit)
// Nach bme.begin(): bme.setSampling( Adafruit_BME280::MODE_NORMAL, Adafruit_BME280::SAMPLING_X2, // Temp Adafruit_BME280::SAMPLING_X16, // Feuchte Adafruit_BME280::SAMPLING_X16, // Druck Adafruit_BME280::FILTER_X16, Adafruit_BME280::STANDBY_MS_500 );
→ Glattere Messwerte, weniger Rauschen (geringfügig mehr Energie).
Wenn dir das Projekt gefallen hat und du von weiteren interessanten Projekten inspiriert werden willst, sieh dir doch mal mein neues E-Book »Arduino Projekte Volume 1« an!
- Die beliebtesten Arduino-Projekte von StartHardware
- Inklusive Schaltplan, Beschreibung und Code
- Arduino-Schnellstart-Kapitel
- Kompakter Programmierkurs