Temperatur- und Feuchtigkeitssensor Tutorial für den BME280 Sensor
In diesem Abschnitt bauen wir mit ESP32 und ESP8266 einen Temperatursensor und zeigen die Temperatur anschließend über Alexa, Google Home oder SmartThings an.
Voraussetzungen :
- ESP32, ESP8266 x 1.
- BME280 x 1.
- Jumper-Kabel.
Kurze Einführung in den BME280 Temperatursensor
Der BME280 verwendet einen Temperatursensor, der auf dem Prinzip des Wärmewiderstands basiert. Wenn sich die Temperatur ändert, ändert sich der Widerstand des Sensors. Der BME280 misst diese Widerstandsänderung und berechnet daraus die Temperatur.
Der BME280 kommuniziert mit anderen Geräten über das I2C- oder SPI-Protokoll, um Daten mit einem Mikrocontroller auszutauschen.
Bitte beachte, dass dieses Tutorial für den BME280 gilt, nicht für den BMP280. Der BME280 kann Luftdruck, Temperatur und Luftfeuchtigkeit messen, während der BMP280 nur Luftdruck und Temperatur messen kann.
In diesem Tutorial verwenden wir das I2C-Kommunikationsprotokoll
Verdrahtung des BME280 mit dem ESP8266
| ESP8266 | BME280 Pin |
| 3.3V | Vin |
| GND | GND |
| SCL | 5 (D1) |
| SDA | 4 (D2) |
Bitte beachte, dass du am ESP8266 die I2C-Pins verwenden musst.

Verdrahtung des BME280 mit dem ESP32
| ESP32 | BME280 Pin |
|---|---|
| 3.3V | Vin |
| GND | GND |
| SCL | 22 |
| SDA | 21 |
Bitte beachte, dass du am ESP32 die I2C-Pins verwenden musst.


Lass uns prüfen, ob der Temperatursensor richtig verdrahtet ist und funktioniert.
Schritt 1 : Unterstützende Bibliotheken installieren
- Installiere die BME280 Bibliothek
- Installiere die Adafruit_Sensor Bibliothek
- Installiere die Sinric Pro Bibliothek

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // Default I2C
void setup() {
Serial.begin(9600);
bool status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find BME280 sensor!");
while (1);
}
}
void loop() {
Serial.print("Temperature = ");
Serial.print(bme.readTemperature());
Serial.println(" *C");
// Convert temperature to Fahrenheit
/*Serial.print("Temperature = ");
Serial.print(1.8 * bme.readTemperature() + 32);
Serial.println(" *F");*/
Serial.print("Pressure = ");
Serial.print(bme.readPressure() / 100.0F);
Serial.println(" hPa");
Serial.print("Altitude (Approx) = ");
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(" m");
Serial.print("Humidity = ");
Serial.print(bme.readHumidity());
Serial.println(" %");
Serial.println();
delay(1000);
}
// Ref: https://github.com/adafruit/Adafruit_BME280_Library/blob/master/examples/bme280test/bme280test.ino
Diesen Code auf GitHub Gist ansehen
Schritt 1 : Ein neues Gerät in Sinric Pro erstellen
- Melde dich an bei deinem Sinric Pro Konto, gehe links zum Menü Devices und klicke oben links auf Add Device.
- Gib den Gerätenamen Temperature Sensor, die Beschreibung My Temperature Sensor ein und wähle als Gerätetyp Temperature Sensor aus.

- Klicke im Tab Notifications auf Next

Hier kannst du einen Schwellenwert festlegen, um eine Push-Benachrichtigung über die Sinric Pro App zu erhalten, wenn die Temperatur unter oder über einen bestimmten Wert fällt bzw. steigt. Nutze die Retrigger Time, um die Verzögerung zwischen Benachrichtigungen festzulegen.
-
Klicke auf den Tab Others und dann auf Save
-
Der nächste Bildschirm zeigt die Zugangsdaten, die du benötigst, um das gerade erstellte Gerät zu verbinden.

- Kopiere die Device Id, den App Key und das App Secret Bewahre diese Werte sicher auf. TEILE SIE NICHT IN ÖFFENTLICHEN FOREN !
Schritt 2 : Mit Sinric Pro verbinden
Du kannst den Code generieren lassen, indem du die Zero Code Funktion nutzt, oder ihn selbst schreiben. Wenn du keine Programmiererfahrung hast, empfehlen wir dir, die Zero Code Funktion im Portal zu nutzen, um den Code zu generieren, herunterzuladen und zu flashen.
2.1 Vollständiger Code
#ifdef ENABLE_DEBUG
#define DEBUG_ESP_PORT Serial
#define NODEBUG_WEBSOCKETS
#define NDEBUG
#endif
#include <Arduino.h>
#if defined(ESP8266)
#include <ESP8266WiFi.h>
#elif defined(ESP32)
#include <WiFi.h>
#endif
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
#include "SinricPro.h"
#include "SinricProTemperaturesensor.h"
#define WIFI_SSID "" // Your WiFI SSID name
#define WIFI_PASS "" // Your WiFi Password.
#define APP_KEY "" // Should look like "de0bxxxx-1x3x-4x3x-ax2x-5dabxxxxxxxx" (Get it from Portal -> Secrets)
#define APP_SECRET "" // Should look like "5f36xxxx-x3x7-4x3x-xexe-e86724a9xxxx-4c4axxxx-3x3x-x5xe-x9x3-333d65xxxxxx" (Get it from Portal -> Secrets)
#define TEMP_SENSOR_ID "" // Should look like "5dc1564130xxxxxxxxxxxxxx" (Get it from Portal -> Devices)
#define BAUD_RATE 115200 // Change baudrate to your need (used for serial monitor)
#define EVENT_WAIT_TIME 60000 // send event every 60 seconds
float temperature; // actual temperature
float humidity; // actual humidity
float lastTemperature; // last known temperature (for compare)
float lastHumidity; // last known humidity (for compare)
#define SEALEVELPRESSURE_HPA (1013.25)
Adafruit_BME280 bme; // Default I2C
void handleTemperaturesensor() {
if (SinricPro.isConnected() == false) {
Serial.printf("Not connected to Sinric Pro...!\r\n");
return;
}
static unsigned long last_millis;
unsigned long current_millis = millis();
if (last_millis && current_millis - last_millis < EVENT_WAIT_TIME) return;
last_millis = current_millis;
float temperature = bme.readTemperature();
float humidity = bme.readHumidity();
Serial.printf("Temperature: %2.1f Celsius\tHumidity: %2.1f%%\r\n", temperature, humidity);
if (isnan(temperature) || isnan(humidity)) { // reading failed...
Serial.printf("BME280 reading failed!\r\n"); // print error message
return; // try again next time
}
if (temperature == lastTemperature && humidity == lastHumidity) {
Serial.printf("Temperature/Humidity did not changed. do nothing...!\r\n");
return;
}
SinricProTemperaturesensor &mySensor = SinricPro[TEMP_SENSOR_ID]; // get temperaturesensor device
bool success = mySensor.sendTemperatureEvent(temperature, humidity); // send event
if (success) {
Serial.printf("Sent!\r\n");
} else {
Serial.printf("Something went wrong...could not send Event to server!\r\n"); // Enable ENABLE_DEBUG to see why
}
lastTemperature = temperature; // save actual temperature for next compare
lastHumidity = humidity; // save actual humidity for next compare
}
// setup function for WiFi connection
void setupWiFi() {
Serial.printf("\r\n[Wifi]: Connecting");
#if defined(ESP8266)
WiFi.setSleepMode(WIFI_NONE_SLEEP);
WiFi.setAutoReconnect(true);
#elif defined(ESP32)
WiFi.setSleep(false);
WiFi.setAutoReconnect(true);
#endif
WiFi.begin(WIFI_SSID, WIFI_PASS);
while (WiFi.status() != WL_CONNECTED) {
Serial.printf(".");
delay(250);
}
IPAddress localIP = WiFi.localIP();
Serial.printf("connected!\r\n[WiFi]: IP-Address is %d.%d.%d.%d\r\n", localIP[0], localIP[1], localIP[2], localIP[3]);
}
bool onPowerState(const String &deviceId, bool &state) {
return true; // request handled properly
}
// setup function for SinricPro
void setupSinricPro() {
// add device to SinricPro
SinricProTemperaturesensor &mySensor = SinricPro[TEMP_SENSOR_ID];
mySensor.onPowerState(onPowerState);
// setup SinricPro
SinricPro.onConnected([](){ Serial.printf("Connected to SinricPro\r\n"); });
SinricPro.onDisconnected([](){ Serial.printf("Disconnected from SinricPro\r\n"); });
//SinricPro.restoreDeviceStates(true); // Uncomment to restore the last known state from the server.
SinricPro.begin(APP_KEY, APP_SECRET);
}
void setupBME280() {
bool status = bme.begin(0x76);
if (!status) {
Serial.println("Could not find BME280 sensor!");
while (1);
}
}
// main setup function
void setup() {
Serial.begin(BAUD_RATE); Serial.printf("\r\n\r\n");
setupBME280();
setupWiFi();
setupSinricPro();
}
void loop() {
SinricPro.handle();
handleTemperaturesensor();
}
Diesen Code auf GitHub Gist ansehen
Jetzt solltest du die Temperatur über die Sinric Pro App sehen können

Bitte beachte, dass die Google Home App den Temperatursensor aufgrund von Einschränkungen von Google Home als Thermostat anzeigt.
Fehlerbehebung
-
Dieses Tutorial ist für den BME280. Stelle sicher, dass es kein BMP280-Modul ist.
-
Fehler: Could not find BME280 sensor!. Wahrscheinlich hast du nicht korrekt verdrahtet. Mit dem I2C-Scanner Sketch kannst du prüfen, ob der Sensor korrekt verdrahtet ist.
-
Der BME280 befindet sich standardmäßig im automatischen Modus für kontinuierliche Messungen. Das erwärmt den Chip und beeinflusst die gemessene Temperatur. Wechsle für genauere Messungen bei langem Dauerbetrieb zum Weather Station Scenario.
Serial.println("-- Wetterstation-Szenario --");
Serial.println("Forced Mode, 1x Temperatur / 1x Feuchtigkeit / 1x Druck Oversampling,");
Serial.println("Filter aus");
bme.setSampling(Adafruit_BME280::MODE_FORCED,
Adafruit_BME280::SAMPLING_X1, // Temperatur
Adafruit_BME280::SAMPLING_X1, // Druck
Adafruit_BME280::SAMPLING_X1, // Feuchtigkeit
Adafruit_BME280::FILTER_OFF );
// empfohlene Rate ist 1/60Hz (1m)
delayTime = 60000; // in MillisekundenSiehe: https://github.com/adafruit/Adafruit_BME280_Library/blob/master/examples/advancedsettings/advancedsettings.ino
- Weitere Details findest du auf unserer allgemeinen Seite Troubleshooting.
Verwandte Tutorials
- ESP32 oder ESP8266 mit Alexa und Google Home steuern
- DHT11, DHT22, AM2302 Temperatur- und Feuchtigkeitssensor
- DS18B20 Temperatursensor
- BMP180 Temperatursensor
- LM35, LM335 und LM34 Temperatursensor
This document is open source. See a typo? Please create an issue