Hay una gran variedad de sensores de temperatura compatibles con Arduino, ESP32, ESP8266 y otras placas de desarrollo. Por lo tanto, puede ser difícil elegir el sensor más adecuado para su proyecto. En este artículo, vamos a comparar 6 sensores de temperatura ampliamente utilizados: DHT11, DHT22, LM35, DS18B20, BME280 y BMP180.
Compararemos los sensores en cuanto a protocolo de comunicación, rango de temperatura, precisión, facilidad de uso y mucho más.
También realizamos un sencillo experimento en el que medimos la temperatura en el mismo entorno utilizando todos los sensores de temperatura a lo largo del tiempo. Con este experimento pudimos ver cómo reaccionan los sensores a los cambios de temperatura. Hemos realizado este experimento durante aproximadamente 36 horas y te mostraremos los resultados más adelante en este artículo.
Lectura recomendada: 9 sensores de temperatura compatibles con Arduino para tus proyectos de electrónica
Comparación de sensores de temperatura: DHT11 vs DHT22 vs LM35 vs DS18B20 vs BME280 vs BMP180
Para una rápida comparación de los sensores, hemos elaborado la siguiente tabla que muestra la información más importante a la hora de seleccionar un sensor de temperatura, a saber: protocolo de comunicación, tensión de alimentación, rango de temperatura y precisión.
Nota: la tabla se desplaza horizontalmente tanto en ordenador de sobremesa como en tableta y móvil.
Sensor | DHT11 | DHT22 (AM2302) | LM35 | DS18B20 | BME280 | BMP180 |
Medidas | Temperatura Humedad |
Temperatura Humedad |
Temperatura | Temperatura | Temperatura Humedad Presión |
Temperatura Presión |
Comunicación protocolo |
Unhilo | Un hilo | Analógico | Un hilo | I2C SPI |
I2C |
Suministro tensión |
3 a 5.5V DC | 3 a 6V DC | 4 a 30 V DC | 3 a 5,5V DC | 1,7 a 3,6V (para el chip) 3,3 a 5V para la placa | 1,8 a 3,6V (para el chip) 3.3 a 5V para la placa |
Rango de temperatura | 0 a 50ºC | -40 a 80ºC | -55 a 150ºC | -55 a 125ºC | -40 a 85ºC | 0 a 65ºC |
Exactitud | +/- 2ºC (a 0 a 50ºC) | +/- 0.5ºC (a -40 a 80ºC) | +/-0,5ºC (a 25ºC) | +/-0,5ºC (a -10 a 85ºC) | +/-0,5ºC (a 25ºC) | +/-0.5ºC (a 25ºC) |
Soporte (Arduino IDE) |
Librería DHT Adafruit Librería de sensores unificados Adafruit |
Adafruit DHT Library Adafruit Unified Sensor Library |
analogRead() | DallasTemperature OneWire |
Adafruit BME280 library Adafruit Unified Sensor Library |
Adafruit BME085 Adafruit Unified Sensor Library |
Support (MicroPython) |
Módulo dht (incluido en el firmware de MicroPython) | Módulo dht (incluido en el firmware de MicroPython) | de machine import ADC ADC().read |
módulo ds18b20 (incluido en el firmware de MicroPython) | BME280 Adafruit Library | Módulo BMP180 |
¿Dónde comprar? | Comprobar precios | Comprobar precios | Comprobar precios | Comprobar precios Comprobar precios (a prueba de agua) |
Comprobar precios | Comprobar precios |
DHT11 vs DHT22 (AM2302)
El DHT11 y el DHT22 (AM2302) son sensores de temperatura digitales que miden la temperatura y la humedad. Tienen un aspecto muy similar y funcionan de la misma manera, pero tienen diferentes especificaciones.
Ambos sensores pueden ser alimentados con 3,3V o 5V. Por lo tanto, puede utilizarlos fácilmente en sus proyectos de Arduino o ESP.
El sensor DHT22 tiene una mejor resolución y un mayor rango de medición de temperatura y humedad. Sin embargo, es un poco más caro y sólo puedes solicitar lecturas con un intervalo de 2 segundos.
El DHT11 es ligeramente más barato, tiene un rango más pequeño y es menos preciso. Pero puede obtener lecturas del sensor cada segundo.
A pesar de sus diferencias, funcionan de forma similar, y puede utilizar el mismo código para leer la temperatura y la humedad. Sólo tiene que seleccionar en el código el tipo de sensor que está utilizando.
Así que, si está dispuesto a gastar un dólar más, le recomendamos el DHT22 sobre el DHT11.
Tenemos varias guías sobre cómo utilizar los sensores DHT11 y DHT22:
- ESP32 (Arduino IDE) con el sensor de temperatura y humedad DHT11/DHT22
- ESP8266 (Arduino IDE) DHT11/DHT22 Temperature and Humidity Web Server
- Arduino con DHT11/DHT22 Sensor de temperatura y humedad
- ESP32/ESP8266 (MicroPython) con DHT11/DHT22 Web Server
LM35, LM335 y LM34
Los LM35, LM335 y LM34 son sensores lineales de temperatura que emiten una tensión proporcional al valor de la temperatura. El LM35 viene calibrado en grados Celsius, el LM335 en Kelvin y el LM34 en Fahrenheit. Así que, dependiendo de las unidades de temperatura que vayas a utilizar en tu proyecto, uno de estos sensores puede ser más práctico que el otro.
Recomendamos utilizar el LM35 o el LM34 en lugar del LM335, porque restar un número grande a las medidas del LM335 para convertir la temperatura de Kelvin puede comprometer la precisión de los resultados.
Según la hoja de datos, los sensores LM35 y LM34 requieren muy poca corriente para funcionar, unos 60uA. Esto se traduce en un autocalentamiento muy bajo (alrededor de 0,08ºC en aire quieto), lo que significa que las mediciones de temperatura no se verán afectadas por el propio sensor.
Para leer la temperatura de estos sensores sólo tienes que leer la tensión de salida del sensor utilizando un pin analógico. Si usas un Arduino, sólo tienes que usar la función analogRead() y obtendrás lecturas de temperatura con dos puntos decimales.
Así que, si necesitas un sensor barato y fácil de usar para monitorizar la temperatura, el LM35 puede ser una buena opción. Además, como consume muy poca energía, es genial para proyectos portátiles, donde se requiere un bajo consumo de energía.
Aprende a utilizar los sensores de temperatura LM35, LM335 y LM34 con Arduino:
- Guía para sensores de temperatura LM35, LM335 y LM34 con Arduino
Sensor de temperatura DS18B20
El sensor de temperatura DS18B20 es un sensor de temperatura digital de un solo cable. Esto significa que sólo requiere una línea de datos (y GND) para comunicarse con sus microcontroladores.
Puede ser alimentado por una fuente de alimentación externa o puede derivar la energía de la línea de datos (llamado «modo parásito»), lo que elimina la necesidad de una fuente de alimentación externa.
Cada sensor de temperatura DS18B20 tiene un código serial único de 64 bits. Esto le permite conectar varios sensores al mismo cable de datos. Por lo tanto, puede obtener la temperatura de múltiples sensores utilizando un solo GPIO.
Además, la resolución del sensor de temperatura puede establecerse en 9, 10, 11 o 12 bits que corresponden a incrementos de 0,5°C, 0,25°C, 0,125°C y 0,0625°C, respectivamente. La resolución por defecto en el encendido es de 12 bits.
El sensor de temperatura DS18B20 también está disponible en versión resistente al agua, ideal para proyectos en exteriores o para medir la temperatura de líquidos.
Puede seguir nuestras guías para aprender a utilizar el sensor de temperatura DS18B20 con el ESP32, ESP8266 y Arduino utilizando Arduino IDE o MicroPython:
- ESP32 (Arduino IDE) Sensor de temperatura DS18B20 (simple, múltiple, servidor web)
- ESP8266 (Arduino IDE) Sensor de temperatura DS18B20 (simple, múltiple, Web Server)
- ESP32 y ESP8266 (MicroPython) con sensor de temperatura DS18B20
- Arduino con sensor de temperatura DS18B20
BME280 vs BMP180
El BME280 y el BMP180 son sensores barométricos, lo que significa que leen la presión atmosférica. El BME280 también está equipado con un sensor de temperatura y de humedad, y el BMP180 con un sensor de temperatura. Dado que la presión cambia con la altitud, estos sensores también pueden utilizarse para estimar la altitud.
En cuanto al rango de temperatura, el BME280 tiene un rango de medición más amplio: de -40 a 85ºC, mientras que el BMP180 sólo mide de 0 a 65ºC. Hay que tener en cuenta que el módulo BME280 se autocalienta un poco, por lo que las mediciones de temperatura pueden estar 1 ó 2 grados por encima del valor real de la temperatura.
El BME280 puede utilizar el protocolo de comunicación I2C o SPI mientras que el BMP180 sólo puede utilizar la comunicación I2C.
El sensor BME280 es más caro pero tiene más funcionalidades. Por ejemplo, puedes construir un proyecto de estación meteorológica sólo con este sensor. Pero si no te interesa medir la presión o la humedad, puedes conseguir un sensor de temperatura más barato.
Interfectar estos sensores con Arduino, ESP8266 y ESP32 es muy fácil gracias a las librerías de Adafruit.
Puedes utilizar nuestras guías para aprender a utilizar estos sensores:
- BMP180:
- Arduino con el sensor barométrico BMP180
- ESP32 (Arduino IDE) con el sensor barométrico BMP180
- BME280:
- ESP32 (Arduino IDE) con Sensor BME280 (Presión, Temperatura, Humedad)
- ESP8266 (Arduino IDE) con BME280 (Presión, Temperatura, Humedad)
- Arduino con Sensor BME280(Presión, Temperatura, Humedad)
También tenemos otros proyectos con el BME280 que pueden gustarte:
- Datalogger de estación meteorológica de bajo consumo usando ESP8266 y BME280 con MicroPython
- Servidor web ESP32 con BME280 – Mini estación meteorológica
- ESP32/ESP8266 Insertar datos en base de datos MySQL usando PHP y Arduino IDE
Testing de todos los sensores de temperatura
Este experimento registró las lecturas de temperatura de diferentes sensores de temperatura a lo largo del tiempo en las mismas condiciones.
Cableamos todos los siguientes sensores de temperatura a un Arduino Mega:
- DHT11
- DHT22
- LM35
- 2x DS18B20 en el mismo bus de datos
- BME280
- BMP180
Los datos se grabaron en una tarjeta microSD utilizando un módulo de tarjeta microSD. El experimento se ejecutó durante aproximadamente 36 horas y las lecturas de temperatura se registraron cada 5 minutos.
Cableamos los pines de datos de los sensores de temperatura a los siguientes pines en Arduino Mega:
- DHT11: Pin 11
- DHT22: Pin 12
- DS18B20: Pin 14
- LM35: Pin A0
- BME280: software SPI en estos pines: Pin 4 (MISO), Pin 5 (CS), Pin 6 (SCK), Pin 7 (MOSI)
- BMP180: Pin 20 (SDA) y Pin 21 (CSL)
El módulo de la tarjeta microSD se conectó por hardware SPI: Pin 51 (MOSI), Pin 50 (MISO), Pin 52 (SCK), Pin 53 (CS).
Este es el código que se ejecuta en el Arduino Mega.
/* * Rui Santos * Complete Project Details https://RandomNerdTutorials.com */#include "DHT.h"#include <OneWire.h>#include <DallasTemperature.h>#include <Wire.h>#include <SPI.h>#include <Adafruit_Sensor.h>#include <Adafruit_BME280.h>#include <Wire.h>#include <Adafruit_BMP085.h>#include <SD.h> // for the SD cardconst int DHT11sensorPin = 11; const int DHT22sensorPin = 12; DHT dht11(DHT11sensorPin, DHT11);DHT dht22(DHT22sensorPin, DHT22);float DHT11temperature;float DHT22temperature;const int DS18B20sensorPin = 14;OneWire oneWire(DS18B20sensorPin);DallasTemperature ds18b20(&oneWire);float DS18B20temperature1;float DS18B20temperature2;const int BME_SCK = 6;const int BME_MISO = 4;const int BME_MOSI = 7;const int BME_CS = 5;Adafruit_BME280 bme280(BME_CS, BME_MOSI, BME_MISO, BME_SCK);Adafruit_BMP085 bmp180; const int LM35sensorPin = A0; float LM35sensorValue;float LM35voltageOut;float LM35temperature;const int chipSelectSDCard = 53; File myFile;void setup() { Serial.begin(9600); dht11.begin(); delay(2000); dht22.begin(); ds18b20.begin(); bme280.begin(); bmp180.begin(); pinMode(LM35sensorPin, INPUT); if(!SD.begin(chipSelectSDCard)) { Serial.println("SD card initialization failed!"); return; } Serial.println("SD card initialization done."); myFile=SD.open("DATA.txt", FILE_WRITE); if (myFile) { Serial.println("File opened ok"); // print the headings for our data myFile.println("DHT11,DHT22,DS18B20-1,DS18B20-2,BME280,BMP180,LM35"); } myFile.close(); }void loop() { /*-------------------------------------------------------*/ //DHT11 DHT11temperature = dht11.readTemperature(); if (isnan(DHT11temperature)) { Serial.println("Failed to read from DHT11 sensor!"); return; } Serial.print("Temperature DHT11(ºC): "); Serial.println(DHT11temperature); /*-------------------------------------------------------*/ //DHT22 DHT22temperature = dht22.readTemperature(); if (isnan(DHT22temperature)) { Serial.println("Failed to read from DHT22 sensor!"); return; } Serial.print("Temperature DHT22(ºC): "); Serial.println(DHT22temperature);/*-------------------------------------------------*/ //DS18B20 ds18b20.requestTemperatures(); DS18B20temperature1 = ds18b20.getTempCByIndex(0); DS18B20temperature2 = ds18b20.getTempCByIndex(1); Serial.print("Temperature DS18B20-1(ºC): "); Serial.println(DS18B20temperature1); Serial.print("Temperature DS18B20-2(ºC): "); Serial.println(DS18B20temperature2);/*-------------------------------------------------*///BME280 Serial.print("Temperature BME280(ºC): "); Serial.println(bme280.readTemperature());/*-------------------------------------------------*///BMP180 Serial.print("Temperature BMP180(ºC): "); Serial.println(bmp180.readTemperature());/*-------------------------------------------------*/ //LM35 SENSOR LM35sensorValue = analogRead(LM35sensorPin); LM35voltageOut = (LM35sensorValue * 5000) / 1024; // calculate temperature for LM35 (LM35DZ) LM35temperature = LM35voltageOut / 10; Serial.print("Temperature LM35(ºC): "); Serial.println(LM35temperature); Serial.println(""); myFile = SD.open("DATA.txt", FILE_WRITE); if (myFile) { Serial.println("File open with success"); myFile.print(DHT11temperature); myFile.print(","); myFile.print(DHT22temperature); myFile.print(","); myFile.print(DS18B20temperature1); myFile.print(","); myFile.print(DS18B20temperature2); myFile.print(","); myFile.print(bme280.readTemperature()); myFile.print(","); myFile.print(bmp180.readTemperature()); myFile.print(","); myFile.print(LM35temperature); myFile.println(","); } myFile.close(); delay(6000);}
Ver código en bruto
Nota: para poder compilar y ejecutar este código, debes instalar en tu IDE de Arduino todas las librerías de sensores que se mencionan en la tabla comparativa del principio de este artículo.
Resultados: Comparación de las lecturas de temperatura
Después de aproximadamente 36 horas, retiramos la tarjeta microSD y copiamos los resultados en una hoja de cálculo. Hemos trazado todas las lecturas para comparar mejor las mediciones de los diferentes sensores de temperatura.
Este gráfico no tiene un grupo de control (no hemos utilizado un sensor de temperatura calibrado), pero tenemos una idea de cómo se comportan estos sensores.
Si se observa con detenimiento los gráficos, el BME280 midió valores ligeramente más altos que los otros sensores de temperatura. Este comportamiento es normal, y así se describe en la hoja de datos. El módulo se autocalienta un poco y las mediciones de temperatura pueden estar 1 o 2 grados por encima del valor real de la temperatura.
Sin embargo, el BME280 es también el sensor de temperatura que dio lecturas de temperatura más estables sin muchas oscilaciones entre las lecturas. Esto tiene que ver con la resolución del sensor. Puede detectar cambios de hasta 0,01ºC.
En el caso de los sensores de temperatura DS18B20, podemos ver algunas oscilaciones entre las lecturas y también se nota que la resolución no es tan buena como la del BME280. Además, el sensor de temperatura DS18B20 fue el único que dio algunas lecturas «nulas» a lo largo del experimento. Hemos medido dos sensores de temperatura DS18B20 en la misma línea de datos y uno de los sensores falló en la lectura de la temperatura 6 veces a lo largo del experimento (durante 36 horas).
El DHT22 y el BMP180 se comportan de forma muy similar con pocas oscilaciones. El DHT11 no pudo detectar pequeños cambios de temperatura, ya que su resolución es de 1ºC.
Por último, el sensor de temperatura LM35 detectó cambios de temperatura entre 24ºC y 26ºC pero con muchas oscilaciones entre las mediciones.
Esta tabla comparativa de los diferentes sensores de temperatura muestra claramente las diferencias entre cada sensor. Es más fácil entender cómo funcionan y si serán adecuados para los proyectos que quieres construir.
Envolviendo
En este artículo hemos comparado varios sensores de temperatura que puedes usar con el ESP32, ESP8266, Arduino y otras placas de desarrollo. Todos estos sensores miden la temperatura, pero se comportan de manera diferente cuando se ponen a prueba en el mismo entorno y al mismo tiempo.
Esperamos que hayas encontrado este artículo útil y que te ayude a elegir el mejor sensor de temperatura para los requisitos de tu proyecto.
También te puede gustar leer:
- 9 sensores de temperatura compatibles con Arduino para tus proyectos de electrónica
- ESP32/ESP8266 Traza las lecturas del sensor en gráficos en tiempo real
- Inscríbete en nuestros cursos de electrónica y eBook