Skip to Content

Cómo usar los sensores DHT11 y DHT22 con Arduino

Cómo usar los sensores DHT11 y DHT22 con Arduino

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× 1Amazon
4 pin DHT22/AM2302 sensor× 1Amazon
3 pin DHT11 sensor (recomendado)× 1Amazon
3 pin DHT22/AM2302 sensor (recomendado)× 1Amazon
5 – 10 kΩ resistor (solo para sensores de 4 pines)× 1Amazon
Arduino Uno Rev3× 1Amazon
Breadboard× 1Amazon
Jumper wires~ 10Amazon
USB cable type A/B× 1Amazon
16×2 character I2C LCD (opcional)× 1Amazon

Software

Arduino IDEArduino IDE

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ón3.3 – 5.5 V
Corriente de operaciónMedición: 0.3 mA, en espera: 60 μA
Rango de medición de humedad5 – 95 % HR ± 5 % HR
Rango de medición de temperatura-20 – 60 °C ± 2 °C
Protocolo de comunicación1-Wire
Periodo de muestreo> 2 segundos
Dimensiones del cuerpo15.5 x 12 x 5.5 mm
Dimensiones de los pines8 mm de longitud, separación de 2.54 mm
VentajaMuy bajo costo
CostoCheck price

Para más información puedes consultar la hoja de datos a continuación:

Especificaciones del DHT22/AM2302

Voltaje de operación3.3 – 5.5 V
Corriente de operaciónMedición: 0.5 mA, en espera: 15 μA
Rango de medición de humedad0 – 99.9 % HR ± 2 % HR
Rango de medición de temperatura-40 – 80 °C ± 1 °C
Protocolo de comunicaciónProtocolo de bus 1-Wire
Periodo de muestreo2 segundos
Dimensiones del cuerpo25 x 15 x 7 mm, orificio de montaje de ⌀ 3 mm
Dimensiones de los pines7 mm de longitud, separación de 2.54 mm
VentajaMás preciso
CostoCheck 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.

AM2302 Sensor
AM2302 Sensor

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).

DHT11-with-Arduino-UNO-wiring-diagram-schematic
Cableado del sensor de temperatura y humedad DHT11 de 4 pines al Arduino Uno
DHT22-with-Arduino-UNO-wiring-diagram-schematic
Cableado del sensor de temperatura y humedad DHT22 de 4 pines al Arduino Uno

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/DHT22Arduino
Pin 15 V
Pin 2Conectar al pin digital 2 y a 5 V a través de una resistencia de 10 kΩ
Pin 3No conectado
Pin 4GND

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.

DHT11-3-pin-with-Arduino-UNO-wiring-diagram-schematic
Cableado del sensor de temperatura y humedad DHT11 de 3 pines al Arduino Uno

Conexiones de 3 pines para DHT11

DHT11 de 3 pinesArduino
sPin 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.

DHT22-3-pin-with-Arduino-UNO-wiring-diagram-schematic
Cableado del sensor de temperatura y humedad DHT22 de 3 pines al Arduino Uno

Conexiones de 3 pines para DHT22/AM2302

DHT22 de 3 pinesArduino
DATPin digital 2
VCC5 V
GNDGND

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.

Installing an Arduino library step 1 open Library Manager
Gestor de Librerías

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.

Installing an Arduino library step 2 DHT Adafruit
Instalación de la librería DHT de Adafruit

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):

DHT11 temperature and humidity sensor Serial Monitor output
Salida del monitor serie

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.

DHT11-with-I2C-LCD-and-Arduino-UNO-wiring-diagram-schematic
Diagrama de cableado del sensor de temperatura y humedad DHT11 con pantalla LCD de caracteres 16×2 I2C y Arduino

Las conexiones también se muestran en la siguiente tabla:

Conexiones LCD I2C

LCD I2CArduino
GNDGND
VCC5 V
SDAA4
SCLA5

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.

PlacaSDASCL
Arduino UnoA4A5
Arduino NanoA4A5
Arduino Micro23
Arduino Mega 25602021
Arduino Leonardo23
Arduino Due2021
Ubicación de pines I2C para diferentes placas Arduino

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.