DHT11- und DHT22-Temperatur- und Feuchtigkeitssensor mit ESP32 oder ESP8266 für Alexa und Google Home

In diesem Abschnitt zeigen wir dir Schritt für Schritt, wie du mit ESP32 oder ESP8266 einen Temperatursensor aufbaust und die Temperatur anschließend über Alexa, Google Home oder SmartThings anzeigst.

Voraussetzungen :

  1. ESP32 oder ESP8266 x 1.
  2. DHT11 oder DHT22, AM2302, RHT03 x 1.
  3. Jumperkabel.

Kurze Einführung zum Temperatursensor

Die DHT- und AM-Serien sind kostengünstige digitale Sensoren zur Messung von Temperatur und Luftfeuchtigkeit. Sie verwenden einen kapazitiven Feuchtesensor und einen Thermistor, um die umgebende Luft zu messen, und geben anschließend ein digitales Signal am Datenpin aus.

Verdrahtung

Sinric Pro esp8266 DHT22 wiring

Hinweis: Manche DHT22-Sensoren werden ohne Pull-up-Widerstand geliefert, sodass du selbst einen anschließen musst. Üblich ist ein 10k-Widerstand, der vom Datenpin des Sensors zur +3,3V- oder +5V-Versorgung geschaltet wird.

MCU DHT Pin
ESP32 16
ESP8266 14 (D5)

arduino-DHT Bibliothek einrichten

Wir verwenden die arduino-DHT Bibliothek, um Temperatur und Luftfeuchtigkeit von unserem Sensor auszulesen. Gehe zu arduino-DHT und lade die Bibliothek als ZIP-Datei herunter.

Sinric Pro esp8266 DHT22 wiring

Entpacke die ZIP-Datei anschließend nach C:\Users\<username>\Documents\Arduino\libraries\arduino-DHT. So sollte es aussehen.

Sinric Pro esp8266 DHT22 wiring

Prüfen wir zuerst, ob die Temperaturmessung richtig verdrahtet ist und funktioniert.

#include "DHT.h" // https://github.com/markruys/arduino-DHT  Support for DHT11 and DHT22, AM2302, RHT03
 
#if defined(ESP8266)
  #define DHT_PIN    D1
#elif defined(ESP32)
  #define DHT_PIN    16
#endif

float temperature;
float humidity;

DHT dht;
 
void setup() {
  Serial.begin(115200);
  delay(10);

  dht.setup(DHT_PIN);
}
 
void loop() {
    delay(dht.getMinimumSamplingPeriod());

    temperature = dht.getTemperature();
    humidity = dht.getHumidity();

    if (isnan(temperature) || isnan(humidity)) {
      Serial.printf("DHT reading failed!\r\n");
      return;
    } else {
      Serial.printf("Temperature: %2.1f Celsius\tHumidity: %2.1f%%\r\n", temperature, humidity);
    }     
}

Diesen Code auf GitHub Gist ansehen

Der serielle Monitor der Arduino IDE zeigt die aktuelle Temperatur dann so an

Sinric Pro DHT Temperature Sensor

Schritt 1 : Neues Gerät in Sinric Pro anlegen

Sinric Pro create device alexa

Sinric Pro temperature sensor device notifications

Hier kannst du einen Schwellenwert festlegen, um über die Sinric Pro App eine Push-Benachrichtigung 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

Schritt 2.1 Sinric Pro Bibliothek installieren

Sinric Pro install SinricPro library

Du kannst den Code generieren lassen über die Zero Code Funktion oder ihn selbst schreiben. Wenn du keine Programmiererfahrung hast, empfehlen wir, die Zero Code Funktion im Portal zu nutzen, um den Code zu generieren, herunterzuladen und zu flashen.

2.2 Vollständiger Code

// Uncomment the following line to enable serial debug output
//#define ENABLE_DEBUG

#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) || defined(ARDUINO_ARCH_RP2040)
  #include <WiFi.h>
#endif

#include "SinricPro.h"
#include "SinricProTemperaturesensor.h"
#include "DHT.h" // https://github.com/markruys/arduino-DHT

#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

#if defined(ESP8266)
  #define DHT_PIN    D1
#elif defined(ESP32)
  #define DHT_PIN    16
#endif

DHT dht;                                      // DHT sensor

float temperature;                            // actual temperature
float humidity;                               // actual humidity
float lastTemperature;                        // last known temperature (for compare)
float lastHumidity;                           // last known humidity (for compare)
   
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;
  
  temperature = dht.getTemperature();          // get actual temperature in °C
//  temperature = dht.getTemperature() * 1.8f + 32;  // get actual temperature in °F
  humidity = dht.getHumidity();                // get actual humidity

  if (isnan(temperature) || isnan(humidity)) { // reading failed... 
    Serial.printf("DHT reading failed!\r\n");  // print error message
    return;                                    // try again next time
  } 

  Serial.printf("Temperature: %2.1f Celsius\tHumidity: %2.1f%%\r\n", temperature, humidity);

  if (temperature == lastTemperature && humidity == lastHumidity) {
    Serial.printf("Temperature 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);  
}

// main setup function
void setup() {
  Serial.begin(BAUD_RATE); Serial.printf("\r\n\r\n");
  dht.setup(DHT_PIN);

  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

Diagramme über das Portal

Sinric Pro Portal Temperature Sensor

Alexa, Google Home und SmartThings

Sinric Pro Portal Temperature Sensor

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

Fehlerbehebung

  1. Fehler: no matching function for call to ‘DHT::DHT()’ oder error: ‘class DHT’ has no member named ‘getMinimumSamplingPeriod’

    Lösung: Stelle sicher, dass die richtige DHT-Bibliothek installiert ist. Dieses Beispiel wurde mit https://github.com/markruys/arduino-DHT erstellt. Entferne alle anderen DHT-Bibliotheken, die du zuvor eventuell installiert hast, z. B. https://github.com/adafruit/DHT-sensor-library

  2. Kompilierungsfehler: DHT.h: No such file or directory

    Lösung: Stelle sicher, dass die richtige DHT-Bibliothek installiert ist.

  3. Weitere Details findest du auf unserer Seite zur Fehlerbehebung.

Verwandte Tutorials

Dieses Dokument ist Open Source. Einen Tippfehler entdeckt? Bitte erstelle ein Issue