¿Qué es un DHT11/DHT22?
El DHT11 y el DHT22 son dos modelos de una misma familia de sensores, que permiten realizar la medición simultánea de temperatura y humedad.
Estos sensores disponen de un procesador interno que realiza el proceso de medición, proporcionando la medición mediante una señal digital, por lo que resulta muy sencillo obtener la medición desde un microprocesador como Arduino.
Ambos sensores presentan un encapsulado de plástico similar. Podemos distinguir ambos modelos por el color del mismo. El DHT11 presenta una carcasa azul, mientras que en el caso del sensor DHT22 el exterior es blanco.
De ambos modelos, el DHT11 es el hermano pequeño de la familia, y cuenta peores características técnicas. El DHT22 es el modelo superior pero, por contra, tiene un precio superior.
Las características del DHT11 son realmente escasas, especialmente en rango de medición y precisión.
- Medición de temperatura entre 0 a 50, con una precisión de 2ºC
- Medición de humedad entre 20 a 80%, con precisión del 5%.
- Frecuencia de muestreo de 1 muestras por segundo (1 Hz)
El DHT11 es un sensor muy limitado que podemos usar con fines de formación, pruebas, o en proyectos que realmente no requieran una medición precisa.
Por el contrario, el modelo DHT22 tiene unas características mucho más aceptables.
- Medición de temperatura entre -40 a 125, con una precisión de 0.5ºC
- Medición de humedad entre 0 a 100%, con precisión del 2-5%.
- Frecuencia de muestreo de 2 muestras por segundo (2 Hz)
EL DHT22 (sin llegar a ser en absoluto un sensor de alta precisión) tiene unas características aceptables para que sea posible emplearlo en proyectos reales de monitorización o registro, que requieran una precisión media.
Los sensores de temperatura y, aún más, los sensores de humedad, son sensores con elevada inercia y tiempos de respuesta elevados. Es decir, al «lentos» para reflejar los cambios en la medición.
Esquema de montaje
La conexión del DH11 y el DHT22 son idénticas, ya que como hemos comentado la única diferencia entres modelos son sus prestaciones. En ambos casos, disponemos de 4 patillas, de las cuales usaremos 3, Vcc, Output y GND.
Conectar el sensor es sencillo, simplemente alimentamos desde Arduino al sensor a través de los pines GND y Vcc del mismo. Por otro lado, conectamos la salida Output a una entrada digital de Arduino. Necesitaremos poner una resistencia de 10K entre Vcc y el Pin Output.
El esquema eléctrico queda como la siguiente imagen
Mientras que el montaje en una protoboard sería el siguiente.
Código de ejemplo
Los sensores DHT11 y DHT22 usan su propio sistema de comunicación bidireccional mediante un único conductor, empleando señales temporizadas.
En cada envío de medición el sensor envía un total de 40bits, en 4ms. Estos 40 bits corresponden con 2 Bytes para la medición de humedad, 2 Bytes para la medición de temperatura, más un Byte final para la comprobación de errores (8bit integral RH data + 8bit decimal RH data + 8bit integral T data + 8bit decimal T data + 8bit check sum)
Para mayor información sobre el funcionamiento y detalles de la comunicación, consultar el datasheet de la serie DHTXX.
Podemos leer los datos del sensor directamente generando y leyendo las señales temporizadas según el protocolo del DHTXX. En general, lo normal es que empleemos una librería existente para simplificar el proceso.
Existen varias librerías disponibles. Por ejemplo, podemos usar la Librería de Adafruit.
Descargamos e instalamos la librería y cargamos el código de ejemplo, o la siguiente versión simplificada
#include "DHT.h"
// Descomentar el que sera usado, en este caso el DHT22.
//#define DHTTYPE DHT11 // DHT 11
#define DHTTYPE DHT22 // DHT 22 (AM2302), AM2321
//#define DHTTYPE DHT21 // DHT 21 (AM2301)
// Conectar el pin 1 (en la izquierda) del sensor a +5V.
// NOTA: Si estas usando una placa con lógica 3.3V
// como la de Arduino Due, conectar el pin 1 a 3.3V en vez de 5v.
// Conectar el pin 2 del sensor a cualquiera que sea tu DHTPIN.
// Conectar el pin 4 (en la derecha) del sensor a GROUND.
// Conectar el una resistencia de 10K desde el pin 2 (data)
// al pin 1 (power) del sensor.
const int DHTPin = 5; // A qué pin digital estamos conectados.
DHT dht(DHTPin, DHTTYPE);
void setup() {
Serial.begin(9600);
Serial.println("DHTxx test!");
dht.begin();
}
void loop() {
// Esperar un par de segundos entre mediciones.
delay(2000);
// Leer temperatura o humedad toma aproximadamente 250ms.
float h = dht.readHumidity();
float t = dht.readTemperature();
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
return;
}
Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.print(" *C ");
}
Cargamos el programa en Arduino, y empezaremos a recibir por el puerto serie los valores de temperatura y humedad.