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.
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
Firmware
Per comunicare con la sonda è necessario prima aggiungere all’IDE di Arduino le librerie DallasTemperature DS18B20.
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( "}" );
}
}
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