DS18B20 con Arduino: tutorial de sensor de temperatura digital Deja un comentario

El DS18B20 es un sensor de temperatura en el cual se lleva la conversión analógico a digital dentro del encapsulado, facilitando el resultado de dicha conversión a través de una interfaz digital llamada 1-wire.

El sensor de temperatura DS18B20 se puede encontrar en diversas formas, entre las cuales destacamos 2 que son bastante comunes:

  • El encapsulado TO-92 (usado comúnmente en transistores).
  • El sensor tipo sumergible, que es fabricado por terceros utilizando sensores en encapsulado TO-92 colocados dentro de una cubierta impermeable de acero inoxidable.

En esta entrada estudiamos el proceso de comunicación con dispositivos 1-wire utilizando como ejemplo el DS18B20.

Materiales necesarios para las practicas

Para realizar los experimentos con el sensor DS18B20 recomendamos como mínimo el siguiente material:

Teoría y conceptos básicos

En esta sección daremos detalles de cómo se comunica el sensor DS18B20 con el Arduino. No te preocupes, esta parte NO tendrás que implementarla por tu cuenta, pero del objetivo de este blog es aprender, así que te servirá conocer los conceptos básicos de 1-Wire.

El sensor DS18B20 utiliza una interfaz digital propietaria para transferir la información hacia el microcontrolador conocida como “1-Wire”. Como el nombre lo indica, solamente requerimos una linea de datos (además de la alimentación) entre el microcontrolador y uno o varios dispositivos que participan en el bus.

El bus 1-Wire consiste en un esquema de señalización, direccionamiento y arbitraje que permite comunicaciones bidireccionales entre un dispositivo maestro y uno o varios periféricos (esclavos) sobre un solo hilo de cobre o pista de circuito impreso.

La siguiente imagen muestra la conexión típica de un microcontrolador con dispositivos 1-wire:

ds18B20 one wire topologia busOperaciones sobre el bus 1-wire

En realidad las operaciones básicas del bus 1-wire son bastante sencillas y son las siguientes:

  • Reset – El esclavo envía un pulso de 480 microsegundos y luego “deja flotar” el bus, el esclavo (o esclavos) responden “jalando” el bus a estado bajo (pulso de presencia). Esta operación sincroniza el bus e indica a los esclavos que el master va a enviar información.
  • Escribir bit 0 – El maestro envía un pulso de estado bajo de 60 microsegundos, luego libera el bus.
  • Escribir bit 1 – El maestro envía un pulso en estado bajo de 6 microsegundos, luego libera el bus.
  • Leer bit (desde esclavo) – El maestro genera un pulso bajo de 6 microsegundos y luego libera el bus. Si el esclavo desea transmitir un “1”, el esclavo “deja flotar” el bus, si desea enviar un “0”, mantiene un estado lógico bajo.

El dispositivo maestro inicia y controla todas las operaciones anteriores, toda la funcionalidad de 1-Wire se fundamenta en estas 4 sencillas operaciones, incluyendo el descubrimiento y direccionamiento de dispositivos.

La siguiente imagen muestra las operaciones anteriores como se verían en la pantalla de un osciloscopio o analizado lógico, junto con los tiempos correspondientes.

onewire_diagrama_formas_de_ondaDireccionamiento del bus 1-wire

Una característica distintiva del bus 1-Wire es que cada uno de los dispositivos esclavos tiene un número de serie (dirección) único de 64 bits asignado desde fábrica. Esta dirección jamás se repite en otro dispositivo 1-wire, lo que permite seleccionar un esclavo de entre varios en el bus de comunicaciones.

Direccionamiento del bus 1-wire, sensores DS18B20 con etiquetas mostrando sus direcciones en hexadecimal

Dado que en un bus 1-wire pueden coexistir múltiples dispositivos, es necesario conocer la dirección única de cada uno. Para esto se utiliza un algoritmo de búsqueda mediante el cual un dispositivo maestro puede conocer todas las direcciones de los esclavos.

Una vez que el dispositivo maestro conoce las direcciones de los esclavos puede dirigir las comunicaciones y comandos al dispositivo esclavo apropiado.

Algoritmo de búsqueda de dispositivos 1-wire

El algoritmo de búsqueda es en si algo complejo y podría ser tema de otro artículo, por eso de momento no explicaremos a detalle como se maneja el descubrimiento de dispositivos, sin embargo, en el sitio web de Maxim/Dallas Semiconductor hay una explicación bien detallada para quien desea conocer a fondo este proceso.

Para el usuario de Arduino, no es necesario conocer a detalle el proceso, ya que en la mayoría de los casos, este algoritmo es manejado directamente por la(s) librería(s).

Cabe señalar que si usamos un solo dispositivo en el bus, nos podemos comunicar de forma muy sencilla, evitando todo el proceso de descubrimiento de direcciones y la selección el dispositivo esclavo (evitamos la transmisión de 8 bytes). Para esto se utiliza el comando “Skip ROM” que permite justamente eso: seleccionar al único dispositivo esclavo en el bus o transmitir mensajes tipo “broadcast”.

Proceso de comunicación 1-Wire completo

  • El proceso de comunicación comienza cuando el maestro genera un pulso de reset, el cual sincroniza todos los dispositivos del bus.
  • Después de este pulso se selecciona un dispositivo esclavo para las comunicaciones subsecuentes. Se puede seleccionar un dispositivo esclavo específico (mediante su dirección o número de serie) o enviar un mensaje/comando a todos los dispositivos en el bus.
  • Una vez que se ha seleccionado un dispositivo, los otros participantes del bus ignoran los comandos / datos y esperan el próximo reset.
  • El dispositivo direccionado puede recibir comandos específicos de acuerdo a su funcionalidad, recibir datos, enviar datos, etc.

El proceso de descubrimiento y selección de dispositivo en el bus 1-wire siempre es el mismo, a pesar de que el protocolo y/o comandos para intercambiar datos puede variar entre distintos dispositivos debido a las diferentes funciones que desempeñan.

Visualización de la comunicación 1 wire

A continuación puedes descargar la captura de un analizador lógico para una comunicación 1wire. Podrás ver la señales que se generaron durante las pruebas que realizamos al escribir este articulo tal como se muestra a continuación.Inicio de la comunicación con DS18B20

Para visualizar la comunicación completa, podemos descargar el programa KingstVIS, el cual corresponde a nuestro analizador lógico USB y con el cual se realizaron estas imágenes. Los archivos de las capturas se encuentran disponibles en los siguientes enlaces:

Una instalado el programa y abierto el archivo deberá presentarse una interfaz similar a la que se muestra a continuación:

DS18B20 captura 1 wire kingstvis

Características del sensor de temperatura DS18B20

Para conocer las características del sensor DS18B20 la mejor fuente de información es la hoja de datos del dispositivo, que se puede descargar del sitio web oficial o del enlace a continuación:

En esta sección proporcionaremos información resumida sobre este sensor que hemos obtenido desde la hoja de datos y recopilado desde distintas fuentes de internet.

Pinout del sensor DS18B20 y sus distintos encapsulados

Como ya hemos mencionado existen muchas variantes del DS18B20, siendo las más populares la de encapsulado TO-92 y el que viene en una cápsula de acero inoxidable a prueba de agua.

De cuerdo a la hoja de datos, los encapsulados que tenemos disponibles para elegir son los siguientes:

DS18B20 tipos de encapsulados

De estos el más común es el TO-92 que puede ser utilizado fácilmente en el protoboard y como se puede observar todos comparten los mismos pines:

  • VDD – Se trata del pin por donde el sensor recibe la alimentación. Podemos alimentar nuestro sensor con un voltaje de entre 3.0 y 5.5 volts. Esto es un rango bastante bueno, ya que permite que utilicemos el sensor con placas que funcionan con 3.3 volts como el Arduino MKR1000 o la linea de productos de Adafruit Feather.
  • GND – Conexión a tierra o masa del circuito.
  • DQ – Se trata del pin de comunicación 1-Wire. A través de este pin tiene lugar la comunicación desde y hacia el microcontrolador. Cabe destacar que podemos conectar varios sensores a un solo pin del microcontrolador.

Distribución de señales en el sensor DS18B20 a prueba de agua

El DS18B20 se comercializa en una versión a prueba de agua que puede utilizarse para medir la temperatura de líquidos no corrosivos.DS18B20 Sensor de temperatura sumergibleLa distribución de las señales en este tipo de sensores se muestra en la tabla e imagen a continuación.

Señal Color
VDD Rojo
GND Negro
DQ Amarillo, blanco

Rango de temperaturas y error en el DS18B20

Una característica muy importante al momento de elegir un sensor de temperatura es el rango de temperaturas en el cual puede operar. El DS18B20 utilzarse en un rango de -55 ºC a 125 ºC.

Es importante tomar en cuenta que el error del sensor es diferente según la temperatura a la que está operando. Para temperaturas entre -10ºC y 85ºC existe un error de ±0.5 ºC. Para el resto de temperaturas entre -55 ºC y 125 ºC el error es de ±2 ºC.

Lo anterior quiere decir que a 25 ºC la temperatura real estará entre 24.5 y 25.5, mientras que a 90 ºC la temperatura real podría estar entre 88 ºC y 92 ºC.

Resolución de las mediciones con DS18B20

La resolución de la medición de temperatura puede configurarse según los requisitos de nuestra aplicación.

Las resoluciones disponibles se resumen a continuación:

Resolución Temperatura por LSB
9 bits 0.5 ºC
10 bits 0.25 ºC
11 bits 0.125 ºC
12 bits 0.0625 ºC

¿Cómo conectar el DS18B20 con Arduino?

Para conectar un sensor DS18B20 se requieren 3 conexiones básicas.

  1. Alimentación de 5 volts (VDD).
  2. Tierra del circuito (GND).
  3. Linea de transmisión de datos 1-Wire incluyendo una resistencia pull-up (DQ).

La conexión de alimentación de 5 volts es opcional y podemos retirarla si utilizamos la alimentación en modo parásito. En esta modalidad la linea de datos proporciona alimentación al dispositivo a través del pin DQ, haciendo que podamos omitir la linea de alimentación (VDD).

A continuación expondremos varios tipos de conexiones que se pueden realizar con el sensor DS18B20, nos daremos cuenta que se trata de un componente bastante versátil.

Valores de resistencias pull-up para DS18B20

Para que la comunicación con el DS18B20 funcione, requerimos una resistencia “pull-up” en el pin DQ.

La siguiente tabla resume los valores de resistencias pull-up que sugerimos emplear de acuerdo a la distancia a la que colocaremos el sensor (longitud del cable).

Podemos experimentar colocando la resistencia en el lado del sensor o del microcontrolador hasta conseguir el mejor resultado en distancias grandes.

Distancia Valor de resistencia
Hasta 5 metros 4.7 kΩ
5 a 10 metros 3.3 kΩ
10 a 20 metros 2.2 kΩ
20 a 50 metros 1.2 kΩ

Conexión de un solo sensor de temperatura DS18B20

La conexión de un DS18B20 con el arduino debe realizarse de la siguiente forma:

Conexión arduino con DS18B20Conexión de varios sensores de temperatura DS18B20 en un mismo pin

La conexión de varios DS18B20 se realiza de forma similar a la anterior. Todos los sensores adicionales se colocan en paralelo con el primero, permitiendo de esta forma que la señal 1-wire llegue a todos los dispositivos.

conexion ds18b20 con arduino varios sensoresConexión para modo de alimentación parásito

Como ya mencionamos el DS18B20 se puede conectar de forma que reciba alimentación a través del pin DQ.

Para esta modalidad deberemos conectar el sensor como se muestra a continuación. La alimentación del sensor se realizará a través de la resistencia pull-up.

Conexión arduino con DS18B20 modo parásitoLibrería para sensor DS18B20 con Arduino

Se requieren 2 librerías para podernos comunicar con un sensor DS18B20. La primera es la librería “OneWire” y la segunda es la librería “DallasTemperature”.

La primera librería se encarga de los detalles de bajo nivel del protocolo de comunicación, mientras que la segunda se encarga específicamente de la funcionalidad del sensor DS18B20 (y otros más).

Los enlaces a los repositorios son los siguientes:

También podemos instalar las librerías requeridas mediante el gestor de librerías de acuerdo a lo que ya hemos estudiado en el blog tal como se muestra en la imagen a continuación.

ds18b20 con arduino gestor libreriasProgramación del sensor DS18B20

Leer un sensor DS18B20 con Arduino usando solo la librería OneWire

En este ejemplo realizamos la comunicación con un DS18B20 en su forma más simple, para obtener la lectura de temperatura y finalmente imprimir a la terminal serial.

Utilizando programa a continuación, no requerimos hacer la búsqueda de dispositivos ni enviar la dirección del DS18B20, lo que es más, no requerimos una librería específica para el DS18B20, solamente usamos la librería genérica OneWire.

La desventaja es que solo podremos tener conectado un sensor DS18B20 por pin en un momento dado, ya que no realizamos la búsqueda de dispositivos ni se utilizan las direcciones de 64 bits.

Código para encontrar la dirección de los dispositivos DS18B20

El siguiente programa nos permite descubrir la dirección de 64 bits que se encuentra presente en el DS18B20. Podemos utilizar esta dirección para comunicarnos específicamente con alguno de los dispositivos conectados al bus.

Recomendamos conectar un sensor a la vez, de forma que solamente se arroje una sola dirección.

Leer un sensor DS18B20 con librería DallasTemperature

En este programa estaremos realizando algo similar al primer programa, pero estaremos utilizando la librería DallasTemperature.

Leer varios sensores DS18B20 en un mismo pin con librería DallasTemperature

Este sketch permite detectar 3 sensores conectados en el mismo pin y obtener sus lecturas. Como podemos observar, el programa es prácticamente igual al anterior, con la excepción de que se realizan 3 lecturas.

Leer sensores DS18B20 si conocemos su dirección

En este programa demostramos como podemos comunicarnos con varios sensores, si conocemos de antemano la dirección de cada uno. La principal ventaja es que no ocuparemos tiempo para ejecutar el algoritmo de búsqueda.

Para conocer las dirección de un DS18B20 podemos utilizar el programa que se encuentra más arriba en esta página.

Conclusión

En este tutorial hemos aprendido el funcionamiento y capacidades del bus 1-wire para conectar sensores de temperatura. Especialmente trabajamos con el sensor DS18B20 que es muy popular.

Hemos observado el uso de la librería OneWire de Arduino y como usando la funcionalidad de esta podemos escribir código para acceder a cualquier dispositivo compatible con el bus 1-wire.

También exploramos el uso de la librería DallasTemperature que permite acceder a diversos sensores de temperatura, siendo esta una capa adicional que funciona sobre la librería OneWire y que provee las funciones de alto nivel para acceder a los datos del sensor.

Como podemos observar los sensores DS18B20 son bastante versátiles y nos permiten ahorrar pines del microcontrolador al permitir la conexión de varios de estos sensores a un solo pin.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

Enviar Whatsapp
Hola 👋
¿En qué podemos ayudarte?