DS18B20: Sensor de Temperatura para Líquidos
Introducción
Con esta guía rápida, usted aprenderá como configurar un sensor de temperatura para líquidos DS18B20 con Arduino.
¿Qué es un sensor de temperatura de líquidos?
El DS18B20 es un sensor digital de temperatura que utiliza el protocolo 1-Wire para comunicarse. El encapsulado de fabrica es tipo TO-92 similar al empleado en transistores pequeños.
Es fabricado por Maxim Integrated y la presentación comercial más utilizada por conveniencia y robustez es la del sensor dentro de un tubo de acero inoxidable resistente al agua.
¿Para qué se utiliza?
- Control de temperatura de piletas, acuarios o termotanques
- Automatización de temperatura en fluidos de alta densidad (esmaltes, comestibles, grasas, etc).
¿Cómo funciona?
El sensor de temperatura DS18B20 se comunica de forma digital. Cuenta con tres pines, dos de alimentación y uno de datos. Tiene con una precisión de 9 a 10 bits desde -55C a 125C y un margen de error de tan solo 0.5 grados.
Conexiones
El sensor de temperatura DS18B20 te permite conocer la temperatura utilizando solo 1 cable para datos (1-Wire), luego puedes utilizar varios sensores en el mismo bus, ya que cada sensor tiene un identificador de fábrica distinto.
Si lo desea puede usar un protoboard para facilitar la conexión.
A continuación veremos los distintos tipos de conexiones posibles:
Conectar un solo sensor al Arduino
Es necesario poner una resistencia Pull-Up de 4.7K.
Conectar varios sensores al Arduino
Existen dos opciones o métodos que se pueden usar para leer varios sensores de temperatura:
1. Cada sensor conectado a diferentes pines
Este método es útil cuando son pocos sensores o simplemente tenemos pines disponibles para conectar más DS18B20 como en un Arduino Mega.
Como cada sensor trabaja con un pin diferente, necesita su propia resistencia Pull-Up de 4.7K.
2. Cada sensores conectado al mismo pin
En otras palabras todos los sensores se conectan al mismo bus 1-Wire, y como cualquier bus, cada elemento o dispositivo posee una identificación o dirección.
Alimentación
El sensor tiene dos métodos de alimentación:
Alimentación a través del pin de datos
De esto forma, el sensor internamente obtiene energía del pin de datos cuando este se encuentra en un estado alto y almacena carga en un condensador para cuando la línea de datos esté en una estado bajo, a esta forma de obtener energía se le llama “Parasite Power” y se usa cuando el sensor debe conectarse a grandes distancias o en donde el espacio es limitado, puesto que de esta forma no se necesita la línea de VDD.
El diagrama para su conexión debe ser de la siguiente forma:
El pin GND y VDD están ambos conectados a GND, esto es indispensable para que se active el Parasite Power.
EL MOSFET en la imagen es necesario para cuando se realicen conversiones de temperatura o copiar datos desde la memoria de circuito de la EEPROM, en estas operaciones la corriente de operación aumenta y si solo se suministra energía a través de la resistencia pueden causar caídas de voltaje en el condensador interno.
Alimentación usando una fuente externa
De esta forma el sensor se alimenta a través del pin VDD, de esta forma el voltaje es estable e independiente del tráfico del bus 1-wire.
El diagrama de conexión es de la siguiente forma:
Esta forma de alimentación es la más recomendada y es la utilizada en esta guía.
Código
Librerías para el DS18B20 en Arduino
Para poder trabajar el DS18B20 en Arduino necesitamos dos librerías:
-
Librería OneWire
En esta librería está implementado todo el protocolo del bus 1-wire. Y puede usarse tanto para el DS18B20 como para otros dispositivos 1-wire.
-
Librería DallasTemperature
En esta librería están implementadas las funciones necesarias para poder realizar las lecturas o configuraciones del DS18B20.
Lecturas
Después de instalar las librerías y realizar la conexión anterior podemos realizar las lecturas de temperatura.
Lecturas de temperatura con un sensor
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire ourWire(2); //Se establece el pin 2 como bus OneWire
DallasTemperature sensors(&ourWire); //Se declara una variable u objeto para nuestro sensor
void setup() {
delay(1000);
Serial.begin(9600);
sensors.begin(); //Se inicia el sensor
}
void loop() {
sensors.requestTemperatures(); //Se envía el comando para leer la temperatura
float temp= sensors.getTempCByIndex(0); //Se obtiene la temperatura en ºC
Serial.print("Temperatura= ");
Serial.print(temp);
Serial.println(" C");
delay(100);
}
Como se observa medir la temperatura es simple, son necesarias solo dos líneas en el void loop() para realizar esta tarea.
El resultado es el siguiente:
Lecturas de temperatura con varios sensores
1. Cada sensor conectado a diferentes pines
El código para realizar las lecturas es el siguiente:
#include <OneWire.h>
#include <DallasTemperature.h>
OneWire ourWire1(2); //Se establece el pin 2 como bus OneWire
OneWire ourWire2(3); //Se establece el pin 3 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
void setup() {
delay(1000);
Serial.begin(9600);
sensors1.begin(); //Se inicia el sensor 1
sensors2.begin(); //Se inicia el sensor 2
}
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
Serial.print("Temperatura 1 = ");
Serial.print(temp1);
Serial.print(" C");
Serial.print(" Temperatura 2 = ");
Serial.print(temp2);
Serial.println(" C");
delay(100);
}
2. Cada sensor conectado al mismo pin del Arduino
La diferencia acá, es que al tratarse de un bus, necesitamos averiguar la dirección de cada sensor para poder identificarlo.
Para obtener la dirección de los dispositivos conectados en el bus 1-wire utilizamos el siguiente sketch:
#include <OneWire.h>
OneWire ourWire(2); //Se establece el pin 2 como bus OneWire
void setup(void) {
Serial.begin(9600);
}
void loop(void) {
byte addr[8];
Serial.println("Obteniendo direcciones:");
while (ourWire.search(addr))
{
Serial.print("Address = ");
for( int i = 0; i < 8; i++) {
Serial.print(" 0x");
Serial.print(addr[i], HEX);
}
Serial.println();
}
Serial.println();
ourWire.reset_search();
delay(2000);
}
El código anterior nos sirve para obtener las direcciones de los sensores, en nuestro caso hemos obtenido las direcciones de los tres sensores que tenemos conectados, pero pueden ejecutar el código anterior para cada sensor de forma individual para saber con exactitud la dirección de su sensor.
Una vez obtenida la dirección podemos identificar la lectura del sensor que deseemos medir.
Para realizar las lecturas usamos el siguiente sketch:
#include OneWire.h>
#include DallasTemperature.h>
OneWire ourWire(2); //Se establece el pin 2 como bus OneWire
DallasTemperature sensors(&ourWire); //Se declara una variable u objeto para nuestro sensor
DeviceAddress address1 = {0x28, 0xFF, 0xCA, 0x4A, 0x5, 0x16, 0x3, 0xBD}; //dirección del sensor 1
DeviceAddress address2 = {0x28, 0xFF, 0x89, 0x3A, 0x1, 0x16, 0x4, 0xAF}; //dirección del sensor 2
DeviceAddress address3 = {0x28, 0xFF, 0x23, 0x19, 0x1, 0x16, 0x4, 0xD9}; //dirección del sensor 3
void setup() {
delay(1000);
Serial.begin(9600);
sensors.begin(); //Se inicia el sensor
}
void loop() {
sensors.requestTemperatures(); //Envía el comando para obtener las temperaturas
float temp1= sensors.getTempC(address1); //Se obtiene la temperatura en °C del sensor 1
float temp2= sensors.getTempC(address2); //Se obtiene la temperatura en °C del sensor 2
float temp3= sensors.getTempC(address3); //Se obtiene la temperatura en °C del sensor 3
Serial.print("Temperatura 1 = ");
Serial.print(temp1);
Serial.print(" C");
Serial.print(" Temperatura 2 = ");
Serial.print(temp2);
Serial.print(" C");
Serial.print(" Temperatura 3 = ");
Serial.print(temp3);
Serial.println(" C");
delay(100);
delay(100);
}