Hacklab ASU logo Hacklab ASUHacer, reparar, aprender juntos
Proyectos

Termómetro con Arduino y sensor DS18B20 paso a paso

Quieres saber la temperatura real del agua de un acuario, de una nevera vieja o de la habitación donde duerme el servidor, y el sensor barato que compraste marca dos grados de más o se queda clavado en un número absurdo.

An Arduino board on a breadboard wired to a waterproof steel temperature probe dipped in a glass of ice water on a workbench

Quieres saber la temperatura real del agua de un acuario, de una nevera vieja o de la habitación donde duerme el servidor, y el sensor barato que compraste marca dos grados de más o se queda clavado en un número absurdo. Montar un termómetro con Arduino y el sensor DS18B20 resuelve casi todos esos casos por menos de cinco euros, con una precisión de medio grado y un cable que puede ir sumergido. El problema es que tiene un par de detalles de montaje que, si se te pasan, te hacen perder una tarde entera.

Esta guía es la que usamos en el taller cuando alguien se estrena con el sensor: materiales, conexión, código explicado línea a línea y los fallos típicos con su solución.

Por qué el DS18B20 para un termómetro con Arduino

El DS18B20 es un sensor digital de temperatura que habla por el bus 1-Wire. Eso significa que usa un solo pin de datos, y que en ese mismo pin puedes colgar varios sensores a la vez, cada uno con su dirección única de 64 bits. Sus cifras principales:

CaracterísticaValor
Rango de medidade -55 °C a 125 °C
Precisión±0,5 °C entre -10 °C y 85 °C
Resoluciónconfigurable de 9 a 12 bits (0,5 °C a 0,0625 °C)
Tiempo de conversión a 12 bitsunos 750 ms
Alimentaciónde 3 V a 5,5 V
Precio orientativode 1,5 € a 3 € según formato

Se vende en dos formatos: el encapsulado TO-92, que parece un transistor, y la sonda impermeable con cable de un metro y punta de acero inoxidable. Para líquidos, tierra de macetas o exteriores, la sonda es la opción obvia. Si ya montaste nuestro riego automático para macetas con Arduino, añadir una sonda en la tierra es un complemento muy útil.

Materiales que necesitas

  • Un Arduino Uno, Nano o compatible
  • Un sensor DS18B20, en sonda impermeable o en TO-92
  • Una resistencia de 4,7 kilohmios
  • Una protoboard y unos cables dupont
  • Opcional: una pantalla LCD de 16x2 con adaptador I2C

Conexión del sensor paso a paso

El DS18B20 tiene tres patillas: tierra, datos y alimentación. En el TO-92, mirando la cara plana con las patillas hacia abajo, el orden de izquierda a derecha es GND, DQ (datos) y VDD. En la sonda impermeable los colores más habituales son rojo para VDD, negro para GND y amarillo para datos, aunque algunos fabricantes usan blanco o azul para la señal. Si dudas, compruébalo con el polímetro antes de alimentar.

  1. Conecta GND del sensor a GND del Arduino.
  2. Conecta VDD del sensor a 5 V.
  3. Conecta el pin de datos del sensor al pin digital 2 del Arduino.
  4. Coloca la resistencia de 4,7 kilohmios entre el pin de datos y 5 V. Esta es la resistencia de pull-up que necesita el bus 1-Wire.

Ese último paso es el que más se olvida. Sin la resistencia, el sensor no responde y la librería devuelve un valor de error.

El código, explicado sin rodeos

Desde el gestor de librerías del IDE de Arduino instala dos librerías: OneWire, de Paul Stoffregen, y DallasTemperature, de Miles Burton. La segunda se apoya en la primera y simplifica mucho el trabajo.

El programa tiene muy pocas piezas:

  1. Incluyes las dos librerías al inicio del sketch.
  2. Creas un objeto OneWire indicando el pin 2, y después un objeto DallasTemperature que recibe ese bus. Por ejemplo, llamas al primero bus y al segundo sensores.
  3. En setup() abres el puerto serie a 9600 baudios y llamas a sensores.begin().
  4. En loop() llamas a sensores.requestTemperatures() para que el sensor haga la conversión.
  5. Lees el resultado con sensores.getTempCByIndex(0), que devuelve la temperatura en grados Celsius como número decimal.
  6. Imprimes el valor por el monitor serie y esperas un segundo con delay(1000).

Abre el monitor serie y deberías ver lecturas como 21.44 o 21.50 cada segundo. Agarra la sonda con la mano y verás cómo sube en pocos segundos. Si tienes varios sensores en el mismo pin, usa los índices 0, 1, 2 y siguientes, o mejor aún, lee la dirección de cada uno con getAddress() para no confundirlos si un día cambias el orden.

Añadir una pantalla LCD

Con una LCD de 16x2 con adaptador I2C solo necesitas cuatro cables más: GND, 5 V, SDA a A4 y SCL a A5 en el Uno. Con la librería LiquidCrystal_I2C y la dirección 0x27, que es la más común, imprimes la temperatura en la primera fila y la mínima y máxima del día en la segunda. Si quieres guardar la hora de cada lectura, combina este montaje con nuestro reloj con Arduino y el módulo DS3231.

Que sea digital no significa que no haya que calibrarlo

En muchos foros se lee que el DS18B20 no necesita calibración porque es digital y viene ajustado de fábrica. No estamos de acuerdo. Los ±0,5 °C del datasheet son el margen máximo, y en la práctica hemos visto sondas baratas, muchas de ellas clones, que se desviaban hasta un grado entero. Para un termómetro de salón da igual. Para controlar la fermentación de una cerveza casera o un acuario tropical, no.

La prueba más sencilla es el baño de hielo. Llena un vaso con hielo picado y agua del grifo, remueve durante dos minutos y mete la sonda en el centro sin tocar el fondo. Debería marcar muy cerca de 0 °C. Si marca 0,6 °C, resta esa diferencia en el código. Con dos sensores de lotes distintos, compáralos en el mismo vaso y quédate con el más fiel.

Fallos típicos y cómo resolverlos

  • Lee -127 °C. El Arduino no encuentra el sensor. Revisa la resistencia de pull-up, el cable de datos y que el pin del código coincida con el del montaje.
  • Lee 85 °C fijo. Es el valor de encendido del sensor. Suele indicar que la lectura se hace antes de terminar la conversión o que la alimentación es inestable.
  • Lecturas que saltan con cables largos. A partir de unos 5 metros, baja la resistencia a 2,2 kilohmios y usa cable trenzado.
  • El sensor se calienta. Probablemente has invertido VDD y GND. Desconéctalo enseguida; a veces sobrevive.

Con esto ya tienes un termómetro fiable. Si quieres medir también humedad y presión y enviar los datos por WiFi, nuestra estación meteorológica casera con ESP32 y BME280 es el siguiente paso natural.

Preguntas frecuentes

¿Qué resistencia necesita el DS18B20?

Necesita una resistencia de pull-up de 4,7 kilohmios entre el pin de datos y la alimentación. Con cables muy largos o muchos sensores en el mismo bus conviene bajarla a 2,2 kilohmios. Algunos módulos ya la traen soldada en la placa.

¿Se pueden conectar varios DS18B20 al mismo pin de Arduino?

Sí, es una de sus grandes ventajas. Cada sensor tiene una dirección única de 64 bits y todos comparten el mismo cable de datos y la misma resistencia. Puedes leerlos por índice o, mejor, por su dirección.

¿Por qué mi DS18B20 marca -127 grados?

Ese valor indica que el Arduino no detecta el sensor en el bus. Casi siempre se debe a que falta la resistencia de pull-up, a un cable de datos suelto o a un pin mal definido en el código. Revisa la conexión con el polímetro antes de cambiar el sensor.

LB
Lucía Benítez

Lucía empezó reparando radios viejas en la mesa de la cocina y hoy escribe sobre circuitos, Arduino y radiofrecuencia sin dar nada por sabido.

More posts by Lucía

More in Proyectos

01doorganico 084goad 3hot8 4465456 after5internprogram ahandfulofblessings ahmadpc ahomcybersecurity allodialresources annodex antiquesandperiodcollectibles aotc asianworldkashmir beedlectrics bloggertemplatefree bluefeatheragency bodyweightsolution campaign08blog carfixadvisor catstreetcollective cbstvsports cnfanspurchasing committeeof500yearsofdignityandresistance covertopsdjs cs-kaiyuangame cuestacomunicaciontotal cxoutlet dancebetgame deskgearhub destinyvillastay detectmagazine di33 diamondsteelbuildings donmo dyanadropship emarsysfinance emimattl escapechan eskitarih evautoplay everythingweddings-orlando farmzone feedviewerapp foxstudiosscratch gamevui123 gleasongrade greetingsday haskell iw-kaiyun jagoanproperti jilidskripsi joltbusinessfinance juegodepokergratis juegospucca kaeru-festival latestmehndidesigns lestanzediottaviano litemagazines localcommunityhero lustrsazan mariashebets menswheels newwebstechs1 nikkit ootheday oxigenvpn plurfitness prefetial probudgetcarpetcleaning psychicmrsmartin pyaten qvantor rejoignezlogis rexzbot riselayouts ruchin rwxqsgd5 sakaltime shibiaowang shop-bot skrtips strcoding tetapatrium topselller uneplanteartificielle vipertechcr webtech1223411 wo-kygaming yamaha-mekar yeknava yoybuysheets zenunwa yamaha-mekar jilidskripsi ankertoto ankertoto ankertoto ankertoto