DS18B20: Sensor de Temperatura para Líquidos

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

DS18b20: Un solo sensor conectado al Arduino
DS18b20: Un solo sensor conectado 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.

DS18B20: Cada sensor conectado a diferentes pines de Arduino
DS18B20: Cada sensor conectado a diferentes pines de Arduino

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.

DS18B20: Cada sensor conectado al mismo pin de Arduino
DS18B20: Cada sensor conectado al mismo pin de Arduino

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:

DS18B20: Alimentación a través del pin de datos
DS18B20: Alimentación a través del pin de datos

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:

DS18B20: Alimentación usando una fuente externa
DS18B20: Alimentación usando una fuente externa

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:

  1. 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.

  2. 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:

DS18B20: Lecturas de temperatura con un sensor conectado al Arduino
DS18B20: Lecturas de temperatura con un sensor conectado al Arduino

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);                     
}

DS18B20: Lecturas de temperatura con cada sensore conectado a diferentes pines de Arduino
DS18B20: Lecturas de temperatura con cada sensore conectado a diferentes pines de Arduino

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);
}

DS18B20: Lecturas de la dirección de los sensores
DS18B20: Lecturas de la dirección de los sensores

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);                     
}

DS18B20: Lecturas de temperatura con cada sensore conectado a diferentes pines de Arduino
DS18B20: Lecturas de temperatura con cada sensor conectado a diferentes pines de Arduino