Mesura de la temperatura amb el sensor digital DS18B20

Un altre dels sensors que no he aconseguit connectar als telèfons i ordinadors a un preu raonable és el termòmetre. Però amb Arduino les possibilitats són moltes i aquí proposo una de les solucions que me sembla més interessant pel laboratori.

Bé és veritat que per a la major part d’experiments amb un termòmetre d’alcohol o un de digital amb sonda és més que suficient quan no necessitem més que mesurar la temperatura en moments puntuals. Però hi ha vegades, com quan es vol mesurar la temperatura al llarg del temps per estudiar con s’escalfa o refreda un recipient, per exemple (Escalfament i canvi d’estat de l’aigua, protocol alumnat i material per al professorat), que resulta molt interessant disposar d’un termòmetre que vagi agafant mesures a intervals regulars de temps i que aquestes dades es puguin analitzar després.

Si disposeu al centre d’un equip Multilog o similar, potser no cal que seguiu llegint aquesta entrada, ja que aquets equips tenen sondes de temperatura i permeten fer el que he comentat a dalt. Però si no en teniu, crec que el que explico a continuació us pot ser de gran utilitat.

Descriuré, doncs, com connectar la sonda impermeable de temperatura DS18B20 a una placa Wemos D1 R32 amb microprocessador esp32 i realitzar mesures de temperatura a intervals de temps.

Diferents sensors de temperatura

A més del sensor de temperatura DS18B20 que usarem en aquesta proposta hi ha d’altres sensors que també poden utilitzar-se, encara que crec que en inferioritat de condicions.

Un exemple és el cas del sensor de temperatura analògic LM35 que és molt barat (< 1 €) i fàcil d’usar ja que porta integrat un circuit digital que subministra un voltatge de sortida proporcional a la temperatura, de manera que 0 ºC aporten 0 mV i 100 ºC donen 1000 mV. El problema és que utilitza un encapsulat tipus TO-92 que no és impermeable i que no es pot submergir directament en aigua. De totes maneres és molt apreciat per mesurar la temperatura ambient. Podeu veure com s’ha de connectar i programar en Luis Llamas o en el web Física con Arduino de la professora Beatriz Padín Romero.

Un altre tipus de termòmetre molt utilitzat a la indústria és el termistor. Un termistor és un tipus de resistència el valor de la qual varia en funció de la temperatura d’una manera més acusada que en una resistència comuna. Té, per tant dos connexions sense polaritat.

Hi ha dos tipus de termistors, els que tenen un coeficient de temperatura negatiu (en anglès Negative Temperature Coefficient o NTC), els quals disminueixen la seva resistència a mesura que augmenta la temperatura, i els que tenen un coeficient de temperatura positiu (en anglès Positive Temperature Coefficient o PTC), en els quals la seva resistència augmenta a mesura que ho fa la temperatura. El termistors NTC són els que s’utilitzen com a sensors per mesurar la temperatura.

La dificultat de la seva utilització per a mesurar la temperatura és que la resistència no varia linealment amb la temperatura i és necessari introduir en el codi del projecte Arduino una fórmula amb coeficients que depenen del resistor en concret.

Aquests termistors NTC són els sensors més barats del mercat i es fabriquen amb diversos tipus d’encapsulat, encara que pel nostre interès bàsicament en dos: en tipus perla i en forma de càpsula impermeable.

El termistor NTC MF52 de valor nominal 10 kW té un encapsulat en forma de perla que pot anar bé per a mesurar la temperatura ambient (de -40 a 120 ºC). Podeu veure com utilitzar-lo en la web de Luis Llamas.

El termistor NTC 3950 també pot tenir un valor nominal de 10 kW però està encapsulat dins una funda metàl·lica impermeable, el que permet introduir-lo en líquids i estudiar, per exemple, com es refreda el cafè amb llet. El rang de temperatura que mesura va de -30 a 120 ºC. Les connexions amb Arduino són de la mateixa manera en tots els termistors com es pot comprovar mirant les indicacions que Instructables fan al respecte d’aquest sensor.

Per últim en aquest apartat comento el cas dels sensors múltiples, com és el cas del sensor digital de temperatura i humitat DHT11 (< 1 €), molt utilitzat en la construcció d’estacions meteorològiques. Té la gràcia que subministra també la humitat però no es pot submergir en una dissolució per a veure com varia la seva temperatura.

El sensor de temperatura que incorpora és un termistor que treballa en un rang de temperatures de 0 a 50 °C amb una precisió de ± 2 °C. Si es vol ampliar el rang de temperatures i/o la precisió es pot comprar el sensor DHT22, que és una mica més car (< 3 €).

Per a fer-lo funcionar es necessita incorporar una llibreria pròpia del sensor al codi del projecte com l’explica Luis Llamas.

El sensor de temperatura DS18B20

Aquí arribem al sensor digital de temperatura DS18B20, que per a mi és el més versàtil, i a un preu imbatible de dos euros. L’encapsulat de fabrica és tipus TO-92 com el del LM35, però la presentació comercial més utilitzada per robustesa i facilitat en el seu us és la de d’introduir el sensor dins d’un tub d’acer inoxidable resistent a l’aigua, que és la que faig servir.

El DS18B20 utilitza el protocol 1-Wire per comunicar-se. Aquest protocol necessita només un pin per enviar les dades i permet connectar més d’un sensor en el mateix bus. Això també fa que el sensor es pugui alimentar a través del pin de dades, però crec que es preferible fer-lo utilitzant la connexió directa del sensor a 3,3 o a 5 V.

Cada sensor té una adreça única de 64bits establerta de fàbrica que pot servir per identificar el dispositiu amb el qual s’està comunicant, ja que en un bus 1-wire pot existir més d’un dispositiu.

Algunes altres característiques de la sonda de temperatura DS18B20 són:

  • Carcassa d’acer inoxidable (6×50 mm) resistent a l’aigua i a la humitat
  • Alimentació de 3,0 V a 5,5 V
  • Rang de temperatura de -55 a +125 ºC
  • Imprecisió en la mesura de -10 a 85 ºC:  ±0,5 ºC
  • Imprecisió en la mesura de -55 a -10 ºC i de 85 a 125ºC: ±2 ºC
  • Resolució programable: 9-bit, 10-bit, 11-bit o 12-bit (default)

El color dels cables de sortida del meu termòmetre són el vermell (Vcc, entre 3 i 5 V), el groc (dades), i el negre (GND, terra). Altres termòmetres poden tenir de sortida tres cables amb els colors vermell (Vcc), groc i verd. En aquest cas tant el groc com el verd poden correspondre al bus de dades o a terra, i s’ha de provar.

Si voleu més informació sobre el sensor o la seva utilització podeu mirar-vos les entrades Tutorial sensor digital de temperatura DS18B20 de la web de Naylamp Mechatronics o DS18B20 sensor de temperatura para líquidos con Arduino de Luis del Valle en la web Programar es fácil, que són dues de les que m’han ajudat a mi, encara que amb buscar DS18B20 en internet surten milers de referències.

La connexió a la placa

La primera qüestió és que és molt difícil introduir els fils de coure dels cables de la sonda en els forades d’una placa de proves (protoboard), així que primer s’han d’empalmar (o millor soldar) a un cable pont (o Dupont), que és el que es punxarà a la placa.

Els cables es connectaran a la placa de proves com indica el circuit de la figura i la fotografia de sota.

Com es pot veure el cable vermell es connecta directament a la sortida de 5 V i no en mode paràsit al cable de dades.

S’ha de col·locar una resistència pull-up entre els cables de voltatge i de dades per a minimitzar valors erronis. El seu valor ha de ser de 4,7 kΩ ja que el nostre cable sempre serà més curt de 5 m. En la fotografia s’aprecia que no hi ha una, sinó dues resistències de 10 kΩ, ja que no en tenia de 4,7 i en ficar les dues resistències en paral·lel s’obté una de 5 kΩ.

La placa que apareix a l’esquema i la fotografia és la Wemos D1 R32, que incorpora el microprocessador esp32, per la qual cosa s’han d’instal·lar els controladors de l’esp32 si no l’estan encara. Per instal·lar-los s’ha d’anar a l’IDE de Arduino i en Archivo/Preferencias, a la pestanya d’Ajustes s’enganxa la direcció https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json en el Gestor de URLs Adicionales de Tarjetas.

Després a Herramientas/Placa/Gestor de tarjetas apareixerà esp32 by Espressif Systems. Es pitja en More info y després en el botó Instalar. Trigarà una mica mentre indica Descargardo definiciones de tarjetas.

Quan s’hagi descarregat se busca la placa en Herramientas/Placa, es selecciona DOIT ESP32 DEVKIT V1 i ja està preparat l’IDE per a funcionar amb la tarja Wemos D1 R32. També funciona la placa si es selecciona el mòdul ESP 32 Dev.

El projecte

Donat que el sensor DS18B20 utilitza el protocol 1-Wire s’ha d’instal·lar la llibreria OneWire, i també la llibreria DallasTemperature pròpia del sensor i necesaria per a fer-lo funcionar. La forma més fàcil és a través del propi IDE d’Arduino. En Programa/Incluir libreria/ es va a Administrar bibliotecas, i allí s’escriu Onewire i s’instal·la OneWire by Jim Studt. Despés s’escriu dallastemperature i s’instal·la DallasTemperature by Miles Burton, i ja està.

Imatges del web Programar fácil https://programarfacil.com/blog/arduino-blog/ds18b20-sensor-temperatura-arduino/

Com volem aprofitar que el microprocesador esp32 té connexió bluetooth i visualitzar i recollir les dades de distància tant a l’ordinador gràcies al cable USB, com en un dispositiu mòbil per bluetooth, s’ha d’incorporar al codi del projecte una llibreria que gestioni el port sèrie bluetooth, com és BluetoothSerial.h, que la podeu descarregar d’aquí (BluetoothSerial.zip) i instal·lar-la a l’IDE d’Arduino en Programa/Incluir libreria/Añadir biblioteca .ZIP.

Una vegada instal·lades les llibreries es connecta la placa Wemos D1 R32 a l’ordinador i es carrega el projecte sketch_Una_sonda_DS18B20.ino, o bé es copia i enganxa en l’IDE el codi següent:

//Medida de la temperatura con la sonda de temperatura digital DS18B20
//en una placa Wemos D1 R32 con microprocesador esp32, que dispone de Bluetooth
//Se ha de seleccionar la placa DOIT ESP32 DEVKIT V1
//Se pueden visualizar los valores de temperatura en un monitor sèrie en el ordenador
//como es el propio del IDE de arduino o en otro como RealTerm, https://sourceforge.net/projects/realterm/
//Se pueden visualizar los valores de temperatura en un dispositivo mòbil 
//con una app de monitor sèrie como Serial Bluetooth Terminal para Android
//https://play.google.com/store/apps/details?id=de.kai_morich.serial_bluetooth_terminal&hl=ca
// o a la app HM10 Bluetooth Serial Lite para iOS
//https://apps.apple.com/us/app/hm10-bluetooth-serial-lite/id1030454675

#include <OneWire.h>                
#include <DallasTemperature.h>
#include "BluetoothSerial.h" //Se carga la libreria del Bluetooth
BluetoothSerial SerialBT;
 
OneWire ourWire(26);                //Se establece el pin 26 como bus OneWire
DallasTemperature sensors(&ourWire); //Se declara una variable u objeto para nuestro sensor
float tiempo; // Se define el tiempo como numero con decimales
float tiempoSegundos; // Se define el tiempo en segundos como número con decimales

void setup() 
{
delay(1000);
Serial.begin(9600);
SerialBT.begin("Wemos1"); //Se inicia el Bluetooth con el nombre Wemos1
sensors.begin();   //Se inicia el sensor
tiempo = millis(); //mide el tiempo en milisegundos desde que se pone en marcha Arduino
}
 
void loop() 
{
sensors.requestTemperatures();   //Se envía el comando para leer la temperatura
float temp= sensors.getTempCByIndex(0); //Se obtiene la temperatura en ºC

tiempo = millis(); //Actualiza el tiempo actual
tiempoSegundos = tiempo/1000; //cambia los milisegundos a segundos

//Ver tiempo y Temperatura por el monitor serie del ordenador
Serial.print("Tiempo= "); //Se imprime Tiempo
           //Se puede prescindir si se van a tratar posteriormente la temperatura en función del tiempo
Serial.print(tiempoSegundos,1); //Escribe el tiempo en segundos con un decimal
Serial.print("s"); //Añade s, de segundos, al valor numérico. 
           //Mejor no ponerlo si se quieren tratar después los datos
Serial.print("; ");  //Separa los valores con un punto y coma
Serial.print("Temperatura= "); //Se imprime Temperatura
           //Se puede prescindir si se van a tratar posteriormente la temperatura en función del tiempo
Serial.print(temp); // Envia el valor de la temperatura
Serial.println(" C"); //Indica que es en grados centígrados
           //Mejor no ponerlo si se quieren tratar después los datos
           
Serial.println();

//Ver tiempo y Temperatura por Bluetooth en el móvil
SerialBT.print("Tiempo= "); //Se imprime Tiempo
           //Se puede prescindir si se van a tratar posteriormente la temperatura en función del tiempo
SerialBT.print(tiempoSegundos,1); //Escribe el tiempo en segundos con un decimal
SerialBT.print("s"); //Añade s, de segundos, al valor numérico. 
           //Mejor no ponerlo si se quieren tratar después los datos
SerialBT.print("; "); //Separa los valores con un punto y coma
SerialBT.print("Temperatura= "); //Se imprime Temperatura
           //Se puede prescindir si se van a tratar posteriormente la temperatura en función del tiempo
SerialBT.print(temp); //Escribe la temperatura en ºC
SerialBT.println(" C"); //Indica que es en grados centígrados
           //Mejor no ponerlo si se quieren tratar después los datos

SerialBT.println();

delay(10000);   //Tiempo entre medidas de 10 s                  
}

El projecte carregat permet veure les dades tant per un monitor sèrie a l’ordinador com al mòbil per bluetooth. S’ha programat un temps de 10 s entre mesures però es pot canviar com es vulgui només modificant l’últim delay.

Per defecte apareixeran el monitor les paraules temps, temperatura i les unitats. Si no es vol que apareguin ja que es volen tractar les dades posteriorment en un full de càlcul o en un programa de tractament gràfic de dades només s’han de col·locar dues barres inclinades davant el que no es vulgui que aparegui al monitor.

El signe decimal per defecte en el codi d’Arduino és el punt (notació americana) i no la coma (notació europea), així que per a que el programari en català o castellà pel tractament de dades reconegui els valors com a números és possible que hagueu de fer la substitució del punt per la coma (es pot fer automàticament amb l’opció substituir de qualsevol processador de textos). És per això que la separació de dades en el codi es fa mitjançant el punt i coma.

La mesura de la temperatura

Una vegada carregat el projecte en la placa Wemos ja es poden realitzar mesures de temps i temperatura. Podem recollir els valors a l’ordinador mitjançant un monitor sèrie com Realterm si la placa continua connectada, o en el telèfon mòbil amb una aplicació de monitor sèrie com és Serial Bluetooth Terminal per Android o HM10 Bluetooth Serial Lite per iOS, encara que la placa no estigui connectada a l’ordinador.

Una vegada pujat el projecte a la placa aquesta pot ser autònoma i prescindir de la placa de proves i de la connexió a l’ordinador si es subministra corrent amb un carregador de mòbil (PowerBank) i un cable micro USB, per exemple, com es veu a la fotografia de sota.

Altres opcions

Si es vol estudiar com es refreda un recipient en funció del seu aïllament, per exemple, podria ser d’interès el disposar de varis recipients, cadascú amb la seva sonda de temperatura, per tal de poder comparar la variació de temperatures que es produeix en funció del temps segons el revestiment. Per a fer això no cal tenir diferents plaques cadascuna amb el seu termòmetre, sinó que es poden connectar varis termòmetres a la mateixa placa i obtenir els valors de la temperatura al mateix temps.

En aquest cas les connexions (per a dos termòmetres, encara que es poden afegir més) s’haurien de fer com es mostra en el dibuix de sota i el codi hauria de ser el d’aquest arxiu sketch_Dos_sondas_DS18B20.ino, que es mostra més avall.

//Medida de las temperaturas con dos sondas de temperatura digital DS18B20
//en una placa Wemos D1 R32 con microprocesador esp32, que dispone de Bluetooth
//Se ha de seleccionar la placa DOIT ESP32 DEVKIT V1
//Se pueden visualizar los valores de temperatura en un monitor sèrie en el ordenador
//como es el propio del IDE de arduino o en otro como RealTerm, https://sourceforge.net/projects/realterm/
//Se pueden visualizar los valores de temperatura en un dispositivo mòbil 
//con una app de monitor sèrie como Serial Bluetooth Terminal para Android
//https://play.google.com/store/apps/details?id=de.kai_morich.serial_bluetooth_terminal&hl=ca
// o a la app HM10 Bluetooth Serial Lite para iOS
//https://apps.apple.com/us/app/hm10-bluetooth-serial-lite/id1030454675

#include <OneWire.h>                
#include <DallasTemperature.h>
#include "BluetoothSerial.h" //Se carga la libreria del Bluetooth
BluetoothSerial SerialBT;
  
OneWire ourWire1(26);                //Se establece el pin 26  como bus OneWire
OneWire ourWire2(25);                //Se establece el pin 25  como bus OneWire
 
DallasTemperature sensors1(&ourWire1); //Se declara una variable u objeto para nuestro sensor1
DallasTemperature sensors2(&ourWire2); //Se declara una variable u objeto para nuestro sensor2

float tiempo; // Se define el tiempo como numero con decimales
float tiempoSegundos; // Se define el tiempo en segundos como número con decimales

void setup() 
{
delay(1000);
Serial.begin(9600);
SerialBT.begin("Wemos1"); //Se inicia el Bluetooth con el nombre Wemos1
sensors1.begin();   //Se inicia el sensor 1
sensors2.begin();   //Se inicia el sensor 2
tiempo = millis(); //mide el tiempo en milisegundos desde que se pone en marcha Arduino
}
 
void loop() 
{
sensors1.requestTemperatures();   //Se envía el comando para leer la temperatura
float temp1= sensors1.getTempCByIndex(0); //Se obtiene la temperatura en ºC del sensor 1

sensors2.requestTemperatures();   //Se envía el comando para leer la temperatura
float temp2= sensors2.getTempCByIndex(0); //Se obtiene la temperatura en ºC del sensor 2

tiempo = millis(); //Actualiza el tiempo actual
tiempoSegundos = tiempo/1000; //cambia los milisegundos a segundos

//Ver tiempo y Temperatura por el monitor serie del ordenador
Serial.print(tiempoSegundos,1); //Escribe el tiempo en segundos con un decimal
Serial.print("s"); //Añade s, de segundos, al valor numérico. 
           //Mejor no ponerlo si se quieren tratar después los datos
Serial.print("; ");  //Separa los valores con un punto y coma
Serial.print("Temperatura 1 = "); //Se imprime Temperatura 1
           //Se puede prescindir si se van a tratar posteriormente la temperatura en función del tiempo
Serial.print(temp1); // Envia el valor de la temperatura 1
Serial.print(" C"); //Indica que es en grados centígrados. 
           //Se puede prescindir si se van a tratar posteriormente la temperatura en función del tiempo
Serial.print("; ");  //Separa los valores con un punto y coma
Serial.print("   Temperatura 2 = "); //Se imprime Temperatura 2
           //Se puede prescindir si se van a tratar posteriormente la temperatura en función del tiempo
Serial.print(temp2); // Envia el valor de la temperatura 2
Serial.println(" C"); //Indica que es en grados centígrados. 
           //Se puede prescindir si se van a tratar posteriormente la temperatura en función del tiempo

//Ver tiempo y Temperatura por Bluetooth en el móvil
SerialBT.print(tiempoSegundos,1); //Escribe el tiempo en segundos con un decimal
SerialBT.print("s"); //Añade s, de segundos, al valor numérico. 
           //Mejor no ponerlo si se quieren tratar después los datos
SerialBT.print("; ");  //Separa los valores con un punto y coma
SerialBT.print("Temperatura 1 = "); //Se imprime Temperatura 1
           //Se puede prescindir si se van a tratar posteriormente la temperatura en función del tiempo
SerialBT.print(temp1); // Envia el valor de la temperatura 1
SerialBT.print(" C"); //Indica que es en grados centígrados. 
           //Se puede prescindir si se van a tratar posteriormente la temperatura en función del tiempo
SerialBT.print("; ");  //Separa los valores con un punto y coma
SerialBT.print(" Temperatura 2 = "); //Se imprime Temperatura 2
           //Se puede prescindir si se van a tratar posteriormente la temperatura en función del tiempo
SerialBT.print(temp2); // Envia el valor de la temperatura 2
SerialBT.println(" C"); //Indica que es en grados centígrados. 
           //Se puede prescindir si se van a tratar posteriormente la temperatura en función del tiempo

delay(10000);                     
}


Hi ha un comentari

Deixa un comentari

Fill in your details below or click an icon to log in:

WordPress.com Logo

Esteu comentant fent servir el compte WordPress.com. Log Out /  Canvia )

Twitter picture

Esteu comentant fent servir el compte Twitter. Log Out /  Canvia )

Facebook photo

Esteu comentant fent servir el compte Facebook. Log Out /  Canvia )

S'està connectant a %s

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.