Sensor de temperatura y humedad DHT11 - DHT22
Añade sensor de temperatura y humedad a tus proyectos facilmente.
Vamos a centrarnos en los sensores DHT11 o DHT22. Elegimos éste modelo porque con un único sensor podemos medir temperatura y humedad.
Una particularidad de estos sensores es que la señal de salida es digital, por lo tanto, lo tendremos que conectar a pines digitales.
Llevan un pequeño microcontrolador interno para hacer el tratamiento de señal.
¿Cómo funcionan?
Los DHT11 y DHT22 se componen de un sensor capacitivo para medir la humedad y de un termistor.
La principal diferencia entre ambos es que el ciclo de operación es menor en el DHT11 que en el DHT22, sin embargo, el DHT22 tiene rangos de medida más amplios y mayor resolución, a cambio de resultar algo más caro.
Ambos sensores están calibrados en laboratorio y tienen una buena fiabilidad.
Son además muy fáciles de conectar y sólo requieren de un pin de Arduino.
Podéis descargar el Data Sheet de aqui.
Encapsulado.
Existen en el mercado tres variantes:
El sensor suelto, con un encapsulado azul y cuatro pines disponibles para conectar. (Será necesario añadir la resistencia pull-up)
El sensor con una placa soldada, con tres pines disponibles para conectar y una resistencia pull-up (normalmente de 4,7-10 kΩ).
El mismo formato que el anterior, pero con un condensador de filtrado (normalmente de 100 nF).
A modo de recomendación, si podéis, comprarlo con la resistencia pull-up y evitar tener que soldarla, nos hace más sencillo la construcción.
Características de cada uno de los sensores:
Parámetro |
DHT11 |
DHT22 |
Alimentación |
3Vdc ≤ Vcc ≤ 5Vdc |
3.3Vdc ≤ Vcc ≤ 6Vdc |
Señal de Salida |
Digital |
Digital |
Rango de medida Temperatura |
De 0 a 50 °C |
De -40°C a 80 °C |
Precisión Temperatura |
±2 °C |
<±0.5 °C |
Resolución Temperatura |
0.1°C |
0.1°C |
Rango de medida Humedad |
De 20% a 90% RH |
De 0 a 100% RH |
Precisión Humedad |
4% RH |
2% RH |
Resolución Humedad |
1%RH |
0.1%RH |
Tiempo de respuesta |
1s |
2s |
Tamaño |
12 x 15.5 x 5.5mm |
14 x 18 x 5.5mm |
Ciclo de operación.
Es el tiempo que el sensor tarda en ofrecer una respuesta desde que se le pide.
Formato de datos de un solo bus para la comunicación y sincronización entre MCU y el sensor. El proceso de comunicación es de 4 ms aproximadamente.
Una transmisión de datos completa es de 40 bits. Donde obtenemos la temperatura y la humedad.
Ejemplo: Recibimos 40 bits:
- 0011 0101 0000 0000 0001 1000 0000 0000 0100 1101
High humidity 8 + Low humidity 8 + High temp. 8 + Low temp. = 8 Parity bit
Calculando:
- 0011 0101+0000 0000+0001 1000+0000 0000= 0100 1101
Datos correctos recibidos:
- Humedad:0011 0101 = 35H = 53%RH
- Temperatura:0001 1000 = 18H = 24℃
El microcontrolador externo y el microcontrolador que lleva integrado el sensor, se hablan entre sí de la siguiente manera:
- Se inicia la comunicación.
- El sensor responde estableciendo un nivel bajo de 80us y un nivel alto de 80us.
- El sensor envía 5 bytes con la información de temperatura y humedad.
Ahora que ya sabemos esto, podemos decidir si utilizar la libreria que nos proporciona para arduino, o simplemente realizar éstas operaciones nosotros mismos sin necesidad de libreria.
Pinout.
Los pines del DHT11 y del DHT22 siguen el mismo orden.
- VCC.
- Señal.
- NC.
- GND.
Conexión de un DHT11 a Arduino Uno.
Del montaje realizado, destacamos que no utilizamos el pin 3, y que el resistor tiene que conectarse entre la alimentación y el pin de salida de datos.
Si hemos comprado el sensor suelto, debemos basarnos en este esquema para conectar con nuestro arduino.
Conectamos el sensor con arduino.
Por el contrario, si hemos comprado el sensor con la resistencia pull-up conectamos cada ping con arduino directamente.
Seguramente necesiteis descargar tambien la libreria del sensor. Descargar aqui.
Vemos el skecth con el que tenemos que programar el microcontrolador.
#include "DHT.h"
#include <LiquidCrystal.h>
#define DHTPIN 8 //Data
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
LiquidCrystal lcd(8, 13, 9, 4, 5, 6, 7);
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
dht.begin();
}
void loop() {
float h = dht.readHumidity();
float t = dht.readTemperature();
lcd.setCursor(0,0);
lcd.print("Temperatura ");
lcd.print(t,0);
lcd.print("C");
lcd.setCursor(0,1);
lcd.print("Humedad ");
lcd.print(h,0);
lcd.print("%");
delay(1200);
}
En éste caso utilizaremos una pantalla LCD para ver el resultado que nos envía el sensor.
También es interesante recordar, que aunque el sensor entrega señales de naturaleza analógica como son la humedad y la temperatura, estas señales las leemos por un pin digital de Arduino y que en un solo pin somos capaces de obtener dos lecturas, viendo así la ventaja que aportan las señales digitales frente a las analógicas: menos cables y más simplicidad en los montajes.