BME280 – Luftdruck, Luftfeuchtigkeit und Temperatur messen

FunduinoZuletzt aktualisiert am

Umgebungswerte auslesen – vom BME280 bis zur Luftqualität mit dem BME680

Aufgabe: Der BME280 soll Temperatur, Luftdruck und Luftfeuchtigkeit der Umgebung messen und die Werte im Seriellen Monitor anzeigen. Im zweiten Teil dieser Anleitung lernst du den größeren Bruder kennen: Der BME680 misst zusätzlich die Luftqualität, und du gibst seine Werte wahlweise im Seriellen Monitor, auf einem LCD oder als Webseite aus.

Schaltplan mit BME280 am Arduino UNO: VCC an 3,3V, GND an GND, SCL an A5, SDA an A4
Schaltplan: BME280 am Arduino UNO
Vierzeiliges LCD mit Temperatur, Feuchtigkeit, IAQ und CO2-Schätzung
Die Messwerte auf dem LCD
1 / 2

Mikrocontroller wählen

Pins, Schaltplan und Sketch in den Arbeitsschritten wechseln mit deiner Auswahl. Sie bleibt gespeichert.

Den BME280 anschließen

Der BME280 verfügt über sechs Pins. Für diese Aufgabe verwendest du vier davon:

  • VCC – Pin für die Spannungsversorgung, an den 3,3V-Pin des Arduinos
  • GND – Ground-Pin, an den GND-Pin des Arduinos
  • SCL – Serial Clock, zusammen mit SDA die Signalleitung des I²C-Busses, an den A5-Pin des Arduinos
  • SDA – Serial Data, zusammen mit SCL die Signalleitung des I²C-Busses, an den A4-Pin des Arduinos

Außerdem findest du noch zwei weitere Pins, die du in dieser Aufgabe nicht verwendest:

  • SDO – Pin für die Festlegung der Hexcodierung. Die normale I²C-Adresse lautet 0x77; verbindest du SDO mit einem Ground-Pin, ändert sich die Adresse auf 0x76.
  • CSB – Chip Select

WICHTIG: Der Sensor arbeitet mit 3,3 V. Eine Stromzufuhr von mehr als etwa 3,6 V kann das Modul dauerhaft beschädigen. Außerdem können Erschütterungen die Messwerte des BME280 beeinträchtigen.

Schaltplan mit BME280 am Arduino UNO: VCC an 3,3V, GND an GND, SCL an A5, SDA an A4
Schaltplan: BME280 am Arduino UNO

Die Bibliotheken für den BME280 installieren

Sobald die Verkabelung abgeschlossen ist und du dein Ergebnis noch einmal überprüft hast, schauen wir uns den Sketch an.

Bitte beachte, dass der Sensor sowohl die I²C-Bibliothek Wire.h als auch eine eigene Bibliothek Seeed_BME280.h benötigt. Wire.h ist in der Arduino-Software bereits vorinstalliert. Seeed_BME280.h musst du manuell installieren – im Bibliotheksverwalter findest du sie unter dem Suchbegriff „Grove – Barometer Sensor BME280“.

Eine ausführliche Anleitung zum Installationsprozess findest du unter Bibliotheken zur Arduino-Software hinzufügen.

Den BME280 auslesen

Mit diesem Sketch gibt der BME280 Temperatur, Luftdruck (in Pascal und in Bar) sowie die Luftfeuchtigkeit im Sekundentakt im Seriellen Monitor aus.

Programmcode – BME280 auslesen
#include <Seeed_BME280.h>  // Implementieren der Seeed-Bibliothek, ermöglicht die Kommunikation mit dem BME280
#include <Wire.h>          // Implementieren der Wire-Bibliothek, ermöglicht dem Arduino die Kommunikation mit Geräten, die das I²C-Protokoll verwenden
BME280 bme280;
void setup()
{
  Serial.begin(9600);  // Einstellen der Baudrate
  if (!bme280.init())  // Wenn keine Daten vom BME280 abgefragt werden können ...
  {
    Serial.println("FEHLER!");  // ... dann soll eine Fehlermeldung ausgegeben werden.
  }
}
void loop()  // Starten unserer Schleife
{
  float Pascal;  // Deklarieren der Variablen
  double Bar;
  Serial.print("Temperatur : ");
  Serial.print(bme280.getTemperature());  // Abfrage und Ausgabe der Temperatur
  Serial.println("C");
  Serial.print("Druck : ");
  Pascal = bme280.getPressure();  // Abfrage des Drucks in Pascal
  Serial.print(Pascal);  // Ausgabe des Drucks in Pascal
  Serial.print(" Pascal oder auch ");
  Bar = (Pascal / 100000);  // Wandlung des Pascal-Werts in Bar
  Serial.print(Bar);  // Ausgabe des Drucks in Bar
  Serial.println(" Bar");
  Serial.print("Feuchtigkeit : ");
  Serial.print(bme280.getHumidity());  // Abfrage und Ausgabe der Feuchtigkeit
  Serial.println("%");
  Serial.println(" ");
  delay(1000);
}

Der BME680 – was der Sensor zusätzlich kann

Der Bosch-Sensor BME680 misst Temperatur, Luftfeuchtigkeit und Luftdruck. Außerdem enthält er einen MOX-Sensor (Metalloxid): Je nach Konzentration der flüchtigen organischen Verbindungen (VOC = Volatile Organic Compounds) in der Luft ändert das beheizte Metalloxid seinen Widerstand. Die Luftqualität wird zunächst als Widerstand in Ohm gemessen. Je höher die VOC-Konzentration, desto geringer ist der Widerstandswert.

Viele Materialien in Innenräumen setzen Gase frei:

  • Reinigungs- und Pflegemittel
  • Möbel und Einrichtungsgegenstände
  • Teppiche und Tapeten
  • Baumaterialien (Farben)
  • elektronische Geräte (Computer, Drucker)
  • Heizgeräte (Herde, Öfen)
  • menschliche Atemluft und Schweiß

Der MOX-Sensor braucht etwa 30 Minuten für die Kalibrierung. Um einen Anhaltspunkt für die Luftqualität zu haben, kalibrierst du ihn am besten draußen oder in einem gut durchlüfteten Raum. Diesen Wert kannst du dann als Referenz für eine gute Luftqualität nehmen.

BME680 mit der Adafruit-Bibliothek auslesen

Im Seriellen Monitor zeigst du die Messwerte für Temperatur, Luftfeuchtigkeit, Luftdruck und Luftqualität an. Aus dem Verhältnis des aktuellen Luftdrucks zum Luftdruck auf Meereshöhe lässt sich außerdem die ungefähre Höhe deines Standorts in Metern bestimmen.

Für diesen Teil brauchst du einen BME680 und wahlweise einen UNO R3, einen Wemos D1 Mini, einen ESP32-WROOM oder einen NodeMCU.

Schaltplan mit BME680 am Arduino UNO über den I²C-Bus
Schaltplan: BME680 am Arduino UNO
Serieller Monitor mit Temperatur, Luftfeuchtigkeit, Luftdruck, Gaswiderstand und ungefährer Höhe
Ausgabe im Seriellen Monitor mit der Adafruit-Bibliothek
1 / 2
Programmcode – BME680 mit der Adafruit-Bibliothek
#include "Wire.h"
#include "Adafruit_Sensor.h"
#include "Adafruit_BME680.h"
// Luftdruck auf Meereshöhe
#define SEALEVELPRESSURE_HPA (1013.25)
// i2c-Anschluss
Adafruit_BME680 bme;
void setup()
{
  // Seriellen Monitor starten
  Serial.begin(9600);
  while (!Serial);
  delay(1000);
  Serial.println(F("BME680 Test"));
  // BME680 starten
  if (!bme.begin()) {
    Serial.println("BME680 Sensor nicht gefunden!");
    // Programm anhalten
    while (1);
  }
  /*
    oversampling: Setzen einer höheren Abtastrate als die Standardrate
    mögliche Werte:
    BME680_OS_NONE -> ausgeschaltet
    BME680_OS_1X
    BME680_OS_4X
    BME680_OS_8X
    BME680_OS_16X
    bme.setTemperatureOversampling(BME680_OS_NONE);
    bme.setHumidityOversampling(BME680_OS_2X);
    bme.setPressureOversampling(BME680_OS_4X);
    // IIR = infinite impulse response (Filter mit unendlicher Impulsantwort)
    // liefert eine unendlich lang andauernde Impulsantwort
    bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
    bme.setGasHeater(320, 150);
    Standardwerte sind für die Messung ausreichend
  */
}
void loop()
{
  // wenn der Sensor keine Daten übermittelt ...
  if (!bme.performReading())
  {
    Serial.println("Keine Messdaten");
    return;
  }
  Serial.print("Temperatur: ");
  // Messwert in String umwandeln
  String Temperatur = String(bme.temperature);
  // . durch , ersetzen
  Temperatur.replace(".", ",");
  Serial.println(Temperatur + " °C");
  String Luftfeuchtigkeit = String(bme.humidity);
  Luftfeuchtigkeit.replace(".", ",");
  Serial.print("Luftfeuchtigkeit: ");
  Serial.println(Luftfeuchtigkeit + " %");
  Serial.print("Luftdruck = ");
  String Luftdruck = String(bme.pressure / 100.0);
  Luftdruck.replace(".", ",");
  Serial.println(Luftdruck + " hPa");
  Serial.print("Widerstandswert Gas = ");
  String GasWiderstand = String(bme.gas_resistance / 1000.0);
  Serial.println(GasWiderstand + " KOhm");
  Serial.print("Ungefähre Höhe: ");
  Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
  Serial.println(" m");
  Serial.println();
  delay(2000);
}

BME680 mit der BSEC-Bibliothek am ESP32

Die Luftqualität wird zunächst als Widerstand in Ohm gemessen. Je höher die VOC-Konzentration, desto geringer ist der Widerstandswert. Ein interner Algorithmus der Bosch-Software BSEC wandelt diesen Rohwert in einen Wert für die Luftqualität um (IAQ = Index for Air Quality).

Natürlich kommt die Genauigkeit dieser Messwerte nicht an die Präzision professioneller Messgeräte heran. Sie kann dir aber zuverlässige Hinweise auf die Qualität der Raumluft geben. Die Daten für Temperatur, Luftfeuchtigkeit und Luftdruck stehen kurz nach der Aktivierung des Sensors zur Verfügung. Der MOX-Sensor benötigt bis zu 30 Minuten, um erste Messdaten anzuzeigen. Stabilität und Zuverlässigkeit der Messdaten sind erst nach mehreren Tagen gewährleistet. Der Wert für die Genauigkeit des IAQ muss dafür 3 erreichen.

Vorbereitung: Installiere über den Boardverwalter das Board ESP32-Wroom und anschließend über Sketch → Bibliothek einbinden → Bibliotheken verwalten die Bibliothek BSEC.

Für diesen Teil brauchst du zwingend einen ESP32-Controller – die BSEC-Bibliothek läuft nicht auf dem UNO R3.

Serieller Monitor mit Statusmeldungen und Messwerten inklusive IAQ und CO2-Schätzung
Ausgabe im Seriellen Monitor mit der BSEC-Bibliothek
Tabelle mit IAQ-Wertebereichen und der zugehörigen Bewertung der Luftqualität
IAQ-Index und Bewertung der Luftqualität (Quelle: aqicn.org/scale/de/)
Schaltplan mit BME680 am ESP32-Wroom über den I²C-Bus
Schaltplan: BME680 am ESP32
Bibliotheksverwalter der Arduino-Software mit der BSEC-Bibliothek
Die Bibliothek BSEC im Bibliotheksverwalter
Übersicht der Funktionen und Messgrößen der BSEC-Bibliothek
Funktionen der Bibliothek BSEC
1 / 5
BSEC – Benötigte Bibliothek und Variable
#include "bsec.h"
// Objekt (iaqSensor) der Klasse Bsec definieren
Bsec iaqSensor;
BSEC – Der setup-Teil
void setup()
{
  Serial.begin(9600);
  // auf serielle Verbindung warten
  while (!Serial);
  delay(1000);
  // Hex-Adresse des BME680
  // BME68X_I2C_ADDR_HIGH = 0x77 (Standard)
  // BME68X_I2C_ADDR_LOW = 0x76 (Verbindung SDO zu GND)
  iaqSensor.begin(BME68X_I2C_ADDR_HIGH, Wire);
  // Array der verfügbaren Sensoren
  bsec_virtual_sensor_t sensorList[13] =
  {
    BSEC_OUTPUT_IAQ,
    BSEC_OUTPUT_STATIC_IAQ,
    BSEC_OUTPUT_CO2_EQUIVALENT,
    BSEC_OUTPUT_BREATH_VOC_EQUIVALENT,
    BSEC_OUTPUT_RAW_TEMPERATURE,
    BSEC_OUTPUT_RAW_PRESSURE,
    BSEC_OUTPUT_RAW_HUMIDITY,
    BSEC_OUTPUT_RAW_GAS,
    BSEC_OUTPUT_STABILIZATION_STATUS,
    BSEC_OUTPUT_RUN_IN_STATUS,
    BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE,
    BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY,
    BSEC_OUTPUT_GAS_PERCENTAGE
  };
  // BSEC_SAMPLE_RATE_ULP: Ultra Low Power Mode -> Messung alle 5 Minuten
  // BSEC_SAMPLE_RATE_LP: Low Power Mode -> Messung alle 3 Sekunden
  iaqSensor.updateSubscription(sensorList, 13, BSEC_SAMPLE_RATE_LP);
}
BSEC – Der loop-Teil
void loop()
{
  // wenn der Sensor arbeitet ...
  if (iaqSensor.run())
  {
    // Messwerte ermitteln, in Strings umwandeln, . durch , ersetzen
    String Temperatur = String(iaqSensor.temperature);
    Temperatur.replace(".", ",");
    String Luftfeuchtigkeit = String(iaqSensor.humidity);
    Luftfeuchtigkeit.replace(".", ",");
    String Luftdruck = String(iaqSensor.pressure / 100);
    Luftdruck.replace(".", ",");
    String IAQ = String(iaqSensor.iaq);
    IAQ.replace(".", ",");
    String StatischerIAQ = String(iaqSensor.staticIaq);
    StatischerIAQ.replace(".", ",");
    String CO2 = String(iaqSensor.co2Equivalent);
    CO2.replace(".", ",");
    // Ausgabe im Seriellen Monitor
    Serial.println("Statusmeldungen:");
    Serial.println("-----------------------------");
    Serial.println("Sensor bereit (0-1): " + String(int(iaqSensor.runInStatus)));
    Serial.println("Genauigkeit IAQ (0-3): " + String(int(iaqSensor.iaqAccuracy)));
    Serial.println("-----------------------------");
    Serial.println("Messwerte:");
    Serial.println("-----------------------------");
    Serial.println("Temperatur: " + Temperatur + " °C");
    Serial.println("Feuchtigkeit: " + Luftfeuchtigkeit + " %");
    Serial.println("Luftdruck: " + Luftdruck + " hPa");
    Serial.println("IAQ: " + IAQ);
    Serial.println("Statischer IAQ: " + StatischerIAQ);
    Serial.println("Schätzung CO2: " + CO2 + " ppm");
    Serial.println("-----------------------------");
  }
}

Erweiterung: Die Messdaten auf einem LCD anzeigen

Statt nur im Seriellen Monitor kannst du die Messwerte auch auf einem vierzeiligen I²C-LCD ausgeben. Dafür installierst du über Sketch → Bibliothek einbinden → Bibliotheken verwalten zusätzlich die Bibliothek LCDIC2.

Vierzeiliges LCD mit Temperatur, Feuchtigkeit, IAQ und CO2-Schätzung
Die Messwerte auf dem LCD
Schaltplan mit BME680 und vierzeiligem I²C-LCD am ESP32
Schaltplan LCD: rot = 5V, schwarz = GND, gelb = SCL, grün = SDA
Bibliotheksverwalter der Arduino-Software mit der Bibliothek LCDIC2
Die Bibliothek LCDIC2 im Bibliotheksverwalter
1 / 3
Programmcode – Messwerte auf einem LCD anzeigen
#include "bsec.h"
#include "LCDIC2.h"
// 4-zeiliges LCD
LCDIC2 lcd(0x27, 20, 4);
// Objekt (iaqSensor) der Klasse Bsec definieren
Bsec iaqSensor;
void setup()
{
  Serial.begin(9600);
  // auf serielle Verbindung warten
  while (!Serial);
  delay(1000);
  // LCD starten
  lcd.begin();
  // Cursor "verstecken"
  lcd.setCursor(false);
  // Hex-Adresse des BME680
  // BME68X_I2C_ADDR_HIGH = 0x77 (Standard)
  // BME68X_I2C_ADDR_LOW = 0x76 (Verbindung SDO zu GND)
  iaqSensor.begin(BME68X_I2C_ADDR_HIGH, Wire);
  // Array der verfügbaren Sensoren
  bsec_virtual_sensor_t sensorList[13] =
  {
    BSEC_OUTPUT_IAQ,
    BSEC_OUTPUT_STATIC_IAQ,
    BSEC_OUTPUT_CO2_EQUIVALENT,
    BSEC_OUTPUT_BREATH_VOC_EQUIVALENT,
    BSEC_OUTPUT_RAW_TEMPERATURE,
    BSEC_OUTPUT_RAW_PRESSURE,
    BSEC_OUTPUT_RAW_HUMIDITY,
    BSEC_OUTPUT_RAW_GAS,
    BSEC_OUTPUT_STABILIZATION_STATUS,
    BSEC_OUTPUT_RUN_IN_STATUS,
    BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_TEMPERATURE,
    BSEC_OUTPUT_SENSOR_HEAT_COMPENSATED_HUMIDITY,
    BSEC_OUTPUT_GAS_PERCENTAGE
  };
  // BSEC_SAMPLE_RATE_ULP: Ultra Low Power Mode -> Messung alle 5 Minuten
  // BSEC_SAMPLE_RATE_LP: Low Power Mode -> Messung alle 3 Sekunden
  iaqSensor.updateSubscription(sensorList, 13, BSEC_SAMPLE_RATE_LP);
}
void loop()
{
  // wenn der Sensor arbeitet ...
  if (iaqSensor.run())
  {
    // Messwerte ermitteln, in Strings umwandeln, . durch , ersetzen
    String Temperatur = String(iaqSensor.temperature);
    Temperatur.replace(".", ",");
    String Luftfeuchtigkeit = String(iaqSensor.humidity);
    Luftfeuchtigkeit.replace(".", ",");
    String Luftdruck = String(iaqSensor.pressure / 100);
    Luftdruck.replace(".", ",");
    String IAQ = String(iaqSensor.iaq);
    IAQ.replace(".", ",");
    String StatischerIAQ = String(iaqSensor.staticIaq);
    StatischerIAQ.replace(".", ",");
    String CO2 = String(iaqSensor.co2Equivalent);
    CO2.replace(".", ",");
    // Ausgabe im Seriellen Monitor
    Serial.println("Statusmeldungen:");
    Serial.println("-----------------------------");
    Serial.println("Sensor bereit (0-1): " + String(int(iaqSensor.runInStatus)));
    Serial.println("Genauigkeit IAQ (0-3): " + String(int(iaqSensor.iaqAccuracy)));
    Serial.println("-----------------------------");
    Serial.println("Messwerte:");
    Serial.println("-----------------------------");
    Serial.println("Temperatur: " + Temperatur + " °C");
    Serial.println("Feuchtigkeit: " + Luftfeuchtigkeit + " %");
    Serial.println("Luftdruck: " + Luftdruck + " hPa");
    Serial.println("IAQ: " + IAQ);
    Serial.println("Statischer IAQ: " + StatischerIAQ);
    Serial.println("Schätzung CO2: " + CO2 + " ppm");
    Serial.println("-----------------------------");
    // Ausgabe auf dem LCD
    lcd.setCursor(0, 0);
    lcd.print("Temperatur: " + Temperatur + "\337C");
    lcd.setCursor(0, 1);
    lcd.print("Feuchtigkeit: " + Luftfeuchtigkeit + "%");
    lcd.setCursor(0, 2);
    lcd.print("IAQ: " + IAQ);
    lcd.setCursor(0, 3);
    lcd.print("CO2: " + CO2 + " ppm");
  }
}

Erweiterung: Die Messdaten im Web anzeigen

Der ESP32 kann die Messwerte auch als Webseite im lokalen Netz bereitstellen. Der Sketch startet dazu einen kleinen Webserver, holt die Uhrzeit von einem NTP-Zeitserver und baut die Seite mit den aktuellen Messwerten und einem Aktualisieren-Button zusammen.

Der Quellcode dieser Erweiterung fehlt derzeit. Er wurde beim Umzug der Anleitung beschädigt: Die HTML-Bausteine innerhalb der Textbausteine des Sketches sind dabei verloren gegangen, sodass sich der Code nicht mehr übersetzen ließe. Wir stellen ihn in Kürze wieder bereit.

Browserseite mit den Messwerten des BME680 und einem Aktualisieren-Button
Die Messwerte im Browser
Anleitung bewerten

Kommentare

Frage stellen oder Erfahrung teilen

Schreib uns, wenn etwas nicht funktioniert. Nenne dabei dein Board und die Fehlermeldung.

Wir prüfen jeden Kommentar vor der Veröffentlichung. Deine E-Mail-Adresse bleibt bei uns.