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 :

  1. ESP32, ESP8266 x 1.
  2. BME280 x 1.
  3. 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.

Sinric Pro ESP8266 I2C Pins

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.

Sinric Pro ESP32 I2C Pins

Sinric Pro ESP32 I2C BME280 Wiring

Lass uns prüfen, ob der Temperatursensor richtig verdrahtet ist und funktioniert.

Schritt 1 : Unterstützende Bibliotheken installieren

  1. Installiere die BME280 Bibliothek
  2. Installiere die Adafruit_Sensor Bibliothek
  3. Installiere die Sinric Pro Bibliothek

Sinric Pro Install the BME280 library

#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

Sinric Pro create device alexa

Sinric Pro temperature sensor device notifications

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.

Sinric Pro copy device id

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

Sinric Pro App Temperature Sensor

Bitte beachte, dass die Google Home App den Temperatursensor aufgrund von Einschränkungen von Google Home als Thermostat anzeigt.

Fehlerbehebung

  1. Dieses Tutorial ist für den BME280. Stelle sicher, dass es kein BMP280-Modul ist.

  2. 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.

  3. 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 Millisekunden

Siehe: https://github.com/adafruit/Adafruit_BME280_Library/blob/master/examples/advancedsettings/advancedsettings.ino

  1. Weitere Details findest du auf unserer allgemeinen Seite Troubleshooting.

Verwandte Tutorials

This document is open source. See a typo? Please create an issue