DS18B20 Temperatursensor mit ESP32 oder ESP8266 für Alexa (auch MAX31820, DS1822)

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. DS18B20 oder DS1822, DS1820, MAX31820, MAX31850 x 1.
  3. 4,7k Ohm Widerstand x 1
  4. Jumper-Kabel.

Kurze Einführung in den Temperatursensor

Der DS18B20 ist ein digitaler Temperatursensor, der über einen 1-Wire-Bus kommuniziert. Er wird gerne in vielen Anwendungen eingesetzt, unter anderem in der Heimautomatisierung, Umweltüberwachung und industriellen Automatisierung. Der DS18B20 misst den Widerstand eines Thermistors. Der Thermistor ist ein Halbleiterbauteil, dessen Widerstand sich mit der Temperatur ändert. Der DS18B20 hat einen integrierten 12-Bit-ADC, der den Widerstand des Thermistors in einen digitalen Wert umwandelt.

MAX31820, DS1822, DS1820 und MAX31850: sind sie mit dem DS18B20 kompatibel?

Ja. Diese Sensoren verwenden alle dasselbe 1-Wire-Protokoll und dieselbe DallasTemperature Bibliothek, sodass die Verdrahtung und der Code in diesem Tutorial ohne Änderungen funktionieren. Die Bibliothek erkennt das Sensormodell anhand seines 1-Wire Family Codes.

Sensor Family Code Auflösung Versorgungsspannung Hinweise
DS18B20 0x28 9 bis 12 Bit 3,0 V bis 5,5 V ±0,5 °C von −10 °C bis +85 °C
MAX31820 0x28 9 bis 12 Bit 3,0 V bis 3,7 V ±0,5 °C von +10 °C bis +45 °C. Gleicher Family Code wie der DS18B20
DS1822 0x22 9 bis 12 Bit 3,0 V bis 5,5 V Günstigere Variante, ±2 °C
DS1820 / DS18S20 0x10 9 Bit 3,0 V bis 5,5 V Feste Auflösung
MAX31850 0x3B 14 Bit 3,0 V bis 3,7 V Thermoelement-Wandler (Typ K) mit 1-Wire-Schnittstelle

MAX31820 und MAX31850: nur mit 3,3V verwenden. Ihre maximale Versorgungsspannung beträgt 3,7 V, also verbinde VDD mit dem 3,3V Pin des ESP32 oder ESP8266, nicht mit 5V.

Verdrahtung

Sinric Pro esp8266 DS18B20 wiring

Wenn du den DS18B20 verwendest, lege Pin 1 und 3 auf GND. Der mittlere Pin ist die Datenleitung ‘1-Wire’.

MCU GPIO Pin
ESP32 16
ESP8266 14 (D5)

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

#if defined(ESP8266)
  #define DS18B20_PIN    D5
#elif defined(ESP32)
  #define DS18B20_PIN    16
#endif

#include <OneWire.h>
#include <DallasTemperature.h> // Supports DS18B20 or DS1822, DS1820, MAX31820, MAX31850
 
OneWire oneWire(DS18B20_PIN);
DallasTemperature sensors(&oneWire);

void setup() {
  Serial.begin(115200);
  
  Serial.print("DallasTemperature Library version: ");
  Serial.println(DALLASTEMPLIBVERSION);

  sensors.begin();
}

void loop() {
  sensors.requestTemperatures(); 
  float temperatureC = sensors.getTempCByIndex(0);
  float temperatureF = sensors.getTempFByIndex(0);
  Serial.print(temperatureC);
  Serial.println("C");
  Serial.print(temperatureF);
  Serial.println("F");
  delay(2000);
}

Diesen Code auf GitHub Gist ansehen

Der Arduino IDE Serial Monitor zeigt die aktuelle Temperatur so an

Sinric Pro DS18B20 Temperature Sensor

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

Schritt 2.1 Sinric Pro Bibliothek installieren

Sinric Pro install SinricPro library

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

#if defined(ESP8266)
  #define DS18B20_PIN    D5
#elif defined(ESP32)
  #define DS18B20_PIN    16
#endif

#include "SinricPro.h"
#include "SinricProTemperaturesensor.h"
#include <OneWire.h>
#include <DallasTemperature.h> // https://github.com/milesburton/Arduino-Temperature-Control-Library

#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

OneWire oneWire(DS18B20_PIN);
DallasTemperature sensors(&oneWire);

float temperature;                            // actual temperature
float humidity;                               // actual humidity
float lastTemperature;                        // last known temperature (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;
  
  sensors.requestTemperatures(); 
  temperature = sensors.getTempCByIndex(0);
  //temperature = sensors.getTempFByIndex(0); // in °F

  Serial.printf("Temperature: %2.1f °C\r\n", temperature);

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

  if (temperature == lastTemperature) {
    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, -1); // 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  
}


// 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");
  
  Serial.print("DallasTemperature Library version: ");
  Serial.println(DALLASTEMPLIBVERSION);
  sensors.begin();

  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. Fehler: DallasTemperature.h: No such file or directory

    Lösung: Stelle sicher, dass die richtige Temperatur-Bibliothek installiert ist. https://github.com/milesburton/Arduino-Temperature-Control-Library

  2. Ungültige Messwerte wie -127.00C, -196.60F, -127.00C, -196.60F

    Lösung: Stelle sicher, dass du korrekt verdrahtet hast und keine lose Verbindung besteht.

    -127 ist der Wert von DEVICE_DISCONNECTED_C in der DallasTemperature Bibliothek. getTempCByIndex() gibt ihn zurück, wenn kein Sensor am 1-Wire-Bus antwortet. Prüfe Folgendes:

    • der 4,7k Ohm Pull-up-Widerstand ist zwischen Datenleitung und 3,3V angeschlossen
    • die Datenleitung liegt am im Sketch definierten GPIO
    • VDD und GND sind nicht vertauscht
    • ein MAX31820 oder MAX31850 wird mit 3,3V statt 5V versorgt

Sinric Pro App Temperature Sensor

  1. Weitere Details findest du auf unserer Seite Troubleshooting.

Verwandte Tutorials

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