BME280 für Arduino, ESP32 und ESP8266

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.


Sieh dir jetzt meinen neuen Arduino-Videokurs an: Jetzt ansehen!


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)

Arduino BME280 Schaltplan
BME280Arduino
VCC5 V* (nur bei 5 V-festem Breakout; sonst 3,3 V)
GNDGND
SCLA5
SDAA4
SDO(frei) auf GND = 0x76 / VCC = 0x77
CSBVCC (für I²C)

* Wenn dein Board KEIN 5 V-tolerantes Breakout ist → alles strikt 3,3 V!

ESP8266 (NodeMCU)

ESP8266 NodeMCU BME280 Schaltplan
BME280ESP8266
VCC3V3
GNDGND
SCLD1 (GPIO5)
SDAD2 (GPIO4)
SDOGND=0x76 / 3V3=0x77
CSB3V3
D1Mini BME280 Schaltplan

ESP32

BME280ESP32 (Standard-Pins)
VCC3V3
GNDGND
SCLGPIO22
SDAGPIO21
SDOGND=0x76 / 3V3=0x77
CSB3V3

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:

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):

Ä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


0 0 votes
Article Rating
Abonnieren
Benachrichtige mich bei
0 Comments
Newest
Oldest Most Voted
Inline Feedbacks
Alle Kommentare anzeigen
0
Ich würde mich über deine Meinung freuen.x