Sensore di temperatura DS18B20 con ESP32 o ESP8266 per Alexa (anche MAX31820, DS1822)
In questa sezione realizziamo un sensore di temperatura usando ESP32, ESP8266 e poi visualizziamo la temperatura tramite Alexa, Google Home o SmartThings.
Prerequisiti :
- ESP32, ESP8266 x 1.
- DS18B20 oppure DS1822, DS1820, MAX31820, MAX31850 x 1.
- Resistenza da 4,7 kOhm x 1
- Cavetti jumper.
Breve introduzione al sensore di temperatura
Il DS18B20 è un sensore di temperatura digitale che comunica tramite bus 1-Wire. È una scelta molto diffusa per molte applicazioni, tra cui la domotica, il monitoraggio ambientale e l’automazione industriale. Il DS18B20 funziona misurando la resistenza di un termistore. Il termistore è un dispositivo a semiconduttore la cui resistenza varia con la temperatura. Il DS18B20 ha un ADC a 12 bit integrato che converte la resistenza del termistore in un valore digitale.
MAX31820, DS1822, DS1820 e MAX31850: sono compatibili con il DS18B20?
Sì. Questi sensori usano tutti lo stesso protocollo 1-Wire e la stessa libreria DallasTemperature, quindi il cablaggio e il codice di questo tutorial funzionano senza modifiche. La libreria rileva il modello del sensore dal suo codice di famiglia 1-Wire.
| Sensore | Codice famiglia | Risoluzione | Tensione di alimentazione | Note |
|---|---|---|---|---|
| DS18B20 | 0x28 | da 9 a 12 bit | da 3,0 V a 5,5 V | ±0,5 °C da −10 °C a +85 °C |
| MAX31820 | 0x28 | da 9 a 12 bit | da 3,0 V a 3,7 V | ±0,5 °C da +10 °C a +45 °C. Stesso codice famiglia del DS18B20 |
| DS1822 | 0x22 | da 9 a 12 bit | da 3,0 V a 5,5 V | Versione più economica, ±2 °C |
| DS1820 / DS18S20 | 0x10 | 9 bit | da 3,0 V a 5,5 V | Risoluzione fissa |
| MAX31850 | 0x3B | 14 bit | da 3,0 V a 3,7 V | Convertitore per termocoppia (tipo K) con interfaccia 1-Wire |
MAX31820 e MAX31850: usa solo 3,3V. La loro tensione massima di alimentazione è 3,7 V, quindi collega VDD al pin 3.3V dell’ESP32 o ESP8266, non ai 5V.
Cablaggio

Se usi il DS18B20, collega a terra i pin 1 e 3. Il pin centrale è la linea dati ‘1-wire’.
| MCU | Pin GPIO |
|---|---|
| ESP32 | 16 |
| ESP8266 | 14 (D5) |
Verifichiamo che il sensore di temperatura sia cablato correttamente e funzioni.
#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);
}
Vedi questo codice su GitHub Gist
Il Serial Monitor dell’Arduino IDE mostrerà la temperatura attuale così

Passo 1 : Crea un nuovo dispositivo in Sinric Pro
- Accedi al tuo account Sinric Pro, apri il menu Devices a sinistra e fai clic sul pulsante Add Device (in alto a sinistra).
- Inserisci il nome del dispositivo Temperature Sensor, la descrizione My Temperature Sensor e seleziona il tipo di dispositivo Temperature Sensor.

- Fai clic su Next nella scheda Notifications

Qui puoi impostare la soglia per ricevere una notifica push tramite l’app Sinric Pro quando la temperatura scende sotto o sale sopra un certo valore. Usa il Retrigger Time per impostare il ritardo tra le notifiche.
-
Fai clic sulla scheda Others e poi su Save
-
La schermata successiva mostra le credenziali necessarie per collegare il dispositivo appena creato.

- Copia Device Id, App Key e App Secret. Tieni questi valori al sicuro. NON CONDIVIDERLI SU FORUM PUBBLICI!
Passo 2 : Connettiti a Sinric Pro
Passo 2.1 Installa la libreria Sinric Pro

Puoi generare il codice usando la funzione Zero Code oppure scriverlo tu stesso. Se non hai esperienza di programmazione, ti consigliamo di usare la funzione Zero Code del Portale per generare il codice, scaricarlo e caricarlo sulla scheda.
2.2 Codice completo
#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();
}
Vedi questo codice su GitHub Gist
Ora dovresti riuscire a vedere la temperatura nell’app Sinric Pro

Nota che l’app Google Home mostra il sensore di temperatura come un termostato, per un limite di Google Home.
Risoluzione dei problemi
-
errore: DallasTemperature.h: No such file or directory
Soluzione: assicurati di avere installato la libreria di temperatura corretta. https://github.com/milesburton/Arduino-Temperature-Control-Library
-
Lettura di valori non validi come -127,00C, -196,60F, -127,00C, -196,60F
Soluzione: assicurati di aver cablato correttamente e che non ci siano contatti difettosi.
-127è il valore diDEVICE_DISCONNECTED_Cnella libreria DallasTemperature.getTempCByIndex()lo restituisce quando nessun sensore risponde sul bus 1-Wire. Verifica che:- la resistenza di pull-up da 4,7 kOhm sia collegata tra la linea dati e 3,3V
- la linea dati sia sul GPIO definito nello sketch
- VDD e GND non siano invertiti
- un MAX31820 o MAX31850 sia alimentato a 3,3V, non a 5V

- Per maggiori dettagli consulta la nostra pagina Risoluzione dei problemi.
Tutorial correlati
- Come controllare un ESP32 o ESP8266 con Alexa e Google Home
- Sensore di temperatura e umidità DHT11, DHT22, AM2302
- Sensore di temperatura e umidità BME280
- Sensore di temperatura BMP180
- Sensore di temperatura LM35, LM335 e LM34
Questo documento è open source. Hai trovato un errore? Crea una issue