Sensore di temperatura con DS18B20 e Arduino ESP8266

Vediamo come utilizzare una sonda di temperatura DS18B20 con una ESP8266 WeMos D1 R1. La stessa procedura e codice è utilizzabile e compatibile con qualsiasi scheda Arduino.

Schermata-2019-07-07-alle-15.24.00-1024x983 Sensore di temperatura con DS18B20 e Arduino ESP8266
Il DS18B20 è un trasduttore, una sonda termica che lavora ad una tensione di 3.0/5.5 V per misurare temperature nei range -55 C ~ + 125 C (-67 ‘F ~ + 257’ F) con accuratezza Acc ±0.5°C

Ho scelto questa sonda per due motivi:

  • E’ facilissima da utilizzare grazie al sistema 1-Wire® che prevede un solo filo da collegare (oltre l’alimentazione chiaramente)
  • Utilizza un sistema a bus per cui ogni sonda ha un indirizzamento a 64bit permettendomi così di collegarne quante ne voglio e poi andare a leggere in valore semplicemente richiamandolo dal firmware

Collegamenti elettrici

dallas-DS1820B-sonda-temperatura-1024x424 Sensore di temperatura con DS18B20 e Arduino ESP8266
Schermata-2019-07-07-alle-17.55.12-1024x682 Sensore di temperatura con DS18B20 e Arduino ESP8266
I collegamenti: ho collegato il bus dati al pin D4 dell’ESP8266, VCC al pin 5V e Ground al pin G

Firmware

Per comunicare con la sonda è necessario prima aggiungere all’IDE di Arduino le librerie DallasTemperature DS18B20.

image-2-1024x631 Sensore di temperatura con DS18B20 e Arduino ESP8266
Non tratterò l’argomento ma per chi vuole sapere come aggiungere una libreria o una scheda all’IDE di Arduino in rete ci sono tantissimi articoli che ne parlano in modo esaustivo.
image-1-1024x676 Sensore di temperatura con DS18B20 e Arduino ESP8266

Proprio per il “secondo motivo” per cui ho scelto questa sonda, preferisco accedere alle letture per indirizzamento anche se le librerie permettono anche un’accesso per “posizione” delle sonde presenti che in questo caso poteva anche andare bene.

sensors.getTempCByIndex(0)

Non conoscendo l’indirizzo della sonda che ho collegato, la prima cosa da fare è proprio scrivere una funzione per effettuare una scansione sul bus e recuperare tutte le sonde trovate (che in questo caso sarà una).

void DS18B20_scan(void) {
  byte i, c;
  byte addr[8];

  Serial.println( "Ricerca Sonde DS18B20:" );
       
  for (c = 1; c <= 8; c++) {
    if (!oneWire.search(addr)) {
      snprintf (mybuffer, 50, "Trovate %i sonde", c-1 );
      Serial.println(mybuffer);
      oneWire.reset_search();
      delay(250);
      return;
    }
    Serial.print(" ROM ");
    Serial.print(c);
    Serial.print(" = { ");
    for (i = 0; i < 8; i++) {
      Serial.print("0");
      Serial.write('0x');
      Serial.print(addr[i], HEX);
      if( i < 7 ){
        Serial.print(", ");
      }else{
        Serial.print(" ");
      }
    }
    Serial.println( "}" );
  }
}
#include <OneWire.h>
#include <DallasTemperature.h>

#define ONE_WIRE_BUS 2 // D4 WeMos D1 R1

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

// modificare l'address della sonda ricavandolo con la funzione DS18B20_scan()
DeviceAddress sensor0 = { 0x28, 0xA5, 0x55, 0x45, 0x92, 0xA, 0x2, 0xB3 };

float S0=0;
char mybuffer[128];

void loop(void) {
  sensors.requestTemperatures();

  S0=sensors.getTempC(sensor0);

  Serial.println( S0 );
  delay(1000);  

}

void setup(void) {
  Serial.begin(9600);
  DS18B20_scan();
}  

void DS18B20_scan(void) {
  byte i, c;
  byte addr[8];

  Serial.println( "Ricerca Sonde DS18B20:" );
       
  for (c = 1; c <= 8; c++) {
    if (!oneWire.search(addr)) {
      snprintf (mybuffer, 50, "Trovate %i sonde", c-1 );
      Serial.println(mybuffer);
      oneWire.reset_search();
      delay(250);
      return;
    }
    Serial.print(" ROM ");
    Serial.print(c);
    Serial.print(" = { ");
    for (i = 0; i < 8; i++) {
      Serial.print("0");
      Serial.write('0x');
      Serial.print(addr[i], HEX);
      if( i < 7 ){
        Serial.print(", ");
      }else{
        Serial.print(" ");
      }
    }
    Serial.println( "}" );
  }
}
confronto-temperatura-con-ds18b20-e-un-termometro-ikea-1024x744 Sensore di temperatura con DS18B20 e Arduino ESP8266
Confronto lettura con il DS18B20 e un termometro Ikea
image-3-1024x614 Sensore di temperatura con DS18B20 e Arduino ESP8266
Ed ecco finalmente la lettura della sonda DS18B20 con una precisione a due decimali.

Conlusioni

Con pochissimo tempo e poche righe di codice possiamo effettuare delle accurate misure di temperatura come ad esempio di caldaie, tubi, o anche ambientale. La flessibilità di questa sonda la rende la mia preferita specialmente in ambienti a “contatto” come la rilevazione di temperatura di pannelli solari, boiler acqua, etc.

Anche se questo sistema è utilizzabile su qualsiasi scheda Arduino, ho utilizzato una ESP8266 semplicemente perchè con l’aggiunta di poche righe di codice potrò inviare le letture direttamente ad un server come Home Assistant, Raspberry PI, etc, rendendolo ancora più potente e flessibile, ma questo lo vedremo in un’altro articolo dove aggiungeremo proprio l’invio delle letture ad un server utilizzando il famosissimo protocollo di telemetria MQTT (Message Queue Telemetry Transport).

Lista del materiale utilizzato

Share this content: