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 :
- ESP32, ESP8266 x 1.
- DS18B20 oder DS1822, DS1820, MAX31820, MAX31850 x 1.
- 4,7k Ohm Widerstand x 1
- 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

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

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
Schritt 2.1 Sinric Pro Bibliothek installieren

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

Bitte beachte, dass die Google Home App den Temperatursensor aufgrund von Einschränkungen von Google Home als Thermostat anzeigt.
Fehlerbehebung
-
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
-
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.
-127ist der Wert vonDEVICE_DISCONNECTED_Cin 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

- Weitere Details findest du auf unserer Seite Troubleshooting.
Verwandte Tutorials
- ESP32 oder ESP8266 mit Alexa und Google Home steuern
- DHT11, DHT22, AM2302 Temperatur- und Feuchtigkeitssensor
- BME280 Temperatur- und Feuchtigkeitssensor
- BMP180 Temperatursensor
- LM35, LM335 und LM34 Temperatursensor
This document is open source. See a typo? Please create an issue