Sensor de Temperatura DS18B20 con Arduino

Ahora ha llegado el momento de ponernos en acción y realizar monitoreo de variables físicas. En esta ocasión aprenderás a medir la temperatura de cualquier ambiente, incluso de líquidos. Esto gracias al sensor de temperatura DS18B20, una sonda impermeable capaz de ser sumergida en líquidos.

El DS18B20 es un sensor de temperatura bastante utilizado por ser altamente versátil, y sobre todo muy económico, rondando los 3 dólares americanos, incluso lo puedes conseguir más barato si compras en grandes cantidades, o si lo importas directamente desde china, ya sabes.

Si bien es un sensor el cual está incorporado en una sonda impermeable para poderlo sumergir, en lo personal lo he utilizado para monitorear temperatura en ambientes de alta humedad, o en ambientes un poco mas hostiles como donde pueda sufrir algún golpe ligero.

Características del sensor de temperatura DS18B20

Como te he mencionado en otras ocasiones, es importante consultar la hoja de datos del fabricante, en este caso me basaré en el sensor DS18B20 de Maxim Integrated. Lo primero que podemos destacar es su distribución de pines, el circuito integrado que realiza la medición de temperatura, contiene tres pines: GND, DQ y VDD. Los cuales corresponden a los pines de Tierra, Datos y Voltaje.

Pines del sensor DS18B20.
Pines del sensor DS18B20.

Este pequeño integrado mostrado en la figura anterior, lo vamos a encontrar dentro de la sonda, la cual nos incluye un cable de aproximadamente un metro, dejándonos a la vista tres pequeños cables que son los que utilizaremos para comunicarnos con el sensor, como lo muestra la siguiente imagen.

Sensor de temperatura DS18B20.
Sensor de temperatura DS18B20.

El rango de voltaje de operación de este sensor, y el cual vamos a alimentar por el pin VDD, debe de estar entre los 3.0 y los 5.5 V. Y el rango de temperatura capaz de detectar es desde los -55º C hasta los 125º C.

Como ya te habrás dado cuenta, solo contiene un pin de datos (DQ), por lo que el protocolo de comunicación que utiliza está basado en comunicación bidireccional de un solo puerto. El protocolo se llama 1-Wire®, y solo necesita de un cable, como su nombre lo dice. No te preocupes de los detalles técnicos para utilizar el protocolo, nos apoyaremos en una biblioteca realizada para realizar la comunicación con el sensor.

Si bien el rango de temperaturas capaz de detectar el sensor es amplio, es importante mencionar el error que puede tener al medirla. El sensor de temperatura DS18B20. El fabricante nos indica el probable error de acuerdo a la siguiente tabla:

Rango de operaciónError
-55º C hasta -10º C± 2º C
-10º C hasta 85º C± 0.5º C
85º C hasta 125º C± 2º C

Por lo anterior, hay que considerar el rango de operación real donde utilizaremos el sensor, para fines prácticos y de aplicación general, el rango de error es bueno. Si queremos desarrollar un sistema con una mejor precisión, en el mercado existen muchos tipos de sensores de temperatura con mejores prestaciones, resolución y un error más bajo, claro, de un mayor costo.

Por otro lado, este sensor incluye una pequeña memoria, donde tiene almacenado un identificador, el cual podemos utilizar para identificar un sensor de otro en el caso de que tengamos conectados varios sensores al mismo pin de la placa; si, puedes tener varios sensores en el mismo pin, al mismo tiempo, lo veremos más adelante en los ejemplos.

Conectando el sensor de temperatura DS18B20

Como pudiste observar en la imagen del sensor, contamos con tres cables identificados con distintos colores. Cabe mencionar que distintos fabricantes colocarán una configuración distinta de colores, pero en general es fácil identificarlos. En nuestro caso el código de colores será el siguiente:

ColorPIN
NegroGND
RojoVDD
AzulDQ

Cuando retires el plástico de los cables, notarás que el conductor está formado de varios y pequeños hilos, lo que nos dificultará un poco la conexión directamente en el Arduino o en un protoboard, yo te recomiendo que tomes unos cables Dupont, como los que hemos utilizado hasta ahora, cortes un extremo y lo puedes soldar directamente a la sonda, el otro extremo deberá ser la terminal macho de cable, para que puedas conectarlo de manera directa y sin problemas.

Si te encuentras con otra configuración de colores, te recomiendo probar la conexión hasta que el sensor de funcione, después etiquetarlo. No te preocupes, si conectas de manera incorrecta el sensor no se dañará y por lo general siempre tendrás un cable color Rojo, el cual será siempre VDD.

Conexión de los pines del sensor DS18B20 con Arduino

A la hora de conectar el sensor con el Arduino, tenemos dos opciones de alimentarlo: directamente enviando voltaje al pin VDD, y utilizar el modo parásito utilizando el propio pin DQ.

Sea el modo que elijas para alimentarlo, tendremos que colocar una resistencia en pull-up con el pin DQ. ¿Recuerdas cuando lo utilizaste acá? Esta resistencia es útil en los sistemas de comunicación digital, ya que mientras ningún sensor esté enviando información, el Arduino detectará un voltaje igual al de alimentación de manera constante, en cuanto el sensor inicie la comunicación, el Arduino detectará un cambio de estado a cero.

Seleccionar de manera adecuada la resistencia es importante, y esta dependerá de la longitud del cable utilizado para comunicar desde la placa hasta el sensor. Si utilizas el cable ya incorporado en la sonda, una resistencia de 4.7 KΩ será la adecuada. Si deseas agregar un cable para extender la instalación de tu sensor considera la siguiente tabla:

Distancia del cable en metrosValor de la resistencia
De 0 a 54.7 kΩ
De 5 a 103.3 kΩ
De 10 a 202.2 kΩ
De 20 a 501.2 kΩ

Modo de alimentación directo

El primer modo de alimentación que definiremos es cuando utilizamos el pin de VDD e insertamos un voltaje desde 3.0 hasta 5.5 V. Podemos utilizar el voltaje que nuestra placa Arduino puede otorgar. El esquema de conexión sería el siguiente:

Conexión directa sensor DS18B20.
Conexión directa sensor DS18B20.

Como puedes observar, la resistencia pull-up se encuentra entre el pin de datos DQ y el pin digital del Arduino. Si conectas más sensores al mismo pin del Arduino, compartirán la misma resistencia pull-up, no es necesario agregar otra. Si conectas otro sensor en un pin digital del Arduino distinto, en ese caso es necesario agregar otra resistencia pull-up.

Modo de alimentación parásito

En el modo parásito, los pines DQ y GND quedan exactamente igual, la conexión que cambiará será la de alimentación VDD, la cual irá conectada a tierra.

Conexión parásito sensor DS18B20.
Conexión parásito sensor DS18B20.

En este tipo de conexión, la alimentación necesaria para el funcionamiento la obtendrá del mismo pin de datos DQ, al recibir estados HIGH, utilizará ese voltaje para operar.

Cualquier esquema que utilices funcionará con la programación que veremos a continuación.

¿Te está gustando este artículo?

Te invito a descargar totalmente gratis la Guía de Inicio en Arduino

Encontrarás mucha información extra, conceptos y sobre todo podrás llevarla contigo en todo momento

Librería 1-Wire

Antes de programar nuestro Arduino, es importante instalar la librería 1-Wire®, para ello iremos al Administrador de Bibliotecas en el IDE Arduino. Al abrirlo buscaremos la librería one wire como se muestra a continuación:

Librería 1-Wire.
Librería 1-Wire.

También será necesario instalar una librería llamada Dallas Temperature, la cual contiene todos las funciones necesarias para comunicarnos con el sensor DS18B20.

Librería Dallas Temperature para el sensor de temperatura arduino.
Librería Dallas Temperature.

Utilizando el sensor de temperatura DS18B20 con Arduino

Ya que tenemos conectado el sensor y las librerías instaladas, ahora sí, por fin, manos a la obra (siempre es importante la teoría antes de la práctica 😉 ).

Lo primero que tenemos que agregar en nuestro programa son las dos librerías que utilizaremos con el sensor:

Además es importante utilizar siempre una variable para indicar el pin físico de la placa Arduino que utilizaremos para conectar el pin de datos DQ del sensor, ya sabes, con su pull-up. Para este ejemplo utilizaremos el pin 3 en la variable pinDatosDQ.

Crearemos un objeto de tipo OneWire que llamaremos oneWireObjeto indicándole el pin físico donde actuará. Posteriormente creamos un objeto de tipo DallasTemperatura llamado sensorDS18B20 para crear nuestro sensor, donde podremos enviarle distintas funciones para trabajar con él.

Lo que resta será inicializar el sensor dentro de la función setup, así como inicializar el puerto serie, donde observaremos los resultados de las lecturas de temperatura

Ahora dentro de la función loop, ingresaremos las instrucciones para leer la temperatura. El código completo es el siguiente:

Como puedes observar, cada vez que necesitamos adquirir una nueva muestra de la lectura de temperaturas, llamaremos a la función requestTemperatures(); en este caso será del objeto sensorDS18B20 ya que solo declaramos un sensor (sensores, en un solo pin). Si tenemos varios sensores en distintos pines, deberemos de crear varios objetos de este mismo tipo.

Una vez que ejecutamos esta función, podemos leer el resultado con la siguiente función: sensorDS18B20.getTempCByIndeX(0);, si observas, la función getTempCByIndeX(0) incluye un índice, que en este caso es cero, este índice nos servirá para cuando necesitamos adquirir la temperatura de varios sensores conectados en el mismo pin del Arduino; es decir, un índice uno será la temperatura del segundo sensor, un índice dos será la temperatura del tercer sensor, etc. Además esta función ya nos dará el resultado en grados Celsius (ºC).

Si abrimos el Monitor Serie del IDE, observaremos el siguiente resultado:

Monitor serie sensor DS18B20.
Monitor serie sensor DS18B20.

Si por alguna razón, en el monitor serie observas un -127.00 significa que hay un error de conexión.

Pero: ¿cómo puedes saber cuál es físicamente un sensor y cuál el otro?

Como somos bien hábiles pues enfriamos/calentamos uno y vemos cuál cambia, fácil no??? Pues a pesar que este método es útil y bastante empírico, podemos identificar los sensores por medio de su ID, como te lo mencioné al principio de este tutorial.

Detectando la dirección del sensor DS18B20

El código siguiente te ayudará a detectar las direcciones de identificación de cada sensor que tengas conectado el mismo pin en el Arduino.

Al ejecutar el código anterior con dos sensores conectados, en el monitor serie verías algo como sigue:

Detección de sensores de temperatura Arduino.
Detección de sensores.

Puedes anotar la dirección de cada sensor detectado, te recomiendo que ejecutes el código anterior conectando un sensor a la vez, así sabrás específicamente que dirección le corresponde a cada quien.

Leer la temperatura del sensor DS18B20 con la dirección

Una vez que tienes identificados los sensores, podrías mandar a leer la temperatura de cada uno de manera precisa, sabiendo qué lectura le corresponde a cada sensor.

Ahora modificaremos el código para acceder a la temperatura del sensor por medio de su dirección:

Como puedes observar agregamos una o más líneas dónde indicamos las direcciones de cada sensor, además de darles un nombre particular. El resto del código permanece casi igual que el anterior, solo que al mandar obtener la temperatura, en lugar de indicarle un índice indicaremos el nombre del sensor, para este caso lo nombré sensor1.

El resultado es el siguiente:

Lectura de sensor de temperatura con Arduino por medio de la dirección.
Lectura de sensor de temperatura por medio de la dirección.

¿En dónde te gustaría utilizar este sensor?

Dime que proyecto te interesaría que realizara con este sensor.

Hasta aquí el tutorial de esta ocasión, tienes alguna duda o comentario déjamelo saber aquí abajo.

Recuerda visitar nuestras redes sociales

2 pensamientos sobre “Sensor de Temperatura DS18B20 con Arduino”

    1. Hola Marcelo, te recomiendo el DHT22 o el SHT11. Pronto subiré un capítulo para utilizar el DHT22. El SHT11 es más preciso y costoso, pero es de los mejores que podrás encontrar.

      Quedo al pendiente de tus dudas y comentarios.

Deja un comentario