Guías · 20 min de lectura

Tipos de sensores de temperatura para Arduino: comparativa

Tipos de sensores de temperatura para Arduino: DHT11, DHT22, DS18B20, LM35, NTC, BME280, MAX6675 y MLX90614 comparados por precisión, rango, cable y precio.

Elegir bien entre los distintos tipos de sensores de temperatura para Arduino importa más de lo que parece: un DHT11 y un DS18B20 en la misma habitación pueden diferir 2 °C, y es perfectamente posible derretir un sensor por intentar medir un horno a 300 °C con el modelo equivocado. En la electrónica de afición dominan ocho sensores de temperatura: DHT11, DHT22, DS18B20, LM35, el termistor NTC, BME280, MAX6675 (termopar tipo K) y MLX90614 (infrarrojo sin contacto). Cada uno tiene un rango de medida, una precisión, una forma de conexión y un precio diferentes. Cuál es el adecuado depende de lo que vayas a medir: ¿el aire de una habitación, agua, un horno o un motor girando que no puedes tocar?

En esta guía ponemos los ocho sensores lado a lado en dos grandes tablas: rango de medida, precisión, resolución, velocidad de lectura, interfaz, tensión de alimentación, longitud de cable y precio relativo. Después verás cómo funciona cada uno, sus puntos fuertes y débiles, las conexiones para Arduino Uno, ESP32 y Raspberry Pi Pico, código de ejemplo para el NTC, el MAX6675 y el MLX90614, un montaje de prueba que enfrenta a tres sensores entre sí y cuál elegir para cada proyecto. Para la mayoría de estos sensores también tenemos tutoriales detallados; encontrarás los enlaces en cada sección.

Módulo sensor de temperatura y humedad DHT11
Módulo sensor de temperatura y humedad DHT11
Módulo sensor de temperatura y humedad DHT22 (AM2302)
Módulo sensor de temperatura y humedad DHT22 (AM2302)
Sonda de temperatura DS18B20 impermeable
Sonda de temperatura DS18B20 impermeable
Módulo sensor de temperatura, humedad y presión BME280
Módulo sensor de temperatura, humedad y presión BME280
Termistor NTC
Termistor NTC

¿En qué fijarte al elegir un sensor de temperatura?

Antes de comparar sensores tienes que leer bien los términos de las hojas de datos. La pareja que más se confunde es precisión y resolución. La precisión indica lo cerca que está tu lectura de la temperatura real; la resolución es el paso más pequeño que el sensor puede distinguir. El BME280 da la temperatura en pasos de 0,01 °C, pero su precisión ronda ±1 °C; así que las dos últimas cifras de los 23,47 °C de tu pantalla sirven para seguir cambios pequeños, pero no te dicen la temperatura real con esa exactitud. Al elegir, fíjate en estos siete criterios:

  • Rango de medida: El sensor debe cubrir con holgura la temperatura más baja y la más alta que quieras medir. El DHT11 no ve por debajo de cero; para una nevera necesitas un DS18B20 y para un horno, un termopar.
  • Precisión: Para un termómetro de habitación vale ±2 °C, pero un acuario o una incubadora necesitan ±0,5 °C.
  • Interfaz: Los sensores analógicos necesitan un pin del ADC; los digitales, uno o varios pines digitales y casi siempre una librería. Los pines libres de tu placa determinan cuántos sensores puedes conectar.
  • Longitud del cable: Si el sensor va a estar a 5 metros de la placa, en el jardín o en el fondo de un depósito, los sensores analógicos e I2C sufren; 1-Wire y el protocolo de un solo hilo de los DHT aguantan mucho mejor las distancias largas.
  • Tiempo de respuesta: Una sonda con funda de acero o un DHT con su carcasa de plástico tardan segundos o incluso minutos en reflejar un cambio brusco; un NTC pequeño y desnudo es mucho más rápido.
  • Medidas adicionales: Si también necesitas la humedad, te sirve un DHT22 o un BME280; si además necesitas presión y altitud, el BME280 lo hace todo en un solo módulo.
  • Tensión de alimentación: En el ESP32 y la Pico, que funcionan a 3,3 V, ten cuidado con sensores como el LM35, que necesitan al menos 4 V, y evita que llegue más de 3,3 V a la entrada del ADC.

Tabla comparativa de 8 sensores de temperatura

La primera tabla resume el rendimiento de medida y la segunda, la conexión y el coste. Los valores proceden de las hojas de datos; salvo que se indique lo contrario, la precisión es la de alrededor de la temperatura ambiente y empeora hacia los extremos del rango.

SensorRango de medidaPrecisiónResoluciónVelocidad de lectura
DHT110 … +50 °C±2 °C1 °C1 por segundo
DHT22 (AM2302)−40 … +80 °C±0,5 °C0,1 °C1 cada 2 segundos
DS18B20−55 … +125 °C±0,5 °C (de −10 a +85 °C)0,0625 °C (12 bits)750 ms (12 bits), 94 ms (9 bits)
LM35DZ0 … +100 °C (LM35: −55 … +150 °C)Típica ±0,6 °C, garantizada ±1,5 °C0,49 °C en el Uno (ref. 5 V), 0,11 °C (ref. 1,1 V)Instantánea (velocidad del ADC)
NTC 10 kΩ, B 3950−40 … +125 °C (encapsulados en vidrio ≈ 300 °C)A 25 °C: ±0,25 °C (1 %) … ±1 °C (5 %)≈ 0,1 °C a temperatura ambiente en el UnoInstantánea (velocidad del ADC)
BME280−40 … +85 °C±0,5 °C (25 °C), ±1 °C (0 … 65 °C)0,01 °CDecenas por segundo
MAX6675 + termopar tipo K0 … +1023,75 °CUnos pocos °C (convertidor ≈ ±2 °C, unión fría hasta ±3 °C)0,25 °C≈ 4 por segundo (conversión de 0,22 s)
MLX90614Objeto −70 … +380 °C, ambiente −40 … +125 °C±0,5 °C (cerca de la temperatura ambiente)0,02 °CVarias veces por segundo
SensorInterfazAlimentaciónLongitud de cableMedida adicionalPrecio relativo
DHT11Digital de un hilo, 1 pin3–5,5 VHasta 20 mHumedadMuy bajo
DHT22Digital de un hilo, 1 pin3,3–6 VHasta 20 mHumedadMedio
DS18B201-Wire, muchos sensores en 1 pin3,0–5,5 VDecenas de metrosNingunaBajo
LM35Analógica, 1 pin del ADC4–30 VCorta, ≈ 1 m (más larga requiere precauciones)NingunaBajo
NTCAnalógica, 1 pin del ADC con divisor3,3 o 5 V a través del divisorUnos pocos metrosNingunaEl más bajo
BME280I2C (2 pines) o SPIChip 1,71–3,6 V; módulo con regulador 5 VCorta, menos de 50 cmHumedad y presiónMedio
MAX6675SPI, 3 pines (solo lectura)3,0–5,5 VEl cable del termopar puede medir varios metrosNingunaMedio
MLX90614I2C (SMBus), 2 pinesVersión de 3 V o 5 V (el módulo puede llevar regulador)Corta (I2C); mide sin contactoTemperatura ambienteAlto
A grandes rasgos, el orden de precios es este: el más barato es el NTC, seguido del DHT11, el LM35 y el DS18B20; el DHT22 y el BME280 están en la gama media, el módulo MAX6675 con su sonda de termopar cuesta algo más y el MLX90614 es el más caro de la lista. Las copias de sensores baratos son muy comunes; sobre todo en el DS18B20, el LM35 y el BME280, las piezas clónicas pueden no alcanzar la precisión de la hoja de datos. Dejar dos sensores en el mismo sitio y comparar sus lecturas es la forma más sencilla de saber si puedes fiarte del tuyo.

DHT11 y DHT22: temperatura y humedad a la vez

Dentro de la rejilla de plástico de un sensor DHT hay un elemento de humedad (resistivo en el DHT11, capacitivo en el DHT22), un termistor y un pequeño controlador que convierte las medidas en datos digitales. El sensor envía el resultado por una única línea de datos como un paquete de 40 bits: 16 bits de humedad, 16 bits de temperatura y 8 bits de suma de comprobación. Este protocolo no es 1-Wire sino uno propio del fabricante, por eso cada DHT necesita su propio pin. El DHT11 es barato y basta para la temperatura de una habitación, pero su rango de 0–50 °C y su error de ±2 °C lo dejan corto para exteriores y trabajos precisos. Con el mismo cableado, el DHT22 (AM2302) mide de −40 a +80 °C con ±0,5 °C de precisión y da la humedad entre el 0 y el 100 %; a cambio, solo puede hacer una lectura cada dos segundos. Ambos comparten un punto débil, la lentitud: muestran los cambios con retraso porque el aire de la rejilla tiene que equilibrarse antes con el entorno. Para el cableado, la instalación de la librería y el código, consulta Sensor de temperatura y humedad DHT11; el mismo código funciona con el DHT22 cambiando una sola palabra.

Si usas un DHT suelto de 4 patas, debes poner una resistencia pull-up de 10 kΩ entre la línea de datos y VCC; en los módulos de 3 pines esa resistencia ya viene en la placa. Leer un DHT más de una vez cada dos segundos no te da una medida nueva: la librería devuelve el valor anterior o nan.

DS18B20: sumergible, resistente y muchos sensores en un pin

Sonda de temperatura DS18B20 sumergible
Sonda DS18B20 sumergible: un sensor digital dentro de una funda de acero inoxidable con cable de tres hilos (rojo VDD, negro GND, amarillo datos).

El DS18B20 mide la temperatura dentro del chip y la envía como un número digital con una resolución seleccionable de 9 a 12 bits. Mide de −55 a +125 °C, ofrece ±0,5 °C de precisión entre −10 y +85 °C y, gracias al protocolo 1-Wire, puedes conectar decenas de sensores a un único pin de datos; cada uno tiene una dirección única de 64 bits grabada de fábrica. Su versión de sonda sumergible con funda de acero inoxidable no tiene rival para acuarios, depósitos de agua, tuberías de calefacción, tierra y congeladores. Su único requisito es una resistencia pull-up de 4,7 kΩ entre la línea de datos y la alimentación; sin ella, la librería devuelve −127 °C. En modo de 12 bits una conversión tarda 750 ms, así que quizá tengas que bajar la resolución para seguir una temperatura que cambia rápido. El código para varios sensores y la lectura sin bloqueo en el ESP32 están en Sensor de temperatura DS18B20.

LM35: el sensor analógico más sencillo, sin librería

El LM35 convierte la temperatura directamente en tensión: su salida sube 10 mV por grado y da 250 mV a 25 °C. No necesita librería; obtienes el resultado con la fórmula temperatura = analogRead × 5,0 / 1024 × 100. Esa sencillez lo convierte en un primer paso perfecto para aprender el ADC. Sus puntos débiles vienen del mismo sitio: con referencia de 5 V, el ADC de 10 bits del Arduino Uno solo da pasos de unos 0,49 °C, cualquier desviación de los 5 V del USB pasa directamente a la temperatura y, cuanto más largo es el cable, más ruido capta la salida. La mayoría de los LM35 del mercado son LM35DZ, garantizados solo para 0–100 °C. Además necesita al menos 4 V, así que en el ESP32 y la Pico debe alimentarse desde el pin de 5 V. En placas de 3,3 V, una opción analógica más práctica es el TMP36: funciona con 2,7–5,5 V, mide de −40 a +125 °C y también da 10 mV/°C, pero como entrega 500 mV a 0 °C la fórmula pasa a ser temperatura = (V − 0,5) × 100. Su precisión típica es de ±1 °C a 25 °C y ±2 °C en todo el rango. Explicamos paso a paso cómo reducir el paso a 0,11 °C con la referencia interna de 1,1 V en Sensor de temperatura LM35, y cómo funciona el ADC en conversión analógico-digital.

El LM35 y el DS18B20 vienen en el mismo encapsulado TO-92 negro y parecen casi idénticos, pero sus patas de alimentación están invertidas. Un sensor conectado al revés se calienta en pocos segundos hasta no poder tocarlo. Al encenderlo por primera vez, toca el sensor con el dedo; si se calienta, corta la alimentación de inmediato y lee la serigrafía.

Termistor NTC: el sensor más barato y más rápido

Un termistor NTC (Negative Temperature Coefficient, coeficiente de temperatura negativo) es una resistencia cuyo valor baja cuando sube la temperatura. El más habitual en proyectos de afición es el de 10 kΩ a 25 °C con un coeficiente B de 3950 K. Como Arduino no puede medir resistencias directamente, el NTC se conecta formando un divisor de tensión con una resistencia fija y la tensión del punto medio se lee en un pin analógico. Este circuito tiene una ventaja interesante: cuando el divisor se alimenta de los mismos 5 V que sirven de referencia al ADC, la medida es ratiométrica; el resultado no cambia aunque la alimentación sea de 4,8 o 5,1 V. Puedes calcular las tensiones del divisor fácilmente con la calculadora de divisor de tensión.

La resistencia de un NTC cambia con la temperatura de forma exponencial, no lineal, así que no basta con un solo factor como en el LM35. En la práctica se usa la ecuación Beta: 1/T = 1/T0 + (1/B) × ln(R/R0). Aquí T es la temperatura en kelvin, T0 = 298,15 K (25 °C), R0 = 10 kΩ y B = 3950. A temperatura ambiente la sensibilidad es muy alta: según la fórmula B/T², la resistencia cambia alrededor de un 4,4 % por grado. Por eso un NTC con tolerancia del 1 % solo se equivoca unos ±0,25 °C a 25 °C; hacia los extremos del rango, sin embargo, entra en juego la tolerancia del coeficiente B y el error crece. Para más precisión en un rango amplio se usa la ecuación de Steinhart-Hart con tres puntos; tienes los detalles en termistor NTC.

C++ (Arduino IDE)
1const int NTC_PIN = A1;          // bölücünün orta noktası / divider midpoint
2const float R_FIXED = 10000.0;   // 5V ile A1 arasındaki direnç / resistor between 5V and A1
3const float R0 = 10000.0;        // NTC'nin 25 °C'deki direnci / NTC resistance at 25 °C
4const float BETA = 3950.0;       // B katsayısı (veri sayfası) / B coefficient (datasheet)
5const float T0 = 298.15;         // 25 °C Kelvin cinsinden / 25 °C in kelvin
6const int SAMPLES = 16;          // ortalama için ölçüm sayısı / samples to average
7
8void setup() {
9  Serial.begin(9600);
10}
11
12void loop() {
13  long sum = 0;
14  for (int i = 0; i < SAMPLES; i++) {
15    sum += analogRead(NTC_PIN);
16    delay(2);
17  }
18  float adc = sum / (float)SAMPLES;
19
20  if (adc < 1.0 || adc > 1022.0) {                    // kopuk ya da kısa devre / open or shorted
21    Serial.println(F("NTC baglantisini kontrol et / Check the NTC wiring"));
22    delay(1000);
23    return;
24  }
25
26  float r = R_FIXED * adc / (1023.0 - adc);           // NTC direnci (ohm) / NTC resistance (ohm)
27  float invT = 1.0 / T0 + log(r / R0) / BETA;         // Beta denklemi / Beta equation
28  float tempC = 1.0 / invT - 273.15;                  // Kelvin -> °C
29
30  Serial.print(F("R: "));
31  Serial.print(r, 0);
32  Serial.print(F(" ohm  Sicaklik / Temp: "));
33  Serial.print(tempC, 1);
34  Serial.println(F(" C"));
35  delay(1000);
36}

En este circuito la resistencia fija de 10 kΩ va entre 5V y A1, y el NTC entre A1 y GND. Al subir la temperatura, baja la resistencia del NTC y con ella la tensión en A1. El código calcula primero la resistencia del NTC a partir del valor bruto, después la temperatura en kelvin con la ecuación Beta, y la pasa a grados Celsius; la media de 16 lecturas reduce el ruido del ADC a la cuarta parte. A temperatura ambiente, un paso del ADC del Uno equivale a unos 0,09 °C, es decir, una resolución cinco veces mejor que la del LM35 con referencia de 5 V. En los módulos NTC ya montados (por ejemplo, el KY-013) el lado en el que está la resistencia fija cambia de una placa a otra; si la lectura baja al tocar el NTC con algo caliente, invierte la fórmula de la resistencia: r = R_FIXED × (1023 − adc) / adc.

BME280: temperatura, humedad y presión en un solo módulo

El BME280 de Bosch mide temperatura, humedad relativa y presión atmosférica en un chip de solo 2,5 × 2,5 mm y se comunica por I2C (dirección 0x76 o 0x77) o SPI. En temperatura ofrece una resolución de 0,01 °C y una precisión de ±0,5 °C a 25 °C y de ±1 °C entre 0 y 65 °C; puede hacer decenas de lecturas por segundo y en reposo consume muy por debajo de 1 µA. Por eso es ideal para estaciones meteorológicas a pilas. El propio chip no admite más de 3,6 V: los módulos morados de 6 pines suelen ser solo de 3,3 V, mientras que los de 4 pines con regulador pueden conectarse a 5 V. Cuando mide de forma continua, el chip se calienta un poco y puede marcar unas décimas de grado de más; para medir el tiempo atmosférico basta el modo forzado con unas pocas lecturas por minuto. Explicamos cómo funciona el bus I2C en ¿Qué es I2C?.

Parte de los módulos que se venden como BME280 son en realidad un BMP280, que no mide humedad. Los dos son casi iguales a la vista; la forma segura de distinguirlos es leer el registro de identificación (chip ID): el BME280 devuelve 0x60 y el BMP280, 0x58. En ese caso, el ejemplo de la librería Adafruit BME280 muestra el mensaje "Could not find a valid BME280 sensor". El código para leer el ID y la solución están en BME280 y BMP280.

MAX6675 y termopar tipo K: hasta 1000 °C

Un termopar está formado por dos hilos de metales distintos soldados por un extremo. La diferencia de temperatura entre la soldadura (unión caliente) y el punto donde los hilos se conectan al aparato (unión fría) genera una tensión diminuta en los hilos; en un termopar tipo K es de unos 41 µV por grado. El ADC de Arduino no puede leer una tensión tan pequeña y, además, hay que conocer la temperatura de la unión fría. El MAX6675 hace las dos cosas: amplifica la tensión del termopar, aplica la compensación de unión fría midiendo su propia temperatura y entrega el resultado por SPI con 12 bits y 0,25 °C de resolución. Su rango va de 0 a +1023,75 °C, así que es la única opción de esta lista para lugares donde los demás sensores no sobreviven, como un soldador, un horno de pizza, una barbacoa, un horno de cerámica o un escape.

Conoce también los límites del MAX6675: no mide por debajo de 0 °C; el error propio del convertidor es de unos ±2 °C entre 0 y 700 °C, y a eso se suman hasta ±3 °C de error de la compensación de unión fría y la tolerancia del hilo del termopar. Así que espera una precisión global de unos pocos grados; en un horno a 800 °C esa diferencia no importa. Una conversión tarda 0,17–0,22 segundos, por lo que hay que esperar al menos 250 ms entre dos lecturas. Si también necesitas temperaturas negativas, el MAX31855, más moderno (−200 a +1350 °C, 14 bits), es mejor opción. Cómo funciona el bus SPI lo tienes en ¿Qué es SPI?. Instala la librería MAX6675 library de Adafruit desde el Gestor de librerías del Arduino IDE y carga este código:

C++ (Arduino IDE)
1#include "max6675.h"
2
3const int thermoDO  = 4;    // SO: veri çıkışı / data out
4const int thermoCS  = 5;    // CS: çip seçimi / chip select
5const int thermoCLK = 6;    // SCK: saat / clock
6
7MAX6675 thermocouple(thermoCLK, thermoCS, thermoDO);
8
9void setup() {
10  Serial.begin(9600);
11  delay(500);                                   // ilk ölçümü bekle / wait for the first conversion
12}
13
14void loop() {
15  float c = thermocouple.readCelsius();
16  if (isnan(c)) {                               // D2 biti: termokupl açık / bit D2: thermocouple open
17    Serial.println(F("Termokupl takili degil / Thermocouple not connected"));
18  } else {
19    Serial.print(F("Sicaklik / Temp: "));
20    Serial.print(c, 2);
21    Serial.println(F(" C"));
22  }
23  delay(500);                                   // en az 250 ms bekle / wait at least 250 ms
24}
Los cables del termopar tienen polaridad: conecta los marcados con + y − a los bornes con la misma marca del módulo; si los inviertes, la lectura baja mientras la sonda se calienta. No pongas el módulo junto al aparato que se calienta: como el MAX6675 corrige la unión fría con su propia temperatura, cualquier calentamiento de la placa pasa directamente a la medida. Si la sonda no está conectada o el hilo está roto, la librería devuelve nan.

MLX90614: medir la temperatura sin contacto

El MLX90614 es un sensor de temperatura sin contacto que detecta con una termopila la radiación infrarroja que emiten los objetos. Da dos valores a la vez: la temperatura ambiente, que es la de su propio cuerpo (−40 a +125 °C), y la temperatura del objeto, la de la superficie a la que apunta (−70 a +380 °C). Cerca de la temperatura ambiente ofrece ±0,5 °C de precisión y 0,02 °C de resolución; viene calibrado de fábrica, se comunica por I2C (SMBus) en la dirección 0x5A y la velocidad del bus no debe superar los 100 kHz. Es ideal para medir sin tocarlos un motor que gira, un rodamiento, un chip caliente en una placa o una sartén al fuego.

La medida sin contacto tiene dos trucos. El primero es el campo de visión: el sensor mide la media de todo lo que entra en su cono de visión. La versión más común, el MLX90614ESF-BAA, tiene un campo de visión de 90°; eso significa que a 5 cm promedia una zona de unos 10 cm de diámetro. Para medir un objeto pequeño, acerca el sensor o elige una versión de ángulo estrecho como la de 35° (BCC) o 5° (BCI). El segundo es la emisividad: de fábrica, el sensor está ajustado a 1,0. Para pintura mate, plástico, madera, piel y agua este coeficiente está entre 0,9 y 0,98, así que el resultado es casi correcto; las superficies metálicas brillantes, en cambio, emiten muy poca radiación y parecen mucho más frías de lo que están. Pegarles un trozo de cinta negra mate es una solución sencilla y eficaz. Instala la librería Adafruit MLX90614 desde el Gestor de librerías y prueba este código:

C++ (Arduino IDE)
1#include <Wire.h>
2#include <Adafruit_MLX90614.h>
3
4Adafruit_MLX90614 mlx = Adafruit_MLX90614();
5
6void setup() {
7  Serial.begin(9600);
8  if (!mlx.begin()) {                           // varsayılan adres 0x5A / default address 0x5A
9    Serial.println(F("MLX90614 bulunamadi / not found"));
10    while (true) delay(10);
11  }
12  Serial.print(F("Emisivite / Emissivity: "));
13  Serial.println(mlx.readEmissivity(), 2);      // fabrika ayarı 1.00 / factory default 1.00
14}
15
16void loop() {
17  Serial.print(F("Ortam / Ambient: "));
18  Serial.print(mlx.readAmbientTempC(), 2);      // sensör gövdesi / sensor body
19  Serial.print(F(" C   Nesne / Object: "));
20  Serial.print(mlx.readObjectTempC(), 2);       // baktığı yüzey / surface in view
21  Serial.println(F(" C"));
22  delay(500);
23}
El MLX90614 no ve a través del cristal: su filtro óptico deja pasar longitudes de onda de 5,5–14 µm y el vidrio es casi opaco en ese rango. Si apuntas el sensor por una ventana, mides el cristal, no el exterior. Además, al llevarlo de una habitación fría a otra caliente puede medir mal durante unos minutos, hasta que su cuerpo se equilibra.

Resumen de conexiones: Arduino Uno, ESP32 y Raspberry Pi Pico

Sensor y pinArduino UnoESP32Raspberry Pi Pico
DHT11 / DHT22: DATAD2GPIO 27GP15
DS18B20: DQ (+ pull-up de 4,7 kΩ)D3GPIO 4GP22
LM35: Vout (alimentación 5 V)A0GPIO 34 (ADC1)GP26 (ADC0)
NTC: punto medio del divisorA1 (divisor desde 5V)GPIO 35 (ADC1, divisor desde 3V3)GP27 (ADC1, divisor desde 3V3)
BME280: SDA / SCLA4 / A5GPIO 21 / 22GP4 / GP5
MLX90614: SDA / SCLA4 / A5 (mismo bus I2C)GPIO 21 / 22GP4 / GP5
MAX6675: SO / CS / SCKD4 / D5 / D6GPIO 19 / 23 / 18GP16 / GP17 / GP18
Alimentación (VCC)5V (3.3V para el BME280 de 6 pines)3V3 (5V/VIN para el LM35)3V3(OUT) (VBUS para el LM35)

El ESP32 y la Pico funcionan a 3,3 V; si alimentas el divisor del NTC desde 3V3, no puede llegar una tensión peligrosa a la entrada del ADC. En el ESP32, conecta los sensores analógicos solo a pines del ADC1 (GPIO 32–39), porque los del ADC2 no funcionan con el Wi-Fi activado; en cambio, para líneas de datos bidireccionales como las del DHT y el DS18B20, evita los GPIO 34–39, que son solo de entrada. El BME280 (0x76) y el MLX90614 (0x5A) tienen direcciones distintas, así que pueden compartir sin problema los mismos dos cables I2C. Tienes todos los pines de tu placa en la herramienta Pinout y el código de colores de las resistencias pull-up en la calculadora de código de colores.

Prueba comparativa con el ESP32: tres sensores en el mismo sitio

La mejor forma de ver las diferencias entre sensores es con tus propios ojos. El siguiente código para ESP32 lee a la vez un DS18B20, un DHT22 y un BME280 y muestra los resultados como tres líneas separadas en el Serial Plotter del Arduino IDE. Coloca los sensores uno junto a otro en la protoboard, al menos a 10 cm del ESP32; el ESP32 se calienta al funcionar y afecta a cualquier sensor que tenga al lado. El código necesita las librerías OneWire, DallasTemperature, DHT sensor library y Adafruit BME280.

C++ (Arduino IDE)
1#include <OneWire.h>
2#include <DallasTemperature.h>
3#include <DHT.h>
4#include <Wire.h>
5#include <Adafruit_Sensor.h>
6#include <Adafruit_BME280.h>
7
8const int ONE_WIRE_PIN = 4;     // DS18B20 DQ (4,7 kΩ pull-up -> 3V3)
9const int DHT_PIN = 27;         // DHT22 DATA
10
11OneWire oneWire(ONE_WIRE_PIN);
12DallasTemperature ds(&oneWire);
13DHT dht(DHT_PIN, DHT22);
14Adafruit_BME280 bme;            // I2C: SDA GPIO 21, SCL GPIO 22
15bool bmeOk = false;
16
17void setup() {
18  Serial.begin(115200);
19  ds.begin();
20  dht.begin();
21  bmeOk = bme.begin(0x76) || bme.begin(0x77);   // iki adresi de dene / try both addresses
22  if (!bmeOk) Serial.println("BME280 bulunamadi / not found");
23}
24
25void loop() {
26  ds.requestTemperatures();                     // 12 bitte ~750 ms sürer / takes ~750 ms at 12-bit
27  float tDs  = ds.getTempCByIndex(0);           // sensör yoksa -127 / -127 if missing
28  float tDht = dht.readTemperature();           // hata olursa NAN / NAN on error
29  float tBme = bmeOk ? bme.readTemperature() : NAN;
30
31  // Seri Çizici için etiket:değer biçimi / label:value format for the Serial Plotter
32  Serial.printf("DS18B20:%.2f,DHT22:%.1f,BME280:%.2f\n", tDs, tDht, tBme);
33  delay(2000);                                  // DHT22 en fazla 2 sn'de bir / DHT22 at most every 2 s
34}

Primero espera unos minutos y observa cuánto se separan las líneas: diferencias de 0,5–1 °C están dentro de los límites de precisión de estos sensores. Después pon un vaso de agua tibia a su lado o sopla suavemente sobre los tres. El DS18B20 y el BME280 reaccionan en pocos segundos, mientras que la línea del DHT22 se queda claramente atrás por su rejilla de plástico. Si el BME280 se mantiene siempre unas décimas por encima de los demás, es el autocalentamiento del chip. Este pequeño experimento te muestra diferencias que no aparecen en ninguna hoja de datos. Para registrar medidas durante mucho tiempo puedes usar un módulo de tarjeta SD o enviar los datos a Google Sheets.

Medir la temperatura con la Raspberry Pi Pico y MicroPython

El firmware MicroPython de la Pico incluye de serie los módulos dht, onewire y ds18x20, así que no tienes que copiar archivos extra a la Pico para el DHT y el DS18B20. Además, el chip RP2040 tiene un sensor de temperatura interno conectado al canal 4 del ADC. El siguiente código lee los tres juntos:

MicroPython
1from machine import Pin, ADC
2import dht, onewire, ds18x20, time
3
4dht22 = dht.DHT22(Pin(15))                          # DHT22 DATA -> GP15
5ds = ds18x20.DS18X20(onewire.OneWire(Pin(22)))      # DS18B20 DQ -> GP22 (4,7 kΩ pull-up)
6roms = ds.scan()                                    # hattaki sensörler / sensors on the bus
7cpu = ADC(4)                                        # RP2040 dahili sensörü / internal sensor
8
9def cpu_temp():
10    v = cpu.read_u16() * 3.3 / 65535                # ham değer -> volt / raw value -> volts
11    return 27 - (v - 0.706) / 0.001721              # RP2040 veri sayfası formülü / datasheet formula
12
13while True:
14    t_ds = None
15    if roms:
16        ds.convert_temp()                           # ölçümü başlat / start conversion
17        time.sleep_ms(750)                          # 12 bit dönüşüm süresi / 12-bit conversion time
18        t_ds = round(ds.read_temp(roms[0]), 2)
19    try:
20        dht22.measure()
21        t_dht, nem = dht22.temperature(), dht22.humidity()
22    except OSError:                                 # okuma hatası / read error
23        t_dht = nem = None
24    print("DS18B20:", t_ds, "DHT22:", t_dht, "Nem / RH:", nem,
25          "Pico:", round(cpu_temp(), 1))
26    time.sleep(2)

El sensor interno mide la temperatura del chip, no la de la habitación, y pequeñas desviaciones en la referencia del ADC pueden desplazar el resultado varios grados. Por eso no sirve para medir el ambiente, pero sí para vigilar si la placa se está sobrecalentando. No olvides la pull-up de 4,7 kΩ en la línea de datos del DS18B20; las pull-up internas de la Pico se quedan cortas para 1-Wire. Si acabas de conocer la Pico, empieza por ¿Qué es la Raspberry Pi Pico?.

¿Qué sensor de temperatura elegir para cada proyecto?

Proyecto o necesidadSensor recomendado¿Por qué?
Primer proyecto, termómetro de habitaciónDHT11El más barato, también da la humedad; ±2 °C basta para una habitación
Estación meteorológica interior y exteriorBME280 o DHT22Baja hasta −40 °C y da la humedad; el BME280 mide además presión y altitud
Acuario, depósito de agua, agua de calderaSonda sumergible DS18B20Funda inoxidable, ±0,5 °C, cable largo
Nevera y congeladorDS18B20Mide hasta −55 °C; el DHT11 no ve por debajo de cero
Medir muchos puntos (habitaciones, invernadero, tuberías)DS18B20Decenas de sensores en un pin, cada uno con su dirección
Incubadora de huevosDHT22 o BME280±0,5 °C en torno a 37,5 °C y control de humedad a la vez
Horno, barbacoa, soldadorMAX6675 + termopar tipo KAguanta hasta 1000 °C
Hotend de impresora 3D, pack de bateríasTermistor NTCPequeño, barato y rápido; las impresoras 3D usan NTC de 100 kΩ encapsulados en vidrio
Motor, rodamiento, placa de circuito, pieza móvilMLX90614Mide sin contacto
Aprender el ADC y la medida analógicaLM35 o NTCSin librería, funciona con una fórmula

Ideas de proyectos con sensores de temperatura

  • Invernadero inteligente: Mide la temperatura y la humedad del aire con un DHT22 y la temperatura de la tierra con una sonda DS18B20; controla el ventilador y el riego con un módulo de relé. Para el proyecto completo, consulta el proyecto de invernadero inteligente.
  • Calentador de acuario con termostato: Mantén el agua entre 25 y 26 °C con un DS18B20 sumergible; usa una histéresis de 0,5 °C para que el relé no se active y desactive con cada pequeño cambio.
  • Estación meteorológica a pilas: Combina un BME280 con el modo deep sleep del ESP32 y mide cada diez minutos para que el sistema funcione meses con pilas.
  • Termómetro para horno de pizza o barbacoa: Muestra la temperatura del horno con números grandes en una pantalla OLED usando un MAX6675 y una sonda tipo K.
  • Alarma de temperatura de motor sin contacto: Vigila con un MLX90614 la temperatura superficial de un motor o de la cama de una impresora 3D y haz sonar un zumbador al superar un umbral.
  • Domótica: Envía la temperatura de cada habitación a Home Assistant por MQTT con un ESP32 y controla la calefacción en función de ella.
  • Vigilante del congelador: Con un DS18B20, lanza una alarma si el interior del congelador sube por encima de −12 °C y muestra el valor en una pantalla LCD I2C.

Errores frecuentes y cómo solucionarlos

SíntomaCausa probableSolución
DHT: nan o "Failed to read from DHT sensor!"Tipo equivocado en el código (DHT11/DHT22), sin pull-up o lecturas demasiado seguidasCorrige el tipo, añade una pull-up de 10 kΩ, espera 2 segundos entre lecturas
DS18B20: −127 °CSensor no encontrado: sin pull-up, cable defectuoso o pin equivocadoPon 4,7 kΩ entre DQ y VCC, revisa las conexiones
DS18B20: siempre 85 °CLeído antes de terminar la conversión o alimentación insuficienteEspera el tiempo de conversión, alimenta VDD directamente
LM35: valor anormalmente alto, el sensor se calientaPatas de alimentación invertidasCorta la alimentación de inmediato y corrige el orden de las patas
LM35 o NTC: el valor no deja de saltarRuido del ADC, cable largo, alimentación USB inestablePromedia lecturas, añade un condensador de 0,1 µF, acorta el cable
NTC: la temperatura baja al calentarseLa orientación del divisor no coincide con el códigoInvierte la fórmula de la resistencia
BME280: "Could not find a valid BME280 sensor"Dirección equivocada (0x76/0x77) o el chip es en realidad un BMP280Cambia la dirección, lee el chip ID (0x60 / 0x58)
BME280 o DHT: 1–3 °C de másAutocalentamiento, ESP32 o regulador cercanosAleja el sensor de la placa, mide con menos frecuencia, aplica un offset
MAX6675: nanTermopar sin conectar o hilo rotoRevisa los bornes y la sonda
MAX6675: el valor baja al calentarsePolaridad del termopar invertidaIntercambia los cables + y −
MLX90614: el metal brillante parece muy fríoEmisividad bajaPega cinta negra mate o ajusta la emisividad
MLX90614: un objeto pequeño se mide malEl campo de visión es mayor que el objetoAcerca el sensor o usa una versión de ángulo estrecho
Elijas el sensor que elijas, la mayor fuente de error no suele ser el sensor en sí, sino dónde lo colocas. Un sensor al sol, justo al lado de un regulador de tensión o de un ESP32, o encerrado en una caja cerrada mide la temperatura de su propio entorno, no la de la habitación. Aleja el sensor de la placa, ponlo en un sitio ventilado, compáralo una vez con un termómetro de confianza y corrige la diferencia constante en el código. Para suavizar valores que tiemblan, echa un vistazo a los métodos de filtrado de datos de sensores.

En resumen: un DHT22 o un BME280 para habitaciones y meteorología, un DS18B20 para agua y frío, un LM35 o un NTC para aprender la medida analógica y lograr una respuesta rápida, un MAX6675 para altas temperaturas y un MLX90614 para superficies que no puedes tocar son los puntos de partida adecuados. Si quieres conocer también otros tipos de sensores, echa un vistazo a la guía de sensores para Arduino. En la app BlueGrays encontrarás proyectos como la medida de temperatura y humedad con el DHT11, un termómetro con NTC y LCD, un indicador de temperatura con ESP32, DHT22 y LCD, un registrador de temperatura con ESP32 y un riego inteligente, con esquema de circuito y código paso a paso.

Preguntas frecuentes

¿Cuál es el sensor de temperatura más preciso para Arduino?

Entre los sensores de afición, los más precisos cerca de la temperatura ambiente son el DS18B20, el DHT22, el BME280 (a 25 °C) y el MLX90614, todos con ±0,5 °C. El DS18B20 destaca para medidas con cable y sumergibles, y el DHT22 o el BME280 cuando también necesitas la humedad. Elijas el que elijas, compararlo una vez con un termómetro fiable y corregir el desfase en el código mejora mucho la precisión.

¿DHT11 o DHT22: cuál me compro?

Si solo quieres vigilar de forma aproximada la temperatura y la humedad de una habitación, el DHT11 es suficiente. Si necesitas medir en exteriores, bajo cero o con ±0,5 °C de precisión, compra el DHT22; mide de −40 a +80 °C y también da una humedad más precisa. Los dos funcionan con la misma librería y el mismo código; solo cambias el tipo de sensor en el sketch.

¿Cómo mido la temperatura del agua con Arduino?

El mejor sensor para agua es la sonda DS18B20 sumergible con funda de acero inoxidable. Metes la sonda en el agua y conectas el hilo de datos a un pin digital del Arduino con una resistencia pull-up de 4,7 kΩ. El cable y sus empalmes no suelen estar pensados para pasar mucho tiempo en agua caliente, así que sumerge solo la punta de acero.

¿Se pueden medir temperaturas altas como 500 °C con Arduino?

Sí. Con un termopar tipo K y un módulo MAX6675 puedes medir de 0 a unos 1024 °C. La punta del termopar va dentro del horno, mientras que el módulo MAX6675 debe quedarse lejos del calor. Comprueba siempre hasta qué temperatura aguantan la funda y el cable de la sonda que has comprado.

¿Se puede hacer un termómetro sin contacto con Arduino?

Con un MLX90614 puedes construir un termómetro infrarrojo sin contacto conectado a Arduino; la versión estándar ofrece ±0,5 °C de precisión cerca de la temperatura ambiente. Para la temperatura corporal hace falta la versión de precisión médica (±0,2 °C) y la distancia de medida correcta, y aun así este montaje no sustituye a un dispositivo médico. Al medir, asegúrate de que la superficie llene por completo el campo de visión del sensor.

¿Por qué mi sensor de temperatura marca más de la cuenta?

La causa más habitual son fuentes de calor cerca del sensor: un ESP32, un regulador de tensión o la luz del sol. Sensores como el BME280 también se calientan un poco a sí mismos cuando miden de forma continua. Aleja el sensor 10–15 cm de la placa, mide con menos frecuencia y corrige en el código la diferencia constante que quede tras compararlo con un termómetro de confianza.

Ver todos los proyectos
Temperatura y humedad con DHT11
#55Intermedio

Temperatura y humedad con DHT11

¿Qué temperatura hace en tu habitación, y el aire está húmedo o seco? El sensor DHT11 mide la temperatura y la humedad, y el Arduino escribe los valores en una pantalla LCD de dos líneas, actualizándo

4.7(47)
73
Medición de temperatura con NTC y pantalla LCD 2x16
#44Principiante
Premium

Medición de temperatura con NTC y pantalla LCD 2x16

Mide la temperatura del ambiente con un sensor que parece una pequeña cuenta. Esta pieza, llamada NTC, deja pasar la electricidad con más facilidad cuanto más se calienta; el Arduino lee ese cambio, l

4.5(33)
44
ESP32 DHT22 Temperatura y humedad (con pantalla LCD)
#117Intermedio

ESP32 DHT22 Temperatura y humedad (con pantalla LCD)

Se trata de un proyecto que mide la temperatura y la humedad ambientales mediante el sensor DHT22 y las muestra en tiempo real en una pantalla LCD I2C 16x2. Los datos del sensor se leen mediante el protocolo de un solo cable (one-wire) utilizando la biblioteca DHT de Adafruit. Este proyecto constituye la base para estaciones meteorológicas IoT, sistemas de automatización doméstica inteligente o sistemas de monitorización ambiental en invernaderos.

4.8(38)
56
Registrador de Temperatura ESP32 (DHT22 + DS1307 RTC + microSD + OLED)
#144Avanzado
Premium

Registrador de Temperatura ESP32 (DHT22 + DS1307 RTC + microSD + OLED)

¡Construye un registrador de temperatura con marca de tiempo con ESP32! Lee temperatura/humedad del DHT22 cada minuto, obtén la hora real del DS1307 RTC y registra en tarjeta microSD como CSV. El OLED muestra en vivo la temperatura (fuente grande), porcentaje de humedad, marca de tiempo y contador de registros. El archivo /temp_log.csv en la tarjeta SD se abre en Excel, Google Sheets o Python pandas para análisis — perfecto para monitoreo de invernadero, seguimiento de temperatura del hog

4.7(7)
12
Reloj matricial, calendario y estación meteorológica (MAX7219, DS1307)
#85Intermedio
Premium

Reloj matricial, calendario y estación meteorológica (MAX7219, DS1307)

Un panel de texto en movimiento para tu mesa o tu pared que muestra por turnos la hora, la fecha y el clima de la habitación. En la pantalla LED de 8x32 aparece primero la temperatura en grados Celsiu

5.0(50)
66
Estación de riego inteligente
#83Avanzado
Premium

Estación de riego inteligente

Un jardinero que riega solo tus plantas para que no se sequen mientras estás de vacaciones. Un sensor de humedad mide lo mojada que está la tierra; cuando se seca, el Arduino enciende la bomba de agua

5.0(42)
57
Uso de la pantalla LCD con I2C
#32Principiante
Premium

Uso de la pantalla LCD con I2C

Dale a tu Arduino su propia pantalla y haz que escriba su primer mensaje. La pantalla LCD de dos líneas se conecta con solo unos pocos cables; primero aparece un saludo en la línea de arriba, luego un

4.8(53)
70