El DHT22 es un sensor de temperatura y humedad de bajo costo muy popular. En este artículo te muestro como utilizarlo en Arduino conectándolo a una placa con el ESP8266 y a otra con el ESP32.
El DHT22
El DHT22 (Digital Humidity and Temperature) es un sensor de bajo costo que integra un sensor capacitivo para medir la humedad ambiente y un termistor para medir la temperatura. Estos sensores se conectan internamente a un chip que convierte estos valores a señales digitales que pueden ser accedidas fácilmente por un microcontrolador.
Habitualmente este sensor, también denominado AM2302, está disponible en un encapsulado plástico blanco, con cuatro pines de conexión, aunque también se lo puede encontrar montado sobre una placa con sólo 3 pines.
Conexiones
En el encapsulado de 4 pines, dos de ellos corresponden a la alimentación (5 Voltios y masa), un pin es para la lectura y escritura de comandos y datos y otro sin uso, como puedes ver en la siguiente imagen:
El pin de Datos necesita una resistencia de PULL UP de 10K para funcionar correctamente. Cuando el sensor viene montado sobre una placa, esa resistencia generalmente ya viene incorporada, pero en el caso del encapsulado de 4 pines nosotros debemos agregarla en nuestro circuito.
Características
El DHT22 es una versión un poco mejorada de otro sensor muy popular, el DHT11 que habitualmente tiene un encapsulado azul. Tiene rangos de medición mas amplios, menos error pero es mas lento.
Las características principales del DHT22 son las siguientes:
- Alimentación de 3 a 5V
- Consumo máximo de 2.5mA durante la conversión
- Rango de humedad: 0-100% con un error entre 2 y 5%
- Rango de temperatura: -40 a 80°C con un error de ±0.5°C
- Velocidad de lectura máxima: 0.5 Hz (una lectura cada 2 segundos)
Conexiones
ESP8266
Para mostrar la conexión a un ESP8266 utilicé una D1 mini, con el sensor conectado al pin D2 (GPIO4) y alimentado con la salida de 3V3 que provee la placa. Como puedes apreciar en la Fig. 3 de mas abajo, también agregué la resistencia de Pull Up de 10K en el pin de datos.
ESP32
En este caso utilicé una placa ESP32-Devkit de 30 pines. El sensor también se alimenta desde la salida de 3V3 y el pin de datos está conectado a D4 (GPIO4), igual que en el caso anterior para poder utilizar el mismo programa.
Programación
Librerías
Afortunadamente, para leer este sensor tenemos librerías que nos evitan escribir el código desde cero. Te recomiendo utilizar una de la empresa Adafruit denominada DHT sensor library que puedes encontrar en este repositorio de Github.
Para instalarla, como con cualquier otra librería, debes ir al gestor de librerías seleccionando desde el menú Programa – Incluir Librería – Administrar Biblioteca y luego buscarla escribiendo “DHT”. Entre todas las que aparecen, selecciona la de Adafruit y pulsa sobre el botón Instalar.
Esta librería depende de otras, asi que verás un aviso como el siguiente. Selecciona Install all.
Luego de unos instantes en los que se descargan e instalan todas las librerías necesarias, ya queda todo listo para escribir el programa.
El programa
A continuación veamos un programa mínimo para acceder al DHT22 e imprimir los valores de temperatura y humedad leídos.
Analicemos su funcionamiento:
En la línea 3 se incluye la librería DHT.h que vimos mas arriba que tiene todas las funciones que necesitamos para acceder al sensor.
La línea 5 define pinDatos con el valor 4 (GPIO4). Este será el pin que emplearemos para conectar las placas con el sensor. En el caso de la D1 mini, GPIO4 está conectado al pin denominado D2, mientras que en la placa del ESP32, este pin está marcado D4.
A continuación, en la línea 8 se crea (o se instancia) el objeto sensorTH de la clase DHT, al tiempo que se le indica que use el pin pinDatos y que el sensor es del tipo DHT22 (es necesario que especifiques el tipo de sensor porque la misma librería sirve también para el sensor DHT11).
Dentro de la función setup se inicializa el monitor serie y se imprime un texto indicando que arranca el programa. En la línea 15 también se inicializa el objeto sensorTH con el método begin, preparándolo para su uso.
//Lectura de DHT22 #include "DHT.h" #define pinDatos 4 //GPIO4 = D2 en D1 Mini, D4 en ESP32 DHT sensorTH (pinDatos, DHT22); //Crea objeto sensorTH void setup() { Serial.begin (115200); Serial.println ("***** Lectura DHT22 *****"); sensorTH.begin (); //Inicializa pines del sensor } void loop() { delay (2000); //Lee valores de temperatura y humedad float humedad = sensorTH.readHumidity(); float temperatura = sensorTH.readTemperature(); //Mostrar valores leídos Serial.print ("Temperatura = "); Serial.print (temperatura); Serial.println (" ºC"); Serial.print ("Humedad = "); Serial.print (humedad); Serial.println (" %"); }
Siguiendo con el análisis, en la línea 19 empieza la función loop, que se repite indefinidamente.
En la línea 21 se hace un delay de dos segundos, ya que debemos respetar la frecuencia máxima de lectura del sensor. Intentar leerlo mas seguido puede provocar valores erróneos.
En las líneas 24 y 25 se leen respectivamente los valores medidos de humedad y temperatura con los métodos readHumidity y readTemperature que devuelven valores en porcentaje para el primero y grados centígrados para el segundo.
Finalmente, desde la línea 28 se sacan los valores leídos por el monitor serie.
Otros métodos y usos
Veamos ahora otros métodos disponibles en la librería, u otras formas de utilizar los métodos anteriores:
float t = dht.readTemperature (true);
Invocado de esta forma, el método readTemperature devuelve el valor en grados Fahrenheit en vez de Celsius.
float hif = dht.computeHeatIndex (f, h);
Este método devuelve el valor de sensación térmica calculado a partir de la temperatura y humedad, en grados Fahrenheit.
float hic = dht.computeHeatIndex(t, h, false);
Invocado de esta manera, el mismo método calcula la sensación térmica en grados Celsius.
Conclusión
Si bien existen sensores de temperatura y humedad mas precisos y de mejor calidad que el DHT22, como el BME280, aún se lo puede emplear en aplicaciones simples donde no necesitemos mucha precisión. En este artículo vimos que es muy fácil de conectar y también de programar, requiriendo sólo el agregado de una librería.
En otros artículos veremos otros sensores y de que manera debemos conectarlos a distintas placas , programándolos siempre en el entorno Arduino.
Si tienes alguna duda o sugerencia, no dudes en escribirla mas abajo en la sección de comentarios.
Hasta la próxima!
Para aprender más
Hoja de datos (datasheet) del DHT22
Muy buenos esos datos
Gracias totales