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
- Tutorial de sensor de temperatura analógico LM35 con Arduino
- Tutorial del sensor de temperatura analógico TMP36 con Arduino
Suministros
Componentes de hardware
Sensor DHT11 de 4 pines | × 1 | Amazon |
Sensor DHT22/AM2302 de 4 pines | × 1 | Amazon |
Sensor DHT11 de 3 pines (recomendado) | × 1 | Amazon |
Sensor DHT22/AM2302 de 3 pines (recomendado) | × 1 | Amazon |
Resistencia de 5 - 10 kΩ (sólo para sensores de 4 pines) | × 1 | Amazon |
Arduino Uno Rev3 | × 1 | Amazon |
Tablero de pruebas | × 1 | Amazon |
Cables de puente | ~ 10 | Amazon |
Cable USB tipo A/B | × 1 | Amazon |
LCD I2C de 16×2 caracteres (opcional) | × 1 | Amazon |
Software
Makerguides.com is a participant in the Amazon Services LLC Associates Program, an affiliate advertising program designed to provide a means for sites to earn advertising fees by advertising and linking to products on Amazon.com. As an Amazon Associate we earn from qualifying purchases.
¿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 sí 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 funcionamiento | 3.3 - 5.5 V |
Corriente de trabajo | Medición: 0,3 mA, en espera: 60 μA |
Rango de medición de la humedad | 5 - 95 % RH ± 5 % RH |
Rango de medición de la temperatura | -20 - 60 °C ± 2 °C |
Protocolo de comunicación | 1 hilo |
Período de muestreo | > 2 segundos |
Dimensiones de la carrocería | 15,5 x 12 x 5,5 mm |
Dimensiones de las clavijas | 8 mm de longitud, 2,54 mm de separación |
Ventaja | Ultra bajo coste |
Coste | Comprobar 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 funcionamiento | 3.3 - 5.5 V |
Corriente de trabajo | Medición: 0,5 mA, en espera: 15 μA |
Rango de medición de la humedad | 0 - 99,9 % RH ± 2 % RH |
Rango de medición de la temperatura | -40 - 80 °C ± 1 °C |
Protocolo de comunicación | Protocolo de bus de 1 hilo |
Período de muestreo | 2 segundos |
Dimensiones de la carrocería | 25 x 15 x 7 mm, ⌀ agujero de montaje de 3 mm |
Dimensiones de las clavijas | 7 mm de longitud, 2,54 mm de separación |
Ventaja | Más preciso |
Coste | Comprobar 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.
As you can see, the specifications of the DHT11 and the DHT22/AM2302 are quite similar. The main difference is that the DHT22 is more accurate and has a larger measuring range. The DHT11 is a bit smaller than the DHT22 and is also less expensive.
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).
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/DHT22 | Arduino |
---|---|
Clavija 1 | 5 V |
Clavija 2 | Conectar al pin digital 2 y a 5 V mediante una resistencia de 10 kΩ |
Clavija 3 | No conectado |
Clavija 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 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.
Conexiones DHT11 de 3 pines
3 Clavijas DHT11 | Arduino |
---|---|
s | Clavija 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.
Conexiones de 3 pines DHT22/AM2302
DHT22 de 3 pines | Arduino |
---|---|
DAT | Clavija digital 2 |
VCC | 5 V |
GND | GND |
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.
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.
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 "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):
Explicación del código
El primer paso es incluir la librería Adafruit DHT y Unified Sensor.
#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);
Setup function
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(); }
Loop function
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.
Las conexiones también se indican en la siguiente tabla:
Conexiones I2C LCD
I2C LCD | Arduino |
---|---|
GND | GND |
VCC | 5 V |
SDA | A4 |
SCL | A5 |
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.
Junta | 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 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 "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 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.
Esta obra está bajo una licencia de Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Otros enlaces útiles de la web:
Benne is professional Systems Engineer with a deep expertise in Arduino and a passion for DIY projects.
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/