BME280 – Luftdruck, Luftfeuchtigkeit und Temperatur messen
FunduinoZuletzt aktualisiert am
Umgebungswerte auslesen – vom BME280 bis zur Luftqualität mit dem BME680
Mikrocontroller wählen
Pins, Schaltplan und Sketch in den Arbeitsschritten wechseln mit deiner Auswahl. Sie bleibt gespeichert.
Den BME280 anschließen
Die Bibliotheken für den BME280 installieren
Den BME280 auslesen
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
BME680 mit der Adafruit-Bibliothek auslesen
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
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
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
Anleitung bewerten