Zum Inhalt springen
Arduino BME280 D1Mini ESP8266 Luftfeuchtigkeit Luftdruck Temperatur

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

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.

0 Comments
Newest
Oldest Most Voted
Inline Feedbacks
Alle Kommentare anzeigen
0
Ich würde mich über deine Meinung freuen.x