Alberto E. Villalobos Chaves
aewolframio@gmail.com
Figura 4: Montaje del sensor de temperatura DS18B20 (N), circuito divisor de corriente (resistencia 4K7 ohm) y conexión al puerto digital 13 del Arduino Uno utilizado para averiguar el nombre del sensor
Introducción:
Cuando una sustancia sólida, se somete a calentamiento por el concurso de una fuente externa de calor, la temperatura de la misma empieza a aumentar a una velocidad determinada por la fuente de calentamiento.
A mayor calentamiento mayor temperatura, pero cuando nos acercamos al punto en el cual se pasa de sólido a líquido, esto es el punto de fusión, la temperatura de la sustancia no se incrementa ya a la misma velocidad con que lo hace la fuente externa de calentamiento, esto es debido a que la energía de calentamiento es utilizada en separar las moléculas del sólido para pasarlas a un estado de mayor movilidad, o sea al estado líquido, esto se llama cambio de fase.
Cuando el sólido se ha fundido completamente de nuevo su temperatura aumenta a la misma velocidad con que lo hace la fuente de calentamiento.
Si graficamos el aumento de temperatura de la sustancia en estudio, digamos una sustancia cérea, vs el tiempo de calentamiento obtendremos algo similar a lo mostrado en la Figura 1 en donde se aprecia un aumento casi lineal de la temperatura de la muestra (calentamiento constante) con un ligero desvío hacia abajo en la región entre los 48 y 54ºC aproximadamente debido a que en esa zona la sustancia fundió.
Figura 1: Curva de aumento de la temperatura de una sustancia cérea al ser calentada a una velocidad de calentamiento constante.
Como se ve, la variación de temperatura debida a la fusión no es muy notable, no obstante si a la vez que calentamos la muestra calentamos también una sustancia que ya se encuentre en estado líquido y que no sufra ningún cambio en la zona de temperaturas en las que se va a estudiar la muestra (sustancia de referencia) y procedemos a restar a la temperatura medida a la muestra la temperatura medida a la referencia el panorama cambia completamente, como vemos en la Figura 2 para la misma sustancia cérea mencionada anteriormente.
Figura 2: Curva de aumento de la temperatura de una sustancia cérea respecto a una sustancia de referencia inerte (parafìna líquida) al ser calentada a una velocidad de calentamiento constante.
Este tipo de análisis físico es conocido como Análisis Térmico Diferencial y las curvas mostradas fueron realizadas utilizando dos sensores de temperatura, un Arduino y un poco de programación con Processing, procedimiento que se explicará a continuación (ver actualización de este procedimiento utilizando aplicación celular PhyPhox).
Materiales:
1- Arduino Uno
2- Protoboard con puentes de conexión
3- Sensores de Temperatura DS18B20 (2 unidades)
4- Resistencia 4K7 ohm (1 unidad)
5- Muestras de productos céreos o grasos
6- Parafìna líquida
Programas y Librerías:
2- Dallas DS18b20 (librería para Arduino)
3- OneWire (librería para Arduino)
3- G4P V3.5.2 (librería para Processing)
4- G4PTool v2.5 (herramienta para Processing)
Procedimiento:
En este trabajo se deben medir temperaturas con la mayor resolución y precisión posibles por lo que se utilizaron sensores de temperatura DS18B20 (Figura 3) cuya resolución es ajustable entre 9 y 12 bytes con una presición de 0.5ºC de -10 a 85ºC y con un rango de temperaturas de -55ºC a 125ºC.
Figura 3: Sensor de Temperatura DS18B20
Estos sensores de temperatura funcionan con tecnología OneWire lo que significa que se puede conectar varios sensores a un mismo puerto digital ya que cada sensor tiene un código de fábrica (p.e. 0x28 0x8A 0xB1 0x40 0x04 0x00 0x00 0xC7) que le permite al Arduino reconocer la lectura que hace cada sensor independientemente.
Lo anterior es muy ventajoso pues permite ahorrar puertos digitales, sobre todo cuando el proyecto requiere múltiples sensores.
Para averiguar el nombre de cada sensor de temperatura se montó la configuración que se muestra en la Figura 4.
Se procedió luego a cargar y correr el siguiente código en el Arduino:
Averiguar_Nombre_del_Sensor_DS18B20_2.ino
//Incluimos las librerias que hemos decargado previamente
#include <OneWire.h>
#include <DallasTemperature.h>
//El ejemplo se realiza con Arduino Uno, conectando el pin de datos digital 13
#define ONE_WIRE_BUS 13
OneWire oneWire(ONE_WIRE_BUS); // Creamos el objeto oneWire indicando el pin utilizado para comunicar con cualquier dispositivo OneWire
DallasTemperature sensores(&oneWire); // Asociamos nuestra referencia oneWire a un sensor de Dallas
DeviceAddress Sensor; // Array donde almacenamos la direccion del sensor DS18B20
void setup(void)
{
Serial.begin(9600); //Iniciamos la comunicacion serie
Serial.println("Direccion Sensor DS18B20:");
sensores.begin(); //Iniciamos los sensores
//Obtenemos la direccion del sensor de temperatura
if (!sensores.getAddress(Sensor, 0))
//Si no es posible determinar la direccion nos da un mensaje de error
Serial.println("Imposible encontrar direccion del sensor.");
}
//Creamos la funciona Mostrar_Direccion
void Mostrar_Direccion(DeviceAddress direccion)
{
//Definimos la amplitud de la direccion del sensor: 8 bits.
//El sensor envia dos tipos de datos, una lectura de hasta 12 bits y una direccion de 8 bits relevantes
for (uint8_t i = 0; i < 8; i++)
{
//Le indicamos que añada "0x" antes de cada grupo de digitos que forman la direccion.
//Si no usamos esta instruccion luego habrá que añadir "0x" a mano para usarla en el siguiente sketch.
Serial.print("0x");
if (direccion[i] < 16) Serial.print("0");
Serial.print(direccion[i], HEX);//Usamos formato Hexadecimal
}
}
void loop(void)
{
//Muestra la direccion del sensor
Serial.print("Direccion del sensor: ");
Mostrar_Direccion(Sensor);
Serial.println();
delay(5000);
}
//Incluimos las librerias que hemos decargado previamente
#include <OneWire.h>
#include <DallasTemperature.h>
//El ejemplo se realiza con Arduino Uno, conectando el pin de datos digital 13
#define ONE_WIRE_BUS 13
OneWire oneWire(ONE_WIRE_BUS); // Creamos el objeto oneWire indicando el pin utilizado para comunicar con cualquier dispositivo OneWire
DallasTemperature sensores(&oneWire); // Asociamos nuestra referencia oneWire a un sensor de Dallas
DeviceAddress Sensor; // Array donde almacenamos la direccion del sensor DS18B20
void setup(void)
{
Serial.begin(9600); //Iniciamos la comunicacion serie
Serial.println("Direccion Sensor DS18B20:");
sensores.begin(); //Iniciamos los sensores
//Obtenemos la direccion del sensor de temperatura
if (!sensores.getAddress(Sensor, 0))
//Si no es posible determinar la direccion nos da un mensaje de error
Serial.println("Imposible encontrar direccion del sensor.");
}
//Creamos la funciona Mostrar_Direccion
void Mostrar_Direccion(DeviceAddress direccion)
{
//Definimos la amplitud de la direccion del sensor: 8 bits.
//El sensor envia dos tipos de datos, una lectura de hasta 12 bits y una direccion de 8 bits relevantes
for (uint8_t i = 0; i < 8; i++)
{
//Le indicamos que añada "0x" antes de cada grupo de digitos que forman la direccion.
//Si no usamos esta instruccion luego habrá que añadir "0x" a mano para usarla en el siguiente sketch.
Serial.print("0x");
if (direccion[i] < 16) Serial.print("0");
Serial.print(direccion[i], HEX);//Usamos formato Hexadecimal
}
}
void loop(void)
{
//Muestra la direccion del sensor
Serial.print("Direccion del sensor: ");
Mostrar_Direccion(Sensor);
Serial.println();
delay(5000);
}
Conociendo los nombre de los sensores se montó la configuración que se muestra en la Figura 5 y se cargó y corrió en el Arduino el siguiente código:
Leer2SensoresUnSoloPuerto3.ino
/*
*************************************************************************************
* Leer2SensoresUnSoloPuerto3.ino *
* Leer 2 sensores de temperatura DS18B20 desde un mismo puerto analógico *
* @Alberto Villalobos *
* http://hombrosdegigantes.blogspot.com *
* Creado 15/2/2016 *
* Versión de Arduino 1.0.1 *
* Adaptado del "Tutorial Arduino IV: Sensor de Temperatura DS18B20" *
* del blog Cetronic - Componentes Eléctricos *
* http://cetroniconline.blogspot.com/2014/07/tutorial-arduino-iv-sensor-de.html?m=1 *
*************************************************************************************
=====================================================================================
Utiliza las librerías OneWire.h y DallasTemperature.h para el control del sensor de
temperatura DS18B20
=====================================================================================
*/
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 13
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensores(&oneWire);
// ***** Indicamos las direcciones de los sensores *****
DeviceAddress S1 = {0x28,0xFF,0x2E,0x90,0x64,0x15,0x02,0x67}; //Sensor Izquierdo (mas cerca del puerto usb)
DeviceAddress S2 = {0x28,0xFF,0x68,0xDD,0x64,0x15,0x02,0x6F}; //Sensor Derecho (mas alejado del puerto usb)
void setup(void)
{
Serial.begin(115200); //Abrimos la comunicación por serial
sensores.begin(); //Iniciamos los sensores
}
void loop(void)
{
sensores.requestTemperatures(); //Enviamos el comando para obtener los datos de los sensores
float TempSensor1 = sensores.getTempC(S1);
float TempSensor2 = sensores.getTempC(S2);
// ***** Establecemos la resolucion para cada sensor *****
//Resolucion a 9 bits 0.50 ºC
//Resolucion a 10 bits 0.25 ºC
//Resolucion a 11 bits 0.125 ºC
//Resolucion a 12 bits 0.0625 ºC
sensores.setResolution(S1,12); //Resolucion a 9 bits 0.50 ºC
sensores.setResolution(S2,12); //Resolucion a 10 bits 0.25 ºC
Serial.print(TempSensor1);Serial.print(",");Serial.print(TempSensor2);Serial.print(",");Serial.println(TempSensor2-TempSensor1);
delay(152);
}
Figura 5: Montaje de los dos sensores de temperatura DS18B20 (N), circuito divisor de corriente (resistencia 4K7 ohm) y conexión al puero digital 13 del Arduino Uno (uso de un solo puerto para conectar dos sensores utilizando tecnología Onewire)
Una vez cargado este código se conectó el Arduino a la computadora y se corrió una interfaz gráfica de usuario (GUI) Programada con Processing y G4P a la cual se le dio el nombre ATDuino 1.0 que está disponible para su descarga y contiene los códigos mencionados anteriormente.
Figura 6: Interfaz gráfica de usuario (GUI) del programa ATDuino 1.0 creada utilizando Processing 2.0.8b y las librerías
El equipo completo es como se muestra en las Figura 7 y 8 en donde se ve como la muestra a analizar y la sustancia de referencia (parafína líquida) están contenidas en tubos de ensayo, estos están colocados en un bloque de aluminio que es calentado por una plantilla calentadora (equipo concebido para otro fin). Los sensores, que están sumergidos en muestra y sustancia de referencia, se conectan al Arduino y este a la computadora que está corriendo el GUI ATDuino 1.0.
Figura 7: Montaje del calentador de la muestra y referencia, Arduino y computadora
Figura 8: Detalle del dispositivo calentador así como de la disposición de la muestra y la referencia
La interfaz ATDuino 1.0 nos muestra los valores puntuales de las temperaturas medidas por los sensores en la muestra y la referencia. Nos permite además graficar estas temperaturas así como la diferencia de estos dos valores.
Los gráficos pueden ser manipulados en tiempo real y los resultados, una vez terminada la medición son salvados en formato xls.
Conclusión:
Se ha construido un aparato de bajo costo que permite hacer Análisis Térmico Diferencial utilizando un microprocesador Arduino y sensores de temperatura sumergibles de bajo costo capaces de medir en el rango de -55ºC hasta 125ºC lo que abre un gran número de posibilidades al estudio simplificado del comportamiento térmico de muchas sustancias.
Referencias:
Versiones del GUI ATDuino 1.0:
1-ATDuino 1.0_Versión ejecutable.
2-ATDuino 1.0_Código.
Proyecto presentado en el Genuino Day 2016 - Costa Rica (ver video a partir del minuto 12:04)