Medir temperatura de líquidos y gases con Arduino y DS18B20


arduino-ds18b20

¿Qué es un sensor DS18B20?

El DS18B20 es un sensor de temperaturas fabricado por la compañía Maxim Integrated. Proporciona la salida mediante un bus de comunicación digital que puede ser leído con las entradas digitales de Arduino.

Originalmente el sensor DS18B20 era fabricado por la empresa Dallas Semiconductor, que fue comprada por Maxim Integrated en 2001. Por ese motivo aún encontraréis referirse a este dispositivo como Dallas DS18B20, así como en Sketch y librerías.

El sensor DS18B20 es un sensor barato y, sin embargo, bastante avanzado. Dispone de un rango amplio de medición de -55ºC a +125ºC y una precisión superior a ±0.5°C en el rango –10°C de +85°C.

Una de las ventajas del DS18B20 es que se comercializa tanto en un integrado TO-92 como en forma de sonda impermeable, lo que permite realizar mediciones de temperatura en líquidos y gases.

El DS18B20 emplea un bus de comunicación denominado 1-Wire propietario de la empresa Maxim Integrated, aunque podemos usarlo sin tener que pagar por ninguna tasa (es parte del precio del dispositivo).

La principal ventaja del bus 1-Wire es que necesita un único conductor para realizar la comunicación (sin contar el conductor de tierra). Los dispositivos pueden ser alimentados directamente por la línea de datos, o mediante una línea adicional con una tensión de 3.0 a 5.5V.

Dentro del mismo bus 1-Wire podemos instalar tantos sensores como deseemos. Además, el bus 1-Wire permite emplear cables más largos que otros sistemas antes de que se deteriore la comunicación.

El DS18B20 también dispone de un sistema de alarma que permite grabar en la memoria no volátil del DS18B20 los limites inferiores y superiores. El bus 1-Wire permite consultar si algún dispositivo conectado ha activado una alarma.

El DS18B20 es un gran sensor para la medición de temperatura, tanto en ambientes domésticos como industriales. Sus características permiten crear redes con gran número de sensores para controlar, por ejemplo, la climatización o el sistema HVAC de un edificio comercial.

Precio

El DS18B20 es un sensor barato y excelente en calidad / precio. Podemos encontrarlo en su versión integrado TO-92 por 0.45€, y por 1€ en la versión sumergible, buscando en vendedores internacionales en eBay y AliExpress.

arduino-ds18b20-componente

¿Cómo funciona el DS18B20?

Como hemos dicho, internamente el sensor DS18B20 es más complicado de lo que en principio podríamos creer. Está formado por un procesador con múltiples módulos, que se encargan de controlar la comunicación, medir la temperatura, y gestionar el sistema de alarmas.

arduino-ds18b20-funcionamiento

Una de las principales ventajas de DS18B20 es su bus de comunicación 1-Wire que le permite realizar la transmisión empleando únicamente un cable de datos. Para ello, 1-Wire está basado en un complejo sistema de timings en la señal, entre el dispositivo emisor y el receptor.

La señal de comunicación empleada en 1-Wire, así como sus timings, son realmente largas y complejas. Para más información, consultar el Datasheet del dispositivo.

La mayor desventaja del sistema 1-Wire es que requiere un código complejo, lo que a su vez supone una alta carga del procesador para consultar el estado de los sensores. El tiempo de adquisición total de una medición de 750ms.

El dispositivo 1-Wire permite que todos los dispositivos conectados al bus se alimenten a través de la línea de datos. Para ello, disponen de un condensador que almacena energía mientras la línea de datos está en HIGH. Este modo se denomina “modo parásito”. En caso de no usar el modo parásito, los dispositivos deberán ser alimentados a una tensión entre 3.0V y 5.5V.

En cualquier caso, el bus 1-Wire requiere una resistencia de pull-up de 4k7 entre Vcc y Vq para que funcione correctamente.

Para poder dispone de múltiples dispositivos en un bus 1-Wire cada sensor dispone de una memoria ROM que es grabada de fábrica con un número de 64 bits. Los 8 primeros bits corresponden a la familia (0x28 para el DS18B20). Los siguiente 48 bits son el número de serie único. Los últimos 8 bits son un código CRC.

arduino-ds18b20-one-wire

Esto significa que potencialmente podríamos llegar a tener 2^48 (más de 218 billones) de DS18B20 conectados en una misma red 1-Wire, además de otros tantos dispositivos de otras familias (2^28, unos 268 millones de familias de dispositivos posibles). A efectos prácticos, esto supone infinitos dispositivos.

La resolución del DS18B20 es configurable a 9, 10, 11 o 12 bits, siendo 12 bits el modo por defecto. Esto equivale a una resolución en temperatura de 0.5°C, 0.25°C, 0.125°C, o 0.0625°C, respectivamente.

Que el DS18B20 disponga de una resolución por defecto de 0.0625ºC, no significa que esa sea su precisión. Sin embargo, el DS18B20 es considerablemente preciso en todo el rango –10°C de +85°C. Podéis consultar las desviaciones medias a 3 sigma en la siguiente gráfica.

arduino-ds18b20-precision

Esquema de montaje

Los dispositivos 1-Wire disponen de tres terminales

  • Vq, la línea de datos
  • Vdd, línea de alimentación
  • GND, línea de tierra

En la siguiente imagen figura la posición de estos pines en ambos formatos del sensor, como integrado y como sonda impermeable.

arduino-ds18b20-patillaje

Hemos comentado que el bus 1-Wire necesita una resistencia de pull-up de 4K7, y que podemos alimentar el sensor directamente a través del pin Vdd o usar el modo “parásito” y alimentarlo con la propia línea de datos.

Por tanto, el esquema más simple de conexión se muestra en la siguiente imagen, donde podemos conectar el sensor a cualquier entrada digital de Arduino.

arduino-ds18b20-esquema

Si representamos el mismo montaje, añadiendo la disposición que ocuparían los sensores adicionales (en caso de necesitarlos) observamos más claramente la estructura del bus 1-Wire.

arduino-ds18b20-montaje

Finalmente, si quisiéramos emplear el modo parásito, simplemente tenemos que conectar Vdd de todos los dispositivos a GND. De esta forma, los sensores tomarán su alimentación de la línea de datos Vq. El montaje con el modo parásito quedaría así.

arduino-ds18b20-montaje-parasito

Ejemplos de código

Para poder leer las temperaturas del DS18B20, necesitamos usar la librería 1-Wire y la librería Dallas Temperature.

En el primer ejemplo, leeremos un único sensor ubicado en el pin digital 5.

Al usar la función getTempCByIndex, el indice es el número del sensor. Con esta función podemos leer más de un sensor instalado en un bus, pero tendríamos problemas para saber qué sensor es qué índice.

Por tanto, en caso de tener múltiples sensores lo normal es que accedamos directamente por la dirección de 64 bits del dispositivo. Para saber esta dirección, tenemos que usar el siguiente sketch, que escanea el bus 1-Wire y muestra en la pantalla su dirección en hexadecimal (agrupada en 8 números de dos dígitos).

Una vez que tengamos las direcciones de los dispositivos, podríamos realizar la lectura de múltiples sensores en el mismo bus 1-Wire.

En el siguiente ejemplo realizamos la lectura de dos sensores de los cuales ya hemos obtenido su dirección, uno en el interior y otro en el exterior de una vivienda, accediendo a través de su dirección.

Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección Tutoriales de Arduino
Previous Salidas de mayor potencia con Arduino y transistor BJT
Next Detector de llama con Arduino y sensor infrarrojo

¡Deja un comentario!...

avatar
1000
Sort by:   newest | oldest | most voted
luisllamas
Guest

Ningún problema en ninguna de las combinaciones que planteas

luisllamas
Guest
Uy, es una pregunta muy buena. En principio es problema de longitud. Lo que más me sorprende es que a 10m no deberías tener muchos problemas (si me dijeras 30…). Sería muy interesante medir con un osciloscopio lo que está pasando en esa línea. Vamos a descartar cosas. Opción 1) Alimentación. ¿Cómo estas alimentando los sensores? ¿Desde el propio Arduino o con fuente externa? ¿no estás usando el modo parásito verdad? Podría ser la caída de tensión, pero esos sensores consumen poco. Afortunadamente, esto es fácil, mide la tensión al sensor más alejado y comprueba la tensión que le llega.… Read more »
luisllamas
Guest

Gracias a ti por compartir tus resultados!

Didac
Guest
Hola Luís, He hecho un arduino que me mesura dos tiradas de 100m cada una con cable de 3×0.22mm2 y con una sonda DS18B20 cada 25m. En vez de utilizar un relé para ir alternando el cable de señal, tal i como dice el manual que me enviaste, he utilizado este protocolo. Y me funciona bien. #define ONE_WIRE_BUS 5 OneWire oneWire(ONE_WIRE_BUS); DallasTemperature sensors(&oneWire); #define ONE_WIRE_BUS2 6 OneWire oneWire2(ONE_WIRE_BUS2); DallasTemperature sensors2(&oneWire2); El problema es que las sondas DS18B20 que he encontrado en Aliexpress solo aguantan hasta 130 oC y yo necesito que me aguanten como mínimo 160 oC. Las tiendas que… Read more »
wpDiscuz