Cómo manejar el sensor de temperatura y humedad DHT22 con el ESP8266

Cuando empezamos a pensar en sensores que podemos utilizar con nuestro ESP8266, uno de los primeros que se nos suele venir a la cabeza es uno de temperatura. Casi todo el mundo tiene algún tipo de termómetro por casa para saber qué temperatura hace, ¿por qué no va a ser lo primero que digitalicemos? Vamos a ver cómo podemos manejar un sensor de temperatura y humedad con nuestro ESP8266.

El sensor DHT22

Sensores de temperatura hay muchos, pero uno bastante famoso que funciona bien y tiene un precio bastante ajustado es el DHT22. Este sensor permite medir temperatura y humedad proporcionandonos una señal digital fácil de manejar con nuestro ESP. Las principales características son:

  • Alimentación: 3.3V a 6V
  • Temperatura: de -40º a 80º grados con una precisión de +-0.5º
  • Humedad: de 0 a 100% con una precisión de +-2 a 5%
  • Precio: de 4 a 8€

Se puede conseguir de dos formas principales:

En mi caso me compré el segundo tipo para no tener que utilizar nada más y poder conectarlo directamente al ESP8266 o a un Arduino. Si te quieres gastar menos dinero y no te importa perder precisión porque sólo quieres jugar un poco también existe el DHT11 que es el hermano pequeño del DHT22 a un precio más reducido.

¿Cómo utilizar el sensor DHT22?

Después de un poco de teoría, vamos con la práctica. Para el ejemplo que vamos a hacer vamos a utilizar lo de siempre más el sensor de temperatura y humedad DHT22. Lo primero que vamos a hacer antes de empezar a escribir código es conectar el sensor a nuestro módulo ESP. Para ello tenemos que conectar los 3 pines disponibles (datos, alimentación y tierra) a los pines de nuestra placa.

En mi caso he conectado el pin de datos al GPIO2 que corresponde con el D4 impreso en la placa. Lo puedes conectar a cualquier otro GPIO pero tienes que saber el número para luego acceder a el desde el código, para ello puedes ver la correspondencia en la siguiente imagen:

Puedes ver cómo ha quedado mi conexión en las siguientes imágenes:


Una vez lista la conexión, vamos a pasar a escribir el código que leerá los datos del sensor cada 2 segundos e imprimirá por pantalla la información de la temperatura y la humedad actual. En este caso vamos a utilizar una librería que no está incluida en el firmware del ESP8266 por lo que tenemos que importarla al proyecto antes de poder utilizarla.

Para importar una librería a nuestro proyecto de PlatformIO tenemos varias maneras, pero la más sencilla es añadir la dependencia en el fichero platformio.ini que podemos encontrar en nuestro proyecto. La librería que tenemos que añadir es DHT sensor library y lo haremos dentro del apartado de libs_deps. De esta manera, PlatformIO buscará y descargará la librería por nosotros sin necesidad de hacer nada más.

[env:nodemcuv2]
platform = espressif8266
board = nodemcuv2
framework = arduino

lib_deps =
     DHT sensor library

Una vez que tenemos la librería importada vamos a empezar a escribir nuestro código donde deberemos de declarar dos constantes, una indicando el pin de nuestro ESP8266 donde hemos conectado la salida de datos del sensor (GPIO 2 en mi caso) y la otra indicando el tipo de sensor ya que la librería puede manejar varios diferentes. También tenemos que declarar una variable dht para manejar la librería e inicializarla con las dos constantes.

#include <DHT.h>

#define DHTPIN 2
#define DHTTYPE DHT22

DHT dht(DHTPIN, DHTTYPE);

En el método setup lo único que tenemos que hacer es invocar el método begin de la librería.

void setup() {
  Serial.begin(9600);
  Serial.println("DHT22 test!");

  dht.begin();
}

Lo interesante está en el método loop en el que vamos a extraer los datos de temperatura y humedad. La humedad la extraemos llamando al método readHumidity, la temperatura en grados Celsius con el método readTemperature sin pasarle ningún parámetro ya que por defecto lo devuelve en esa medida y por último si queremos la temperatura en grados Fahrenheit debemos de pasarle un true al método readTemperature.

  float humidity = dht.readHumidity();
  float celsiusTemperature = dht.readTemperature();
  float fahrenheitTemperature = dht.readTemperature(true);

Vamos a añadir una comprobación extra por si por algún problema el sensor nos devuelve valores erróneos o no nos devuelve nada.

  if (isnan(humidity) || isnan(celsiusTemperature) || 
      isnan(fahrenheitTemperature)) {
    Serial.println("Failed to read from DHT22 sensor!");
    return;
  }

Finalmente vamos a imprimir por pantalla toda la información para verla de una manera clara.

  Serial.print("Humidity: ");
  Serial.print(humidity);
  Serial.print(" % ");
  Serial.print("   Temperature: ");
  Serial.print(celsiusTemperature);
  Serial.print(" °C ");
  Serial.print(fahrenheitTemperature);
  Serial.println(" °F");

Si compilamos y ejecutamos el código podremos ver por la salida del monitor serie toda la información:

Esto es todo lo que necesitamos para obtener la temperatura y humedad de nuestra casa utilizando el ESP8266 y el sensor DHT22. Puedes encontrar el ejemplo completo en mi GitHub y si tienes cualquier duda no dudes en dejar un comentario.