En este tutorial, aprenderás cómo DHT11 y DHT22/AM2302 funcionan los sensores digitales de temperatura y humedad y cómo puedes usarlos con Arduino. Estos sensores son muy populares para proyectos de electrónica DIY y son perfectos para estaciones meteorológicas remotas, proyectos de domótica y sistemas de monitoreo de plantas/jardines.
En este artículo, he incluido diagramas de conexión y varios ejemplos de código para que puedas empezar a experimentar con tu sensor. Después de cada ejemplo, desgloso y explico cómo funciona el código, para que no tengas problemas en modificarlo según tus necesidades.
Primero, echaremos un vistazo a la biblioteca Adafruit DHT. Luego, te mostraré cómo combinar el sensor con una pantalla LCD 16×2 para crear una estación meteorológica sencilla.
Materiales
Componentes de hardware
| 4 pin DHT11 sensor | × 1 | Amazon |
| 4 pin DHT22/AM2302 sensor | × 1 | Amazon |
| 3 pin DHT11 sensor (recomendado) | × 1 | Amazon |
| 3 pin DHT22/AM2302 sensor (recomendado) | × 1 | Amazon |
| 5 – 10 kΩ resistor (solo para sensores de 4 pines) | × 1 | Amazon |
| Arduino Uno Rev3 | × 1 | Amazon |
| Breadboard | × 1 | Amazon |
| Jumper wires | ~ 10 | Amazon |
| USB cable type A/B | × 1 | Amazon |
| 16×2 character I2C LCD (opcional) | × 1 | Amazon |
Software
Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.
¿Cómo funcionan los sensores de temperatura y humedad DHT11 y DHT22/AM2302?
Si abres un DHT11 o DHT22/AM2302 sensor, verás que contiene dos elementos sensores: un elemento para humedad y un NTC (termistor).
El elemento sensor de humedad consiste en dos electrodos con un sustrato que retiene la humedad entre ellos. El sensor mide la resistencia entre los electrodos, que cambia según la cantidad de humedad en el aire.
En la parte trasera del sensor, encontrarás un pequeño circuito integrado que mide y procesa la señal analógica. También almacena los coeficientes de calibración y realiza la conversión de analógico a digital.
¿Qué es la humedad relativa?
Cuando miras la hoja de datos de los sensores DHTxx, verás que miden la humedad relativa (HR) del aire y no la humedad absoluta. ¿Pero cuál es la diferencia? La humedad absoluta es la cantidad de vapor de agua en el aire (expresada en g/m³), sin importar la temperatura. La humedad relativa sí tiene en cuenta la temperatura.
La humedad relativa es la proporción entre la cantidad real de vapor de agua presente en el aire y la cantidad máxima de vapor de agua que el aire puede contener a una temperatura dada.
El aire cálido puede contener más agua que el aire frío. Esto significa que para la misma cantidad de vapor de agua en el aire, la humedad relativa en aire frío será mayor que en aire cálido. Al 100 por ciento de humedad relativa, el aire está saturado y alcanza su punto de rocío.
Especificaciones del DHT11
| Voltaje de operación | 3.3 – 5.5 V |
| Corriente de operación | Medición: 0.3 mA, en espera: 60 μA |
| Rango de medición de humedad | 5 – 95 % HR ± 5 % HR |
| Rango de medición de temperatura | -20 – 60 °C ± 2 °C |
| Protocolo de comunicación | 1-Wire |
| Periodo de muestreo | > 2 segundos |
| Dimensiones del cuerpo | 15.5 x 12 x 5.5 mm |
| Dimensiones de los pines | 8 mm de longitud, separación de 2.54 mm |
| Ventaja | Muy bajo costo |
| Costo | Check price |
Para más información puedes consultar la hoja de datos a continuación:
Especificaciones del DHT22/AM2302
| Voltaje de operación | 3.3 – 5.5 V |
| Corriente de operación | Medición: 0.5 mA, en espera: 15 μA |
| Rango de medición de humedad | 0 – 99.9 % HR ± 2 % HR |
| Rango de medición de temperatura | -40 – 80 °C ± 1 °C |
| Protocolo de comunicación | Protocolo de bus 1-Wire |
| Periodo de muestreo | 2 segundos |
| Dimensiones del cuerpo | 25 x 15 x 7 mm, orificio de montaje de ⌀ 3 mm |
| Dimensiones de los pines | 7 mm de longitud, separación de 2.54 mm |
| Ventaja | Más preciso |
| Costo | Check price |
Puedes descargar la hoja de datos del DHT22/AM2302 a continuación:
Ten en cuenta que el AM2302 es simplemente una versión cableada del sensor DHT22 con 3 cables.

Como puedes ver, las especificaciones del DHT11 y del DHT22/AM2302 son bastante similares. La principal diferencia es que el DHT22 es más preciso y tiene un rango de medición más amplio. El DHT11 es un poco más pequeño que el DHT22 y también es más económico.
Lo bueno de estos sensores es que son intercambiables, lo que significa que puedes simplemente reemplazar el DHT11 por un DHT22 o viceversa, el cableado es exactamente el mismo. Solo tendrás que hacer un pequeño cambio en la configuración del código, como verás más adelante.
Cableado – Conectar DHT11 y DHT22/AM2302 a Arduino Uno
Los diagramas/esquemas de cableado a continuación muestran cómo conectar sensores de temperatura y humedad de 3 o 4 pines al Arduino Uno. Se necesita una resistencia pull-up de 10 kΩ entre la línea de señal y 5 V para asegurar que el nivel de señal se mantenga alto por defecto (consulta la hoja de datos para más información).


Ten en cuenta que el sensor DHT22/AM2302 se conecta exactamente igual que el DHT11. Las conexiones también se muestran en la tabla a continuación. Numeré los pines del 1 al 4 de izquierda a derecha cuando los orificios del sensor están frente a ti.
Conexiones de 4 pines para DHT11 y DHT22
| DHT11/DHT22 | Arduino |
|---|---|
| Pin 1 | 5 V |
| Pin 2 | Conectar al pin digital 2 y a 5 V a través de una resistencia de 10 kΩ |
| Pin 3 | No conectado |
| Pin 4 | GND |
También puedes comprar los sensores montados en una pequeña PCB (sensores de 3 pines). Estas placas breakout facilitan la conexión del sensor al Arduino e incluyen ya una resistencia pull-up. Asegúrate de revisar la etiqueta del sensor, el orden de los pines puede variar según el fabricante.

Conexiones de 3 pines para DHT11
| DHT11 de 3 pines | Arduino |
|---|---|
| s | Pin digital 2 |
| + | 5 V |
| – | GND |
Los ejemplos de código a continuación usan el pin digital 2 para recibir los datos del sensor, pero puedes cambiarlo a cualquier pin digital que desees.

Conexiones de 3 pines para DHT22/AM2302
| DHT22 de 3 pines | Arduino |
|---|---|
| DAT | Pin digital 2 |
| VCC | 5 V |
| GND | GND |
Instalación de las librerías necesarias para Arduino
El código a continuación usa la librería de sensores DHT de Adafruit que puedes descargar desde GitHub. Esta librería solo funciona si también tienes instalada la librería Adafruit Unified Sensor , que también está disponible en GitHub.
También puedes descargar ambas librerías haciendo clic en los botones a continuación:
Puedes instalar la librería yendo a Sketch > Include Library > Add .ZIP Library en el IDE de Arduino.
Otra opción es navegar a Tools > Manage Libraries… o presionar Ctrl + Shift + I en Windows. Se abrirá el Gestor de Librerías y actualizará la lista de librerías instaladas.

Puedes buscar ‘dht’ y ‘adafruit unified sensor’ y buscar la librería de Adafruit. Selecciona la versión más reciente y luego haz clic en Instalar.

Ejemplo de código Arduino para sensor de temperatura y humedad DHT11/DHT22
Puedes subir el siguiente código de ejemplo a tu Arduino usando el IDE de Arduino. A continuación, explicaré cómo funciona el código.
Puedes copiar el código haciendo clic en el botón en la esquina superior derecha del campo de código.
/* Arduino example code for DHT11, DHT22/AM2302
and DHT21/AM2301 temperature and humidity sensors.
www.www.makerguides.com */
#include "Adafruit_Sensor.h"
#include "DHT.h"
// Set DHT pin:
#define DHTPIN 2
// Set DHT type, uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Initialize DHT sensor for normal 16mhz Arduino:
DHT dht = DHT(DHTPIN, DHTTYPE);
void setup() {
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Setup sensor:
dht.begin();
}
void loop() {
// Wait a few seconds between measurements:
delay(2000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
// Read the humidity in %:
float h = dht.readHumidity();
// Read the temperature as Celsius:
float t = dht.readTemperature();
// Read the temperature as Fahrenheit:
float f = dht.readTemperature(true);
// Check if any reads failed and exit early (to try again):
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
// Compute heat index in Fahrenheit (default):
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius:
float hic = dht.computeHeatIndex(t, h, false);
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" % ");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(f);
Serial.print(" \xC2\xB0");
Serial.print("F ");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(hif);
Serial.print(" \xC2\xB0");
Serial.println("F");
}
Deberías ver la siguiente salida en el monitor serie (Ctrl + Shift + M):

Explicación del código
El primer paso es incluir las librerías Adafruit DHT y Unified Sensor.
#include "Adafruit_Sensor.h" #include "DHT.h"
Luego, necesitamos definir el pin de conexión del DHT al Arduino y también establecer el tipo de sensor DHT. En nuestro ejemplo, usamos un sensor DHT11 conectado al pin 2.
La instrucción #define se usa para dar un nombre a un valor constante. El compilador reemplazará cualquier referencia a esta constante con el valor definido cuando se compile el programa. Así que donde menciones DHTPIN, el compilador lo reemplazará por el valor 2 al compilar el programa.
// Set DHT pin: #define DHTPIN 2 // Set DHT type, uncomment whatever type you're using! #define DHTTYPE DHT11 // DHT 11 //#define DHTTYPE DHT22 // DHT 22 (AM2302) //#define DHTTYPE DHT21 // DHT 21 (AM2301)
Luego, debes crear una nueva instancia de la clase DHT con el tipo y conexión apropiados. Para esto, usamos la función DHT(pin,type).
En este caso, llamé al sensor ‘dht’ pero puedes usar otros nombres, como ‘temperature_sensor’ o ‘dht11’, etc. DHT temperature_sensor = DHT(DHTPIN, DHTTYPE);. Puedes crear múltiples instancias de la clase DHT con diferentes nombres y pines/tipos. Esto te permite usar fácilmente 2 o más sensores al mismo tiempo.
// Initialize DHT sensor for normal 16mhz Arduino: DHT dht = DHT(DHTPIN, DHTTYPE);
Función setup
En la setup(), iniciamos la comunicación serie a una velocidad de 9600 baudios. ¡Asegúrate de que el Monitor Serie también esté configurado a 9600! También inicializamos el sensor con dht.begin().
void setup() {
// Begin serial communication at a baud rate of 9600:
Serial.begin(9600);
// Setup sensor:
dht.begin();
}
Función loop
La sección loop() del código comienza con un retardo de 2 segundos. Este retardo está para darle tiempo al sensor para hacer las lecturas. La tasa máxima de muestreo del DHT22 es cada 2 segundos y la del DHT11 es una vez por segundo.
// Wait a few seconds between measurements: delay(2000);
Tomar lecturas de temperatura y humedad es muy fácil porque la librería tiene varias funciones integradas. Para obtener una lectura de humedad en ‘%’, puedes usar la función readHumidity(). En este caso, guardamos la lectura en la variable ‘h’. Ten en cuenta que es del tipo float.
Cuando quieres usar una función en el objeto DHT, primero debes especificar el nombre que le diste al sensor. Así que en nuestro caso es ‘dht’.
// Read the humidity in %: float h = dht.readHumidity();
Tomar lecturas de temperatura es igual de fácil con la función readTemperature().
// Read the temperature as Celsius: float t = dht.readTemperature();
Si quieres obtener la temperatura en Fahrenheit en lugar de Celsius, tienes dos opciones. Puedes pasar true a la función readTemperature, o puedes usar la función convert:
// Read the temperature as Fahrenheit: float f = dht.readTemperature(true); // Alternative, use convert function: float f = dht.convertCtoF(t);
Luego, hay una pequeña sección de código que verifica si el sensor está conectado correctamente y está devolviendo una lectura. Si no, se imprimirá un mensaje de error en el Monitor Serie.
// Check if any reads failed and exit early (to try again):
if (isnan(h) || isnan(t) || isnan(f)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
La librería también tiene una función integrada que puede calcular el índice de calor combinando las lecturas de temperatura y humedad. El heat index también se conoce como la “temperatura aparente” o “sensación térmica”.
// Compute heat index in Fahrenheit (default): float hif = dht.computeHeatIndex(f, h); // Compute heat index in Celsius: float hic = dht.computeHeatIndex(t, h, false);
Finalmente, las lecturas se muestran en el Monitor Serie. Ten en cuenta que la línea Serial.print(" \xC2\xB0"); se usa para imprimir el símbolo de grado.
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" % ");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(f);
Serial.print(" \xC2\xB0");
Serial.print("F ");
Serial.print("Heat index: ");
Serial.print(hic);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(hif);
Serial.print(" \xC2\xB0");
Serial.println("F");
Ejemplo de código para sensor de temperatura y humedad DHT11 y DHT22/AM2302 con LCD I2C y Arduino
Combinando un sensor de temperatura y humedad con una pequeña pantalla LCD, puedes crear una estación meteorológica económica.
En el siguiente ejemplo, usaré una pantalla LCD de caracteres I2C. Necesitarás hacer algunas conexiones adicionales al Arduino para poder controlar la pantalla LCD 16×2. El sensor DHT11 o DHT22/AM2302 se conecta igual que antes.
El diagrama de cableado a continuación muestra cómo conectar una pantalla LCD I2C al Arduino.

Las conexiones también se muestran en la siguiente tabla:
Conexiones LCD I2C
| LCD I2C | Arduino |
|---|---|
| GND | GND |
| VCC | 5 V |
| SDA | A4 |
| SCL | A5 |
Si no usas un Arduino Uno, los pines SDA y SCL pueden estar en una ubicación diferente. Un Arduino UNO con el diseño R3 (pinout 1.0), también tiene los pines SDA (línea de datos) y SCL (línea de reloj) cerca del pin AREF. Consulta la tabla a continuación para más detalles.
| Placa | SDA | SCL |
|---|---|---|
| Arduino Uno | A4 | A5 |
| Arduino Nano | A4 | A5 |
| Arduino Micro | 2 | 3 |
| Arduino Mega 2560 | 20 | 21 |
| Arduino Leonardo | 2 | 3 |
| Arduino Due | 20 | 21 |
El código usa la librería LiquidCrystal_I2C , que puedes descargar desde GitHub. También incluye la librería Wire.h , que permite comunicarte con dispositivos I2C. Esta librería debería venir preinstalada con el IDE de Arduino.
El código a continuación es casi igual que antes, pero ahora mostramos la temperatura y humedad en la pantalla LCD en lugar del Monitor Serie.
Puedes copiar el código haciendo clic en el botón en la esquina superior derecha del campo de código.
/* Arduino example code for DHT11, DHT22/AM2302
and DHT21/AM2301 temperature and humidity sensors
with I2C LCD. More info: www.www.makerguides.com */
#include "Adafruit_Sensor.h"
#include "DHT.h"
#include "Wire.h"
#include "LiquidCrystal_I2C.h"
// Set DHT pin:
#define DHTPIN 2
// Define SDA and SCL pin for LCD:
#define SDAPin A4 // Data pin
#define SCLPin A5 // Clock pin
// Set DHT type, uncomment whatever type you're using!
#define DHTTYPE DHT11 // DHT 11
//#define DHTTYPE DHT22 // DHT 22 (AM2302)
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Initialize DHT sensor for normal 16mhz Arduino:
DHT dht = DHT(DHTPIN, DHTTYPE);
// Connect to LCD via I2C, default address 0x27 (A0-A2 not jumpered):
LiquidCrystal_I2C lcd = LiquidCrystal_I2C(0x27, 16, 2); //Change to (0x27,20,4) for 2004 LCD
void setup() {
// Setup sensor:
dht.begin();
// Initiate the LCD:
lcd.init();
lcd.backlight();
}
void loop() {
// Wait a few seconds between measurements:
delay(2000);
// Reading temperature or humidity takes about 250 milliseconds!
// Sensor readings may also be up to 2 seconds 'old' (its a very slow sensor)
// Read the humidity in %:
float h = dht.readHumidity();
// Read the temperature as Celsius:
float t = dht.readTemperature();
// Read the temperature as Fahrenheit:
float f = dht.readTemperature(true);
// Compute heat index in Fahrenheit (default):
float hif = dht.computeHeatIndex(f, h);
// Compute heat index in Celsius:
float hic = dht.computeHeatIndex(t, h, false);
// Print the temperature and the humidity on the LCD:
lcd.setCursor(0, 0);
lcd.print("Temp: ");
lcd.print(t);
lcd.print(" " "\xDF" "C");
lcd.setCursor(0, 1);
lcd.print("Humid: ");
lcd.print(h);
lcd.print(" %");
}
Guía de solución de problemas para DHT11/DHT22
Al trabajar con estos sensores, podrías recibir los siguientes mensajes de error:
“¡Error al leer del sensor DHT!”
Este mensaje puede aparecer en el monitor serie cuando el sensor no devuelve una lectura. Esto puede tener varias causas:
- Tipo de sensor: Asegúrate de haber descomentado el DHTTYPE correcto en la configuración del código. Revisa el ejemplo arriba.
- Tasa de muestreo: Los sensores DHT son bastante lentos, la tasa máxima de muestreo es alrededor de 2 segundos. Aumentar el retardo entre mediciones podría solucionar este error.
- Alimentación: Aunque los sensores DHTxx pueden funcionar entre 3.3 y 5 V, el fabricante recomienda 5 V. En algunos casos, alimentar el sensor con 5 V soluciona el problema. Asegúrate de que tu microcontrolador también soporte 5 V en los pines GPIO.
«Error fatal: Adafruit_Sensor.h: No existe el archivo o directorio»
Podrías recibir este error al intentar compilar el código. Esto significa que no instalaste (correctamente) la librería Adafruit Unified Sensor .
Solo desplázate un poco hacia arriba en este post y verás dónde y cómo puedes descargar e instalar la librería.
Conclusión
En este artículo, te he mostrado cómo funcionan los sensores de temperatura y humedad DHT11 y DHT22/AM2302 y cómo puedes usarlos con Arduino.
Espero que te haya resultado útil e informativo. Para otros sensores de temperatura, echa un vistazo a nuestro LM35 analog temperature sensor with Arduino y TMP36 analog temperature sensor with Arduino tutorial.
Si tienes alguna pregunta, sugerencia o crees que falta algo en este tutorial, por favor deja un comentario abajo.

