Skip to Content

BME680 Umweltsensor mit Arduino

BME680 Umweltsensor mit Arduino

Lerne, wie man den BME680 Umweltsensor mit Arduino verwendet. Der BME680 ist ein winziger Sensor, der Temperatur, Luftfeuchtigkeit, Druck und Gaskonzentration messen kann. Er unterstützt auch verschiedene Energiemodi, einschließlich eines ultra-niedrigen Energiemodus, was ihn ideal für batteriebetriebene Projekte macht.

Benötigte Teile

Unten findest du die für dieses Projekt benötigten Teile. Neben dem BME680 Sensor benötigst du einen Mikrocontroller. Ich habe einen Arduino UNO gewählt, aber du kannst auch jeden anderen Arduino verwenden. Da der BME680 mit 5V und 3,3V läuft, kannst du zum Beispiel auch einen ESP32 oder ESP8622 verwenden.

BME680 Sensor

Arduino Uno

Dupont wire set

Dupont Kabelsatz

Half_breadboard56a

Breadboard

USB Data Sync cable Arduino

USB-Kabel für Arduino UNO

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

Überblick über den BME680 Sensor

Der BME680 ist ein winziger Sensor (3x3x1 mm), der Temperatur, Luftfeuchtigkeit, Druck und die Konzentration flüchtiger organischer Verbindungen (VOC) wie Ethanol, Alkohol und Kohlenmonoxid messen kann. Das Bild unten zeigt den Sensor mit dem kleinen Loch für den Gasaustausch oben:

BME680 Sensor
BME680 Sensor

Die Kommunikation mit dem Sensor erfolgt über eine I2C- oder SPI-Schnittstelle und ist kompatibel mit einem Arduino oder ESP32, zum Beispiel.

Der BME680 Chip hat eine Betriebsspannung von 1,7V bis 3,6V. Meistens verwendet man jedoch ein Breakout-Board mit Spannungsregler, das es ermöglicht, den Sensor auch mit 5V zu betreiben. Mehr dazu später.

Der Stromverbrauch liegt bei etwa 4µA für Feuchtigkeits-, Druck- und Temperaturmessungen und bis zu 12mA, wenn alle Sensoren inklusive Gas genutzt werden. Der Sensor kann jedoch in den Schlafmodus versetzt werden, wo er nur 0,15µA verbraucht. Außerdem können die einzelnen Sensoren für Feuchtigkeit, Druck und Gas unabhängig ein- oder ausgeschaltet werden, um den Stromverbrauch zu steuern.

Zur Genauigkeit: Der Sensor misst Luftfeuchtigkeit mit ±3% Genauigkeit, barometrischen Druck mit ±1 hPa absoluter Genauigkeit und Temperatur mit ±1,0°C Genauigkeit. Aufgrund der Druckgenauigkeit kann der Sensor die Höhe mit ±1 Meter schätzen.

SensorGenauigkeitMessbereich
Temperatur± 1,0 ºC-40 bis 85 ºC
Luftfeuchtigkeit± 3 %0 bis 100 %
Druck± 1 hPa300 bis 1100 hPa

Gassensor

Der BME680 enthält einen MOx (Metalloxid)-Sensor mit Heizung, um die Konzentration flüchtiger organischer Verbindungen (VOCs) in der Luft zu messen, speziell Ethan, Isopren / 2-Methyl-1,3-Butadien, Ethanol, Aceton, Kohlenmonoxid. Er kann diese VOCs jedoch nicht unterscheiden, sondern gibt einen Widerstandswert aus, der proportional zur VOC-Konzentration ist.

Beachte, dass der Gassensor eine Einbrennzeit von 5 bis 30 Minuten benötigt! Wenn du den Sensor (und Mikrocontroller) zwischen den Messungen in den Schlafmodus versetzen möchtest, musst du sensor state speichern, um die Einbrennzeit des Gassensors zu verkürzen. Für Feuchtigkeits-, Druck- und Temperaturmessungen ist das nicht nötig.

Für die vollständigen technischen Spezifikationen siehe das unten verlinkte Datenblatt:

Breakout-Board für BME680

Da der BME680 Chip so winzig ist, möchtest du normalerweise ein Breakout-Board verwenden, um den Sensor an einen Arduino oder ESP32 anzuschließen. Das Bild unten zeigt Vorder- und Rückseite eines typischen Breakout-Boards für den BME680:

Front and back of  BME680 breakout board
Vorder- und Rückseite des BME680 Breakout-Boards

Pinbelegung des BME680

Das Breakout-Board hat typischerweise den XC6206 (662K) Low-Dropout-Spannungsregler, der es ermöglicht, den Sensor mit 3,3V oder 5V zu betreiben. Der BME680 ist das kleine quadratische Metallgehäuse auf der rechten Seite im Foto unten:

Pinout of BME680
Pinbelegung des BME680

Auf der linken Seite befinden sich die Pins für die I2C- oder SPI-Schnittstelle sowie die Stromversorgungsanschlüsse (VCC, GND). Für die I2C-Kommunikation sind nur die SCL- und SDA-Pins erforderlich. Bei der SPI-Schnittstelle ermöglicht der CS (Chip Select)-Pin, dass mehrere BME680 Sensoren denselben Bus teilen. Jeder Sensor kann individuell gesteuert werden, indem sein CS-Pin an einen separaten GPIO angeschlossen wird.

Bei der I2C-Schnittstelle bestimmt der SDO-Pin die I2C-Adresse des Sensors. Wenn SDO nicht verbunden ist, wird die Adresse auf 0x77 gesetzt, während eine Verbindung mit Masse die Adresse auf 0x76 ändert. Diese Konfiguration hilft, Adresskonflikte mit anderen I2C-Geräten zu vermeiden und ermöglicht auch den Betrieb von zwei BME680 Sensoren am selben I2C-Bus.

Anschluss des BME680 über I2C

Der Anschluss des BME680 über I2C ist einfach. Verbinde SCL und SDA des BME680 mit den entsprechenden Pins am Arduino UNO. GND muss mit GND verbunden werden, und VCC kann mit 5V oder 3,3V verbunden werden. Siehe die vollständige Verkabelung unten:

Connecting the BME680 to Arduino UNO via I2C
Anschluss des BME680 an Arduino UNO über I2C

Wenn du nicht weißt, welche Pins die Hardware-I2C-Pins für dein Board sind, schau dir das Find I2C and SPI default pins Tutorial an. Wenn du ein 3,3V-Board verwendest, z.B. einen ESP32, stelle sicher, dass VCC mit 3,3V verbunden ist!

Code zum Messen von Temperatur, Luftfeuchtigkeit, Druck, Höhe und Gas

Der folgende Code zeigt, wie man Temperatur, Luftfeuchtigkeit, Druck, Höhe und Gaskonzentration mit dem BME680 misst. Schau dir zuerst den kompletten Code an, bevor wir die Details besprechen:

#include "Adafruit_BME680.h"

#define SEALEVELPRESSURE_HPA (1013.25)

Adafruit_BME680 bme;

void setup() {
  Serial.begin(115200);

  bme.begin();
  bme.setTemperatureOversampling(BME680_OS_8X);
  bme.setHumidityOversampling(BME680_OS_2X);
  bme.setPressureOversampling(BME680_OS_4X);
  bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
  bme.setGasHeater(320, 150);  // 320*C for 150 ms
}

void loop() {
  if (bme.performReading()) {
    Serial.print("Temperature = ");
    Serial.print(bme.temperature);
    Serial.println(" *C");

    Serial.print("Humidity = ");
    Serial.print(bme.humidity);
    Serial.println(" %");


    Serial.print("Pressure = ");
    Serial.print(bme.pressure / 100.0);
    Serial.println(" hPa");

    Serial.print("Altitude = ");
    Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
    Serial.println(" m");

    Serial.print("Gas = ");
    Serial.print(bme.gas_resistance / 1000.0);
    Serial.println(" KOhms");

    Serial.println();
    delay(2000);
  }
}

Bibliotheken

Zu Beginn bindet der Code die Adafruit BME680 library ein, die alle wichtigen Funktionen für den BME680 Sensor bereitstellt. Diese Bibliothek übernimmt die Kommunikation über I2C oder SPI und vereinfacht das Auslesen des Sensors.

#include "Adafruit_BME680.h"

Du kannst diese Bibliothek wie gewohnt über den LIBRARY MANAGER installieren. Suche einfach nach „bme680“ und wähle die „Adafruit BME680 Library“ wie unten gezeigt:

Adafruit BME680 library installed in LIBRARY MANAGER
Adafruit BME680 library installiert im LIBRARY MANAGER

Konstanten

Als nächstes definiert der Code eine Konstante für den Luftdruck auf Meereshöhe in Hektopascal (hPa). Dieser Wert ist wichtig für die Höhenberechnung. Du kannst ihn je nach Standort anpassen, um die Genauigkeit zu verbessern. Dieses map könnte hilfreich sein.

#define SEALEVELPRESSURE_HPA (1013.25)

Objekte

Hier erstellt der Code eine Instanz der Adafruit_BME680 Klasse. Dieses Objekt ermöglicht den Zugriff auf Sensordaten und die Konfiguration des Sensors.

Adafruit_BME680 bme;

Wenn du SDO unverbunden lässt und die Standard-I2C-Pins deines Mikrocontrollers nutzt, sollte dieser Konstruktor so funktionieren. Andernfalls kannst du die I2C-Adresse über bme.begin(addr) in der setup-Funktion angeben:

bme.begin(uint8_t addr = BME68X_DEFAULT_ADDRESS);

oder andere I2C-Pins über

Adafruit_BME680(TwoWire *theWire = &Wire);

beim Erstellen des Sensorobjekts.

Setup

Innerhalb der setup() Funktion startet der Code die serielle Kommunikation mit 115200 Baud. Das ist wichtig, um Sensordaten im Serial Monitor auszugeben.

Serial.begin(115200);

Dann initialisiert er den BME680 Sensor durch Aufruf von bme.begin(). Wenn der Sensor korrekt angeschlossen ist und die Bibliothek funktioniert, beginnt die Kommunikation.

bme.begin();

Denke daran, dass du bei Bedarf eine andere I2C-Adresse durch Aufruf von bme.begin(addr) angeben kannst.

Die Genauigkeit des Sensors hängt stark von den Oversampling-Einstellungen ab. In dieser Zeile wird die Temperaturmessung auf 8-faches Oversampling gesetzt, was Schwankungen glättet und die Zuverlässigkeit verbessert.

bme.setTemperatureOversampling(BME680_OS_8X);

Der BME680 unterstützt folgende Oversampling-Einstellungen:

  • BME680_OS_NONE
  • BME680_OS_1X
  • BME680_OS_2X
  • BME680_OS_4X
  • BME680_OS_8X
  • BME680_OS_16X

Die Luftfeuchtigkeit wird 2-fach oversampled. Das ist für die meisten Anwendungen ausreichend, bei denen die Luftfeuchtigkeit nicht schnell schwankt.

bme.setHumidityOversampling(BME680_OS_2X);

Für Druckmessungen verwendet der Sensor 4-faches Oversampling. Der atmosphärische Druck ändert sich langsam, daher bietet diese Einstellung einen guten Kompromiss zwischen Geschwindigkeit und Genauigkeit.

bme.setPressureOversampling(BME680_OS_4X);

Der Code wendet außerdem einen Tiefpassfilter auf die Sensordaten an, einen IIR-Filter (Infinite Impulse Response). Das hilft, Rauschen bei den Druckmessungen zu eliminieren.

bme.setIIRFilterSize(BME680_FILTER_SIZE_3);

Folgende Filtergrößen werden unterstützt:

  • BME680_FILTER_SIZE_0
  • BME680_FILTER_SIZE_1
  • BME680_FILTER_SIZE_3
  • BME680_FILTER_SIZE_7
  • BME680_FILTER_SIZE_15
  • BME680_FILTER_SIZE_31
  • BME680_FILTER_SIZE_63
  • BME680_FILTER_SIZE_127

Schließlich gibt es eine spezielle Einstellung für den Gassensor. Er muss vor der Messung aufgeheizt werden. Diese Zeile setzt die Heizung auf 320°C für 150 Millisekunden. Das ist entscheidend für die Messung flüchtiger organischer Verbindungen (VOCs) in der Luft.

bme.setGasHeater(320, 150);  // 320*C for 150 ms

Loop

Schauen wir uns nun die loop() Funktion an, die kontinuierlich läuft. Sie beginnt mit der Prüfung, ob eine Sensorablesung verfügbar ist, mittels bme.performReading(). Wenn die Ablesung erfolgreich ist, werden die Daten ausgegeben.

if (bme.performReading()) {

Die Temperatur wird von bme.temperature abgerufen und im Serial Monitor in Grad Celsius ausgegeben.

Serial.print("Temperature = ");
Serial.print(bme.temperature);
Serial.println(" *C");

Ebenso wird die Luftfeuchtigkeit von bme.humidity ausgelesen und in Prozent ausgegeben.

Serial.print("Humidity = ");
Serial.print(bme.humidity);
Serial.println(" %");

Der atmosphärische Druck wird von bme.pressure abgerufen. Der Wert ist in Pascal, durch Division durch 100 wird er in hPa (Hektopascal) umgerechnet, eine Standard-Einheit für barometrischen Druck.

Serial.print("Pressure = ");
Serial.print(bme.pressure / 100.0);
Serial.println(" hPa");

Die Höhe wird nicht direkt gemessen, sondern aus dem Druck unter Verwendung des Meeresspiegel-Referenzwerts berechnet. Die readAltitude() Funktion übernimmt das für dich.

Serial.print("Altitude = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");

Zum Schluss wird der Gaswiderstand (in Ohm) ausgegeben. Dieser Wert gibt Aufschluss über die Luftqualität. Der Sensor zeigt nicht genau an, welche Gase vorhanden sind, aber ein hoher Widerstand bedeutet meist sauberere Luft. Die Division durch 1000 wandelt den Wert in Kiloohm um, was die Lesbarkeit erleichtert.

Serial.print("Gas = ");
Serial.print(bme.gas_resistance / 1000.0);
Serial.println(" KOhms");

Die Loop pausiert dann 2 Sekunden, bevor sie wiederholt wird. Diese Verzögerung hilft, die Ausgabe im Serial Monitor gut zu sehen. Du solltest folgende Ausgabe sehen:

Output on Serial Monitor
Ausgabe im Serial Monitor

Das war’s! Du weißt jetzt, wie man den BME680 an ein Arduino-Board über I2C anschließt und Daten ausliest. Im nächsten Abschnitt zeige ich dir kurz, wie du stattdessen die SPI-Schnittstelle nutzt.

Anschluss des BME680 über SPI

Statt I2C kannst du auch über SPI mit dem BME680 kommunizieren, was mehr Verbindungen erfordert, aber schnellere Messungen ermöglicht.

Je nach Mikrocontroller-Board unterscheiden sich die Pins für Hardware-SPI. Siehe das Find I2C and SPI default pins Tutorial, wenn du sie identifizieren musst. Für den Arduino UNO sind das die Pins 13 (SCK), 12 (MISO/SDO), 11 (MOSI/SDA) und 10 (CS/SS). Das folgende Diagramm zeigt die notwendigen Verbindungen.

Connecting the BME680 to Arduino UNO via SPI
Anschluss des BME680 an Arduino UNO über SPI

Im Vergleich zum vorherigen Code musst du nur die folgende Zeile, die das Sensorobjekt erstellt, ersetzen

Adafruit_BME680 bme;

durch diese Zeile, die die Pins für die SPI-Verbindung des BME680 angibt:

#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10

Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);

Der restliche Code kann unverändert bleiben.

Fazit

In diesem Tutorial hast du gelernt, wie man den BME680 Umweltsensor mit einem Arduino verwendet. Der BME680 ist ein sehr kleiner Sensor, der Temperatur, Luftfeuchtigkeit, Druck und Gaskonzentrationen genau messen kann.

Im Vergleich zum sehr ähnlichen BME280 verfügt der BME680 über einen zusätzlichen Gassensor, der jedoch eine Aufwärmzeit von 5–20 Minuten benötigt, bevor Gaswerte zuverlässig sind, und mehr Strom verbraucht. Wenn du keine Gas-Messungen brauchst, nimm den günstigeren und kleineren BME280. Siehe das How To Use BME280 Pressure Sensor With Arduino Tutorial für mehr Informationen.

Beachte, dass es auch einen BMP280 gibt, der günstiger ist und weniger Strom verbraucht, aber nur Temperatur und Druck misst. Wenn du nur Temperatur und Luftfeuchtigkeit brauchst, nimm stattdessen den SI7021, der noch kleiner und genauer ist. Schau dir das Si7021 Temperature Sensor Arduino Tutorial an.

Andere gängige, aber weniger genaue Sensoren sind der LM35, der TMP36, der DS18B20 und der DHT11/ DHT22. Für die Anzeige von Sensordaten schau dir die Weather Station on e-Paper Display und die Temperature Plotter on e-Paper Display Tutorials an.

Wenn du Umweltdaten über größere Entfernungen senden möchtest, die über Bluetooth oder Wi-Fi hinausgehen, könnte Langstreckenkommunikation via LoRa für dich interessant sein: Send Environmental Data with LoRa.

Wir haben nicht über die Interpretation der Gaskonzentrationsmessungen des BME680 gesprochen. Wenn du Luftqualität messen möchtest, schau dir das Measure Air Quality with BME680 Tutorial an, in dem wir das ausführlich behandeln.

Wenn du Fragen hast, hinterlasse sie gerne im Kommentarbereich.

Viel Spaß beim Tüfteln ; )