Cómo utilizar los sensores DHT11 y DHT22 con Arduino

Cómo utilizar los sensores DHT11 y DHT22 con Arduino

En este tutorial, aprenderás cómo funcionan los sensores digitales de temperatura y humedad DHT11 y DHT22/AM2302 y cómo puedes utilizarlos con Arduino. Estos sensores son muy populares para los proyectos de electrónica de bricolaje y son perfectos para las estaciones meteorológicas remotas, proyectos de automatización del hogar, y los sistemas de monitoreo de plantas / jardín.

En este artículo, he incluido diagramas de cableado y varios códigos de ejemplo para que puedas empezar a experimentar con tu sensor. Después de cada ejemplo, desgloso y explico cómo funciona el código, por lo que no deberías tener problemas para modificarlo y adaptarlo a tus necesidades.

Primero, echaremos un vistazo a la biblioteca DHT de Adafruit. A continuación, te mostraré cómo puedes combinar el sensor con una pantalla LCD de 16×2 para crear una sencilla estación meteorológica.

Artículos recomendados


Suministros

Componentes de hardware

Sensor DHT11 de 4 pines× 1Amazon
Sensor DHT22/AM2302 de 4 pines× 1Amazon
Sensor DHT11 de 3 pines (recomendado)× 1Amazon
Sensor DHT22/AM2302 de 3 pines (recomendado)× 1Amazon
Resistencia de 5 - 10 kΩ (sólo para sensores de 4 pines)× 1Amazon
Arduino Uno Rev3× 1Amazon
Tablero de pruebas× 1Amazon
Cables de puente~ 10Amazon
Cable USB tipo A/B× 1Amazon
LCD I2C de 16×2 caracteres (opcional)× 1Amazon

Software

Arduino IDEArduino IDE

Makerguides.com participa en el Programa de Asociados de Amazon Services LLC, un programa de publicidad de afiliados diseñado para proporcionar un medio para que los sitios ganen honorarios de publicidad mediante la publicidad y los enlaces a productos en Amazon.com.

Los sensores DHTxx genuinos son fabricados por ASAIR, puede encontrar su sitio web aquí.


¿Cómo funcionan los sensores de temperatura y humedad DHT11 y DHT22/AM2302?

Si abre un sensor DHT11 o DHT22/AM2302, verá que contiene dos elementos sensores: un elemento sensor de humedad y un NTC (termistor).

El elemento sensor de la humedad consta de dos electrodos con un sustrato de retención de humedad entre ellos. El sensor mide la resistencia entre los electrodos, que cambia en función de la cantidad de humedad del aire.

En la parte posterior del sensor se encuentra 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 analógica a digital.

¿Qué es la humedad relativa?

Al consultar la hoja de datos de los sensores DHTxx, verá 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³), independientemente de la temperatura. La humedad relativa tiene en cuenta la temperatura.

La humedad relativa es la relació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 determinada.

El aire caliente puede retener 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 del aire frío será mayor que la del aire caliente. Con una humedad relativa del 100%, el aire está saturado y se encuentra en su punto de rocío.

Especificaciones del DHT11

Tensión de funcionamiento3.3 - 5.5 V
Corriente de trabajoMedición: 0,3 mA, en espera: 60 μA
Rango de medición de la humedad5 - 95 % RH ± 5 % RH
Rango de medición de la temperatura-20 - 60 °C ± 2 °C
Protocolo de comunicación1 hilo
Período de muestreo> 2 segundos
Dimensiones de la carrocería15,5 x 12 x 5,5 mm
Dimensiones de las clavijas8 mm de longitud, 2,54 mm de separación
VentajaUltra bajo coste
CosteComprobar el precio

Para más información, puede consultar la hoja de datos que aparece a continuación:

Especificaciones del DHT22/AM2302

Tensión de funcionamiento3.3 - 5.5 V
Corriente de trabajoMedición: 0,5 mA, en espera: 15 μA
Rango de medición de la humedad0 - 99,9 % RH ± 2 % RH
Rango de medición de la temperatura-40 - 80 °C ± 1 °C
Protocolo de comunicaciónProtocolo de bus de 1 hilo
Período de muestreo2 segundos
Dimensiones de la carrocería25 x 15 x 7 mm, ⌀ agujero de montaje de 3 mm
Dimensiones de las clavijas7 mm de longitud, 2,54 mm de separación
VentajaMás preciso
CosteComprobar el precio

Puede descargar la hoja de datos del DHT22/AM2302 a continuación:

Tenga en cuenta que el AM2302 es simplemente una versión con cable del sensor DHT22 con 3 cables.

Como puede 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 mayor rango de medición.

La DHT11 es un poco más pequeña que la DHT22 y también es más barata.

Lo bueno de estos sensores es que son intercambiables, lo que significa que puedes sustituir el DHT11 por un DHT22 o viceversa, el cableado es exactamente el mismo. Sólo tendrás que hacer un pequeño cambio en la configuración del código, como verás más adelante.


Cableado - Conexión de 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 de pull-up de 10 kΩ entre la línea de señal y 5 V para asegurarse de que el nivel de la señal se mantiene alto por defecto (ver la hoja de datos para más información).

Esquema del cableado del DHT11 con Arduino-UNO
Cableado del sensor de temperatura y humedad DHT11 de 4 pines a Arduino Uno
Esquema del cableado del DHT22 con Arduino-UNO
Cableado del sensor de temperatura y humedad DHT22 de 4 pines a Arduino Uno

Tenga en cuenta que el sensor DHT22/AM2302 se conecta exactamente de la misma manera que el DHT11. Las conexiones también se indican en la tabla siguiente. He numerado los pines 1 a 4 de izquierda a derecha cuando los agujeros del sensor están orientados hacia ti.

Conexiones DHT11 y DHT22 de 4 pines

DHT11/DHT22Arduino
Clavija 15 V
Clavija 2Conectar al pin digital 2 y a 5 V mediante una resistencia de 10 kΩ
Clavija 3No conectado
Clavija 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 y además ya incluyen una resistencia pull-up. Asegúrate de comprobar la etiqueta del sensor, el orden de los pines puede ser diferente dependiendo del fabricante.

Esquema de cableado de DHT11-3-pin-con-Arduino-UNO
Cableado del sensor de temperatura y humedad DHT11 de 3 pines a Arduino Uno

Conexiones DHT11 de 3 pines

3 Clavijas DHT11Arduino
sClavija digital 2
+5 V
-GND

Los ejemplos de código a continuación utilizan el pin digital 2 para recibir los datos del sensor, pero puedes cambiarlo por cualquier pin digital que desees.

Esquema de cableado DHT22-3-pin-con-Arduino-UNO
Cableado del sensor de temperatura y humedad DHT22 de 3 pines a Arduino Uno

Conexiones de 3 pines DHT22/AM2302

DHT22 de 3 pinesArduino
DATClavija digital 2
VCC5 V
GNDGND

Instalación de las librerías Arduino necesarias

El código de abajo utiliza la biblioteca de sensores DHT de Ad afruit que puedes descargar aquí en GitHub. Esta librería sólo funciona si también tienes instalada la librería Adafruit Unified Sensor, que también está disponible en GitHub.

También puede descargar las dos bibliotecas haciendo clic en los botones de abajo:

Puedes instalar la librería yendo a Sketch > Include Library > Add .ZIP Library en el IDE de Arduino.

Otra opción es ir a Herramientas > Administrar Bibliotecas... o teclear Ctrl + Shift + I en Windows. El Administrador de Bibliotecas se abrirá y actualizará la lista de bibliotecas instaladas.

Instalar una librería Arduino paso 1 abrir Library Manager

Puedes buscar 'dht' y 'adafruit unified sensor' y buscar la librería de Adafruit. Seleccione la última versión y luego haga clic en Instalar.

Instalación de una biblioteca Arduino paso 2 DHT Adafruit

Sensor de temperatura y humedad DHT11/DHT22 Código de ejemplo de Arduino

Puedes cargar el siguiente código de ejemplo en tu Arduino utilizando el IDE de Arduino. A continuación, voy a explicar cómo funciona el código.

Puede copiar el código haciendo clic en el botón de la esquina superior derecha del campo de código.

/* Arduino example code for DHT11, DHT22/AM2302 and DHT21/AM2301 temperature and humidity sensors. More info: www.www.makerguides.com */

// Include the libraries:
#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ía ver la siguiente salida en el monitor de serie (Ctrl + Shift + M):

Sensor de temperatura y humedad DHT11 Salida de monitorización en serie
Salida de monitorización en serie

Explicación del código

El primer paso es incluir la librería Adafruit DHT y Unified Sensor.

// Include the libraries:
#include <Adafruit_Sensor.h>
#include <DHT.h>

A continuación, tenemos que definir el pin de conexión de DHT a Arduino y también establecer el tipo de sensor DHT. En nuestro ejemplo, estamos utilizando un sensor DHT11 conectado al pin 2.

La declaración #define se utiliza para dar un nombre a un valor constante. El compilador reemplazará cualquier referencia a esta constante con el valor definido cuando el programa sea compilado. Por lo tanto, siempre que se mencione DHTPIN, el compilador lo sustituirá por el valor 2 cuando se compile 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)

A continuación, hay que crear una nueva instancia de la clase DHT con el tipo de DHT y la conexión adecuados. Para ello, utilizamos la función DHT(pin,type).

En este caso, he llamado al sensor 'dht', pero también puedes utilizar otros nombres, como 'temperature_sensor' o 'dht11', etc. DHT temperature_sensor = DHT(DHTPIN, DHTTYPE);. Puede crear múltiples instancias de la clase DHT con diferentes nombres y pines/tipos. Esto le permite utilizar fácilmente 2 o más sensores al mismo tiempo.

// Initialize DHT sensor for normal 16mhz Arduino:
DHT dht = DHT(DHTPIN, DHTTYPE);

En el setup(), iniciamos la comunicación en serie con una tasa de baudios de 9600. Asegúrese de que el Monitor Serial también está ajustado 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();
}

El loop() del código comienza con un retraso de 2 segundos. Este retardo está ahí para dar al sensor algo de tiempo para hacer las lecturas. La velocidad máxima de detección 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 súper fácil porque la biblioteca tiene varias funciones incorporadas. Para obtener una lectura de humedad en '%', puedes utilizar la función readHumidity(). En este caso, estamos guardando la lectura como la variable 'h'. Tenga en cuenta que es del tipo float.

Cuando quieras usar una función en el objeto DHT, primero tienes que especificar el nombre que le diste al sensor. Así que en nuestro caso esto 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);

A continuación, hay una pequeña sección de código que comprueba si el sensor está conectado correctamente y devuelve una lectura. Si no es así, se imprimirá un mensaje de error en el Monitor Serial.

// 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 biblioteca también tiene una función incorporada que puede calcular el índice de calor combinando las lecturas de temperatura y humedad. El índice de calor también se conoce como "temperatura del aire sentida" o "temperatura aparente".

// 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 Serial. Observe que la línea Serial.print(" \xC2\xB0"); se utiliza para imprimir el símbolo de grado.

Serial.print("Humedad: ");
Serial.print(h);
Serial.print(" % ");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.print(" \NC2\xB0");
Serial.print("C | ");
Serial.print(f);
Serial.print(" \xC2\xB0");
Serial.print("F ");
Serial.print("Índice de calor: ");
Serial.print(hic);
Serial.print(" \xC2\xB0");
Serial.print("C | ");
Serial.print(hif);
Serial.print(" \xC2\xB0");
Serial.println("F");

Código de ejemplo para el 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 barata.

En el siguiente ejemplo, voy a utilizar una pantalla LCD de caracteres I2C como esta de Amazon. Puedes leer más sobre el uso de un LCD I2C con Arduino en el siguiente artículo:

Si tienes una pantalla LCD normal sin mochila I2C, consulta el siguiente tutorial:

Tendrá que hacer algunas conexiones adicionales al Arduino para que podamos controlar la pantalla LCD de 16×2 caracteres. El sensor DHT11 o DHT22/AM2302 se conecta de la misma manera que antes.

El siguiente diagrama de cableado muestra cómo conectar una pantalla LCD I2C al Arduino.

DHT11-con-I2C-LCD-y-Arduino-UNO-diagrama-cableado-esquema
Sensor de temperatura y humedad DHT11 con LCD de 16×2 caracteres I2C y diagrama de cableado de Arduino

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

Conexiones I2C LCD

I2C LCDArduino
GNDGND
VCC5 V
SDAA4
SCLA5

Si no estás usando un Arduino Uno, los pines SDA y SCL pueden estar en una ubicación diferente. Un Arduino UNO con la disposición R3 (pinout 1.0), también tiene las cabeceras de los pines SDA (línea de datos) y SCL (línea de reloj) cerca del pin AREF. Consulta la tabla siguiente para obtener más detalles.

JuntaSDASCL
Arduino UnoA4A5
Arduino NanoA4A5
Arduino Micro23
Arduino Mega 25602021
Arduino Leonardo23
Arduino Due2021
Ubicaciones de los pines I2C para diferentes placas Arduino

El código utiliza la biblioteca LiquidCrystal_I2C, que puedes descargar aquí en GitHub. También incluye la librería Wire.h, que permite comunicarse con dispositivos I2C. Esta biblioteca debería venir preinstalada con el IDE de Arduino.

El código de abajo es mayormente el mismo que antes, pero ahora mostramos la temperatura y la humedad en la pantalla LCD en vez de en el monitor serial.

Puede copiar el código haciendo clic en el botón de 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 the libraries:
#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(" %");
}

Debería ver la siguiente salida en la pantalla LCD:

(Próximamente)


Guía de resolución de problemas del DHT11/DHT22

Cuando se trabaja con estos sensores, es posible que aparezcan los siguientes mensajes de error:

"¡Fallo en la lectura del sensor DHT!"

Este mensaje puede aparecer en el monitor de serie cuando el sensor no devuelve una lectura. Esto puede tener varias causas:

  • Tipo de sensor: Asegúrese de que ha descomentado el DHTTYPE correcto en la configuración del código. Compruebe el ejemplo anterior.
  • Velocidad de muestreo: Los sensores DHT son bastante lentos, la frecuencia de muestreo máxima es de unos 2 segundos. Aumentar el retardo entre las mediciones podría resolver este error.
  • Alimentación: Aunque los sensores DHTxx pueden funcionar de 3,3 a 5 V, el fabricante recomienda 5 V. En algunos casos, alimentar el sensor con 5 V resuelve el problema. Asegúrate de que tu microcontrolador también soporta 5 V en los pines GPIO.

Error fatal: Adafruit_Sensor.h: No such file or directory

Es posible que obtenga este error cuando intente compilar el código. Esto significa que no has instalado (correctamente) la biblioteca de sensores unificados de Adafruit.

Sólo tienes que desplazarte un poco hacia arriba en este post y verás dónde y cómo puedes descargar e instalar la biblioteca.

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 utilizarlos con Arduino. Espero que te haya resultado útil e informativo. Si lo has hecho, ¡compártelo con un amigo al que también le guste la electrónica y hacer cosas!

Me encantaría saber qué proyectos planeas construir (o ya has construido) con este sensor. Si tienes alguna pregunta, sugerencia o si crees que faltan cosas en este tutorial, por favor deja un comentario abajo.

Tenga en cuenta que los comentarios son retenidos por la moderación para evitar el spam.

Licencia Creative Commons

Hamid

Sábado 11 de abril de 2020

Gracias fue muy útil y todo explicado uno y otro por eso aprendí a escribir código básico para el primer paso. Gracias de nuevo

Robert Colinares

Domingo 12 de enero de 2020

¿Puede proporcionar el pinout para LCD1602 sin el I2C?

Benne de Bakker

Sábado 16 de mayo de 2020

Sí, consulte este artículo: https://www.makerguides.com/character-lcd-arduino-tutorial/