29/07/2023
En el vasto universo de la electrónica y la automatización, la capacidad de monitorear el ambiente es fundamental para una miríada de aplicaciones. Ya sea que busques controlar la climatización en un hogar inteligente, optimizar las condiciones en un invernadero, asegurar el ambiente ideal en una incubadora o construir tu propia estación meteorológica, medir la temperatura y la humedad relativa ambiental es un punto de partida esencial. Para lograr esto, uno de los componentes más populares y accesibles es el sensor digital DHT11, y su hermano mayor, el DHT22. Este artículo te guiará paso a paso para que puedas integrar estos sensores con tu placa Arduino, aprovechando al máximo la versátil librería DHT.h.

- El Corazón de tu Monitoreo: Sensores DHT11 y DHT22
- Instalando la Librería DHT.h en Arduino IDE
- Midamos Temperatura y Humedad con DHT11 y Arduino
- Ampliando tu Proyecto: DHT con LCD en Arduino
- Preguntas Frecuentes (FAQ)
- ¿Qué es un sensor DHT11/DHT22?
- ¿Por qué necesito una resistencia pull-up para el sensor DHT suelto?
- ¿Cuál es la diferencia principal entre DHT11 y DHT22?
- ¿Cómo sé si la lectura del sensor es correcta?
- ¿Puedo usar el mismo código para DHT11 y DHT22?
- ¿Es necesario el retardo (delay) en la función loop()?
- Conclusión
El Corazón de tu Monitoreo: Sensores DHT11 y DHT22
Si bien es cierto que existen sensores de temperatura individuales, hay situaciones donde la humedad relativa (HR) es tan crítica como la propia temperatura. Pensemos, por ejemplo, en la industria alimentaria: una HR demasiado elevada puede propiciar el crecimiento de hongos y bacterias, arruinando productos y generando pérdidas. En el ámbito de las incubadoras, un control preciso de la HR es vital para el desarrollo óptimo de los organismos. Es en estos escenarios donde los sensores DHT se convierten en tus mejores aliados.
El DHT11 es un sensor digital altamente económico y sorprendentemente fácil de usar, disponible por un precio muy accesible. Lo encontrarás en dos presentaciones principales: el sensor suelto, que generalmente cuenta con cuatro pines, y el sensor montado en un módulo. La diferencia clave entre ellos radica en que el módulo ya incorpora la resistencia pull-up necesaria para su funcionamiento, y en ocasiones, un capacitor de filtro que, aunque no siempre es indispensable, es un buen añadido. Si optas por el sensor suelto, no te preocupes, pues te mostraremos cómo añadir esa resistencia vital.
Existe también una versión mejorada, el DHT22, que, aunque un poco más costoso, ofrece una mayor exactitud y un rango de medición más amplio. La elección entre uno y otro dependerá enteramente de las necesidades específicas de tu proyecto y del nivel de precisión que requieras. A continuación, te presentamos una tabla comparativa para que puedas tomar una decisión informada:
| Parámetro | DHT11 | DHT22 |
|---|---|---|
| Alimentación | 3.3 ~ 5.5 VDC | 3.3 ~ 6 VDC |
| Consumo de corriente (Medición) | 0.3 mA | 1 mA |
| Consumo de corriente (En espera) | 60 µA | 40 µA |
| Tiempo de conversión | 2 s | 2 s |
| Rango de temperatura | 0 a 50 °C | -40 a 80 °C |
| Precisión de temperatura | ± 2 ºC | <± 0.5 ºC |
| Resolución de temperatura | 1 ºC | 0.1 ºC |
| Rango de humedad relativa | 20 a 90% | 0 a 100% |
| Precisión de humedad relativa | ± 5% | ± 2% |
| Resolución de humedad relativa | 1% | 0.1% |
Es crucial que, antes de realizar tu compra o iniciar tu proyecto, consultes siempre la hoja de datos del fabricante (datasheet) para obtener la información más precisa y actualizada sobre el sensor que elijas.
Pines de Conexión del Sensor DHT11/DHT22
Para conectar y operar estos sensores, solo necesitarás tres pines, lo que simplifica enormemente el cableado. La configuración básica es la siguiente:
- VCC: Conéctalo a la alimentación de 5V o 3.3V de tu Arduino.
- DATA: Este es el pin de comunicación, donde se enviarán y recibirán los datos. Se conecta a un pin digital de tu Arduino.
- GND: Conéctalo a la tierra (GND) de tu Arduino.
Si estás utilizando el sensor suelto (no el módulo), es imprescindible que añadas una resistencia pull-up entre el pin DATA y VCC. Los fabricantes suelen recomendar una resistencia de 4.7 KΩ para cables de conexión de hasta 20 metros. Para distancias mayores, el valor de la resistencia podría variar, y se recomienda realizar pruebas para encontrar el valor óptimo. En esos casos, también es aconsejable añadir un capacitor de 100 nF entre VCC y GND para actuar como filtro y estabilizar la alimentación. La comunicación con el sensor se realiza de forma serie en un solo bus, lo que facilita su integración con la ayuda de una librería específica.
Instalando la Librería DHT.h en Arduino IDE
La clave para simplificar el uso de los sensores DHT11 y DHT22 con Arduino reside en la librería DHT.h, desarrollada por Adafruit. Esta librería encapsula toda la complejidad de la comunicación con el sensor, permitiéndote obtener lecturas con unas pocas líneas de código. El proceso de instalación es sencillo y sigue la metodología estándar para añadir librerías en el IDE de Arduino:
- Abre tu IDE de Arduino.
- Dirígete a la pestaña Herramientas en la barra de menú superior.
- Selecciona Administrar Bibliotecas... (o Library Manager). Se abrirá una nueva ventana.
- En la barra de búsqueda que aparece en la ventana del Administrador de Bibliotecas, escribe "DHT.h" o simplemente "DHT".
- Busca la librería que diga "DHT sensor library by Adafruit". Haz clic en ella y luego en el botón Instalar.
- Adicionalmente, y esto es muy importante, la librería DHT de Adafruit a menudo requiere una librería complementaria. Vuelve a la barra de búsqueda del Administrador de Bibliotecas y busca "Adafruit Unified Sensor". Instala también esta librería. Sin ella, la DHT.h podría no funcionar correctamente.
Una vez que ambas librerías estén instaladas, tu entorno de desarrollo estará listo para que empieces a interactuar con los sensores DHT11 o DHT22 que tengas a mano.
Funciones Clave de la Librería DHT.h
La librería DHT.h nos proporciona un conjunto de funciones muy útiles para interactuar con el sensor y obtener las mediciones deseadas. Aquí te detallamos las más importantes:
readHumidity(): Esta función se utiliza para obtener la lectura de la humedad relativa del ambiente. Retorna un valor de tipofloat.readTemperature(): Al llamar a esta función sin parámetros, el sensor nos devolverá la temperatura equivalente en grados Celsius (°C). El valor retornado también es de tipofloat.readTemperature(true): Si necesitas la temperatura en grados Fahrenheit (°F), simplemente pasa el valortruecomo parámetro a esta función. Retorna unfloat.computeHeatIndex(temperatura, humedad): Con esta función, podrás calcular la sensación térmica (también conocida como índice de calor), que es una medida que combina la temperatura y la humedad relativa para reflejar cómo el cuerpo humano percibe el calor. Los parámetrostemperaturayhumedaddeben ser los valores correspondientes en grados Fahrenheit y el porcentaje de humedad relativa, respectivamente. Esta función devolverá la sensación térmica en °F como unfloat.computeHeatIndex(temperatura, humedad, false): Si prefieres obtener la sensación térmica en grados Celsius (°C), utiliza esta versión de la función. En este caso, el parámetrotemperaturadebe ser en °C, y el parámetrohumedadla HR. El tercer parámetro,false, indica que el resultado deseado es en Celsius.
Es crucial recordar que todas estas funciones devuelven valores de tipo float, por lo que tus variables de almacenamiento deben ser declaradas de este tipo para evitar la pérdida de precisión.
Además, la librería cuenta con una función muy útil para verificar si las lecturas se realizaron correctamente: isnan(parámetro). Esta función recibe como argumento una de las variables donde almacenaste la lectura (humedad, temperaturaC, temperaturaF) y devuelve true si el valor "no es un número" (NaN), lo que indica un error en la lectura del sensor. Es una herramienta indispensable para añadir robustez a tu código.
Midamos Temperatura y Humedad con DHT11 y Arduino
Ahora que tenemos las librerías instaladas y conocemos las funciones básicas, es momento de poner manos a la obra con un ejemplo práctico que mostrará las lecturas en el Monitor Serie de Arduino. Asegúrate de tener tu placa Arduino Uno, el sensor DHT11 o DHT22, y una resistencia de 4.7 KΩ (si usas el sensor suelto).
Diagrama de Conexiones Básico
Para este primer ejemplo, utilizaremos una configuración mínima:
- Conecta el pin VCC del sensor DHT11/DHT22 a la salida de 5V de tu Arduino Uno.
- Conecta el pin GND del sensor a la salida de GND de tu Arduino Uno.
- Conecta el pin DATA del sensor al pin digital 2 de tu Arduino Uno.
- Si usas el sensor suelto, no olvides conectar la resistencia de 4.7 KΩ entre el pin DATA y VCC del sensor. Si no tienes una de 4.7 KΩ, puedes probar con una de 10 KΩ.
Código Arduino para Monitor Serie
Carga el siguiente código en tu IDE de Arduino:
#include <DHT.h> #define DHTPIN 2 // Pin de datos para el DHT11/DHT22 #define DHTTYPE DHT11 // Tipo de sensor, cambia por DHT22 si usas ese modelo float humedad; float temperaturaC; float temperaturaF; float sensacionC; float sensacionF; DHT sensorDHT(DHTPIN, DHTTYPE); // Crear el objeto de tipo DHT void setup() { Serial.begin(9600); Serial.println("Sensor DHT, programa de prueba"); sensorDHT.begin(); } void loop() { delay(2000); // Retardo de 2 segundos para asegurar la lectura del sensor humedad = sensorDHT.readHumidity(); temperaturaC = sensorDHT.readTemperature(); temperaturaF = sensorDHT.readTemperature(true); // Verificación de errores en la lectura if (isnan(humedad) || isnan(temperaturaC) || isnan(temperaturaF)) { Serial.println("Error al leer del sensor DHT"); return; // Si hubo un error, el programa sale y reinicia la función loop } // Cálculo de la sensación térmica sensacionC = sensorDHT.computeHeatIndex(temperaturaC, humedad, false); sensacionF = sensorDHT.computeHeatIndex(temperaturaF, humedad); // Impresión de resultados en el Monitor Serie Serial.print("Humedad Relativa: "); Serial.print(humedad); Serial.println("%"); Serial.print("Temperatura: "); Serial.print(temperaturaC); Serial.print(" C"); Serial.print(" / "); Serial.print(temperaturaF); Serial.println(" F"); Serial.print("Sensacion Termica: "); Serial.print(sensacionC); Serial.print(" C"); Serial.print(" / "); Serial.print(sensacionF); Serial.println(" F"); Serial.println("---------------------------------"); } Análisis Detallado del Código
Vamos a desglosar el código para entender cada una de sus partes:
- Declaraciones Iniciales:
#include <DHT.h>: Incluye la librería que acabamos de instalar, permitiendo usar sus funciones.#define DHTPIN 2: Define una constante para el pin digital de Arduino al que conectamos el pin DATA del sensor. En este caso, el pin 2.#define DHTTYPE DHT11: Define el tipo de sensor DHT que estamos utilizando. Es vital que esto coincida con tu sensor físico. Si tienes un DHT22, cámbialo aDHTTYPE DHT22.float humedad; float temperaturaC; float temperaturaF; float sensacionC; float sensacionF;: Declaramos las variables de tipofloatdonde almacenaremos las lecturas y los cálculos. Esto es importante para mantener la precisión decimal. - Creación del Objeto DHT:
DHT sensorDHT(DHTPIN, DHTTYPE);: Aquí creamos una instancia del objetoDHT, al que llamamossensorDHT. Al crear este objeto, le pasamos los parámetros que definimos: el pin al que está conectado (DHTPIN) y el tipo de sensor (DHTTYPE). Este objetosensorDHTserá nuestra interfaz para interactuar con el sensor, permitiéndonos llamar a todas las funciones de la librería. - Función
setup():Serial.begin(9600);: Inicializa la comunicación serial a una velocidad de 9600 baudios, lo que nos permitirá ver los resultados en el Monitor Serie del IDE de Arduino.Serial.println("Sensor DHT, programa de prueba");: Muestra un mensaje de bienvenida en el Monitor Serie.sensorDHT.begin();: Esta línea es crucial. Inicializa el sensor DHT a través del objetosensorDHT, preparándolo para realizar lecturas. - Función
loop():delay(2000);: Introduce un retardo de 2 segundos. Este retardo es necesario porque los sensores DHT tienen un tiempo mínimo entre lecturas para asegurar que la conversión interna de los datos sea correcta y estable. Aunque a veces funcione con menos, 2 segundos es una recomendación segura.humedad = sensorDHT.readHumidity();,temperaturaC = sensorDHT.readTemperature();,temperaturaF = sensorDHT.readTemperature(true);: Estas líneas llaman a las funciones de lectura del objetosensorDHTy asignan los valores retornados a las variables correspondientes. Observa cómoreadTemperature(true)se usa para obtener Fahrenheit.
Manejo de Errores:if (isnan(humedad) || isnan(temperaturaC) || isnan(temperaturaF)) { ... }: Esta es una parte vital para la robustez del programa. La funciónisnan()(is not a number) verifica si la lectura de la variable resultó en un valor inválido, lo que suele ocurrir si el sensor no está conectado correctamente o si hubo un problema en la comunicación. El operador lógico||(OR) significa que si CUALQUIERA de las variables (humedad, temperaturaC, temperaturaF) no es un número, se ejecuta el bloque de código dentro delif. Si hay un error, se imprime un mensaje yreturn;hace que la funciónlooptermine su ejecución actual y se reinicie desde el principio, evitando que se muestren datos erróneos.
Cálculo de Sensación Térmica:sensacionC = sensorDHT.computeHeatIndex(temperaturaC, humedad, false);ysensacionF = sensorDHT.computeHeatIndex(temperaturaF, humedad);: Aquí se utilizan las funciones de sensación térmica. Para Celsius, se pasafalsecomo tercer parámetro. Para Fahrenheit, no se necesita un tercer parámetro.
Impresión de Resultados:
Las últimas líneas utilizanSerial.print()ySerial.println()para mostrar los valores de humedad, temperatura (en °C y °F) y sensación térmica (en °C y °F) en el Monitor Serie de Arduino. La diferencia entreprintyprintlnes queprintlnañade un salto de línea al final, mientras queprintno, permitiendo concatenar valores en la misma línea.
Si todo está conectado y el código es correcto, al abrir el Monitor Serie (Herramientas > Monitor Serie), deberías ver las lecturas actualizándose cada 2 segundos. Si ves el mensaje de error, revisa tus conexiones y asegúrate de que el tipo de sensor en #define DHTTYPE sea el correcto.

Ampliando tu Proyecto: DHT con LCD en Arduino
Para llevar tu proyecto a un nivel más visual y autónomo, podemos añadir una pantalla LCD 16x2. Esto te permitirá ver las mediciones sin necesidad de una computadora, ideal para una estación meteorológica portátil o un sistema de monitoreo en el hogar.
Materiales Adicionales y Conexiones
Para este ejemplo, además de tu Arduino y el sensor DHT, necesitarás:
- Un LCD 16x2 (preferiblemente con módulo I2C para simplificar el cableado, aunque el ejemplo dado asume conexión directa).
- Un Potenciómetro de 1 KΩ (para ajustar el contraste del LCD si no usas I2C).
- Una Resistencia de 100 Ω (para la retroiluminación del LCD si no usas I2C).
Dado que el texto original no detalla las conexiones de un LCD sin I2C, asumiremos la conexión estándar de 16 pines, pero recuerda que el pin de datos del DHT debe moverse para liberar el pin 2 del Arduino. El diagrama de conexiones sería más complejo, pero la idea es que el LCD se conecte a varios pines digitales (RS, Enable, D4, D5, D6, D7) y el potenciómetro y resistencia para el contraste y la retroiluminación. El sensor DHT lo moveremos a otro pin, por ejemplo, el pin digital 8.
Código Arduino para LCD
Necesitarás la librería LiquidCrystal, que generalmente viene preinstalada con el IDE de Arduino. Si no la tienes, búscala e instálala desde el Administrador de Bibliotecas. Carga el siguiente código:
#include <DHT.h> #include <LiquidCrystal.h> #define DHTPIN 8 // Pin de datos para el DHT (cambiado a pin 8) #define DHTTYPE DHT22 // Tipo de sensor, puedes cambiar por DHT11 float humedad; float temperaturaC; float temperaturaF; float sensacionC; float sensacionF; // Crear el objeto lcd con los pines de conexión (RS, Enable, D4, D5, D6, D7) // Asumiendo R/W a GND, y los pines de datos D0-D3 no usados. // Ajusta estos pines según tu conexión física del LCD LiquidCrystal lcd(7, 6, 5, 4, 3, 2); DHT sensorDHT(DHTPIN, DHTTYPE); // Crear el objeto de tipo DHT // Definir un carácter personalizado para el símbolo de grados (°) byte grados[] = { B00110, B01001, B01001, B00110, B00000, B00000, B00000, B00000 }; void setup() { lcd.begin(16, 2); // Inicializar el lcd 16x2 // Mensaje de bienvenida inicial en el LCD lcd.setCursor(0, 0); // Mover el cursor a la posición 0,0 (primera columna, primera fila) lcd.print("Automatizacion"); lcd.setCursor(0, 1); // Mover el cursor a la posición 0,1 (primera columna, segunda fila) lcd.print("para Todos"); delay(5000); // Realizar una pausa de 5 segundos para que se vea el mensaje lcd.createChar(0, grados); // Crear el carácter personalizado en la posición 0 de la memoria del LCD sensorDHT.begin(); // Inicializar el sensor DHT } void loop() { delay(100); // Pequeño retardo para el sensor (el retardo principal ya es suficiente) humedad = sensorDHT.readHumidity(); temperaturaC = sensorDHT.readTemperature(); temperaturaF = sensorDHT.readTemperature(true); // Verificación de errores en la lectura if (isnan(humedad) || isnan(temperaturaC) || isnan(temperaturaF)) { lcd.clear(); lcd.setCursor(0, 0); lcd.print("Error en el"); lcd.setCursor(0, 1); lcd.print("sensor"); return; // Si hubo un error, el programa sale y reinicia la función loop } // Cálculo de la sensación térmica (no se mostrará en este ejemplo para simplificar el LCD) // sensacionC = sensorDHT.computeHeatIndex(temperaturaC, humedad, false); // sensacionF = sensorDHT.computeHeatIndex(temperaturaF, humedad); // Limpiar LCD y mostrar datos lcd.clear(); // Limpiar la pantalla antes de escribir nuevos datos lcd.setCursor(0, 0); lcd.print("Temp:"); lcd.setCursor(5, 0); lcd.print(temperaturaC); lcd.setCursor(9, 0); lcd.write((byte)0); // Mostrar el carácter de grados personalizado lcd.setCursor(10, 0); lcd.print("C"); lcd.setCursor(0, 1); lcd.print("HR:"); lcd.setCursor(3, 1); lcd.print(humedad); lcd.setCursor(8, 1); lcd.print("%"); } En este código, hemos integrado la librería LiquidCrystal.h para controlar el LCD. Se definió un carácter personalizado (byte grados[]) para el símbolo de grados (°), que se carga en la memoria del LCD con lcd.createChar(0, grados);. Las lecturas del sensor se muestran en la pantalla LCD utilizando lcd.print() y lcd.setCursor() para posicionar el texto. Si ocurre un error de lectura, el LCD mostrará un mensaje de "Error en el sensor" en lugar de los datos.
Preguntas Frecuentes (FAQ)
¿Qué es un sensor DHT11/DHT22?
Son sensores digitales que miden la temperatura y la humedad relativa del aire. El DHT11 es más básico y económico, mientras que el DHT22 es más preciso y tiene un rango de medición más amplio, aunque es un poco más caro.
¿Por qué necesito una resistencia pull-up para el sensor DHT suelto?
La resistencia pull-up asegura que el pin de datos del sensor esté en un estado definido (HIGH) cuando no está transmitiendo activamente. Esto es crucial para una comunicación serial estable y confiable entre el sensor y el microcontrolador (Arduino). Sin ella, la señal podría ser inestable y las lecturas erróneas.
¿Cuál es la diferencia principal entre DHT11 y DHT22?
La principal diferencia radica en su precisión, rango de medición y resolución. El DHT22 es significativamente más preciso (±0.5 °C y ±2% HR) y tiene un rango más amplio (-40 a 80 °C y 0 a 100% HR) en comparación con el DHT11 (±2 °C y ±5% HR, 0 a 50 °C y 20 a 90% HR). El DHT22 también ofrece una mayor resolución en sus lecturas.
¿Cómo sé si la lectura del sensor es correcta?
La librería DHT.h proporciona la función isnan() (is not a number). Si isnan(valor) devuelve true para una lectura de humedad o temperatura, significa que hubo un error en la comunicación o que el sensor no pudo proporcionar un valor válido. Es una buena práctica incluir esta verificación en tu código para manejar posibles fallos.
¿Puedo usar el mismo código para DHT11 y DHT22?
Sí, en gran medida. La librería DHT.h está diseñada para ser compatible con ambos. Solo necesitas cambiar la constante #define DHTTYPE en tu código para especificar si estás utilizando DHT11 o DHT22. Las funciones de lectura y cálculo son las mismas para ambos sensores.
¿Es necesario el retardo (delay) en la función loop()?
Sí, el delay(2000) o un tiempo similar es importante. Los sensores DHT requieren un tiempo mínimo entre lecturas para realizar sus conversiones internas y estabilizar los datos. Intentar leer demasiado rápido puede resultar en lecturas erróneas o fallos en la comunicación.
Conclusión
Dominar la instalación de la librería DHT.h y la integración de los sensores DHT11 o DHT22 con Arduino abre un abanico de posibilidades para tus proyectos de electrónica. Desde sistemas de monitoreo ambiental simples hasta estaciones meteorológicas completas, la facilidad de uso y la accesibilidad de estos componentes los convierten en una opción ideal tanto para principiantes como para entusiastas experimentados. Esperamos que esta guía te haya proporcionado las herramientas y el conocimiento necesario para empezar a medir y controlar tu entorno con precisión. ¡El límite es tu creatividad!
Si quieres conocer otros artículos parecidos a Instala y Usa el Sensor DHT11/DHT22 con Arduino puedes visitar la categoría Librerías.
