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 :

  1. ESP32, ESP8266 x 1.
  2. DS18B20 oppure DS1822, DS1820, MAX31820, MAX31850 x 1.
  3. Resistenza da 4,7 kOhm x 1
  4. 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

Sinric Pro esp8266 DS18B20 wiring

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ì

Sinric Pro DS18B20 Temperature Sensor

Passo 1 : Crea un nuovo dispositivo in Sinric Pro

Sinric Pro create device alexa

Sinric Pro temperature sensor device 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.

Sinric Pro copy device id

Passo 2 : Connettiti a Sinric Pro

Passo 2.1 Installa la libreria Sinric Pro

Sinric Pro install SinricPro library

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

Sinric Pro App Temperature Sensor

Nota che l’app Google Home mostra il sensore di temperatura come un termostato, per un limite di Google Home.

Risoluzione dei problemi

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

  2. 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 di DEVICE_DISCONNECTED_C nella 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

Sinric Pro App Temperature Sensor

  1. Per maggiori dettagli consulta la nostra pagina Risoluzione dei problemi.

Tutorial correlati

Questo documento è open source. Hai trovato un errore? Crea una issue