Leer temperatura y humedad con DHT22 y ESP8266

En este post te mostraré cómo usar el sensor DHT22 o el sensor DHT11 para leer la temperatura y humedad e imprimir los valores en el monitor serial. Voy a usar la tarjeta NodeMCU ESP8266.

Requisitos

Lo que necesitas es instalar las librerías para DHT, sobre todo si usas VSCode con PlatformIO.

Circuito de conexión

Aquí tenemos al circuito que conecta el sensor de temperatura y humedad DHT22 con la tarjeta ESP8266:

Circuito – Sensor DHT22 con ESP8266

Como lo indico en la imagen: al subir el programa hay que desconectar el sensor del pin D8. También hay que desconectarlo al usar el monitor serial.

Es decir: desconectamos el sensor de pin D8, conectamos la tarjeta, abrimos el monitor serial y después conectamos el pin D8 como estaba.

Eres libre de usar otro pin.

Importar librerías y definir modelo de sensor

Comenzamos incluyendo DHT.h y definiendo el modelo del sensor. Ya hay constantes con los nombres de los sensores.

También creamos una nueva instancia de DHT indicando el pin y el modelo del sensor. Del mismo modo creamos algunas variables globales que tendrán el valor de la temperatura y humedad

#define PIN_CONEXION D8// A cuál pin está conectado el lector
#define TIPO_SENSOR DHT22 // Puede ser DHT11 también

DHT sensor(PIN_CONEXION, TIPO_SENSOR);


float humedad, temperaturaEnGradosCelsius = 0;

int ultimaVezLeido = 0;
long milisegundosDeEsperaParaLeer = 2000; // 2 segundos

Método setup

Debido a que vamos a mostrar la temperatura en el monitor serial necesitamos establecer la comunicación a 9600 baudios.

Una cosa importante es invocar al método sensor.begin, pues este método configura el pin como un pin de entrada, para que se obtengan lecturas precisas.

void setup() {
  Serial.begin(9600);
  Serial.setTimeout(2000);
  // Muy importante la siguiente línea, pues configura el pin del sensor como INPUT_PULLUP
  sensor.begin();

  while(!Serial) { }// Esperar que haya conexión serial

  Serial.println("Iniciando el dispositivo");
  Serial.println("Practica de IoT");
}

Método loop

Dentro del loop vamos a leer al sensor cada 2 segundos. Es decir, no podemos leerlo cada instante. Además, es importante mencionar que la lectura puede llevarse hasta medio segundo.

Para obtener la temperatura invocamos a readTemperature, y para leer la humedad podemos invocar a readHumidity.

En ocasiones habrá problemas de lectura en el sensor, y los métodos mencionados arriba devolverán nan, es decir, not a number. Por lo tanto debemos atrapar ese error para no tener resultados inesperados.

void loop() {
  // Debemos leer cada 2 segundos
  if(ultimaVezLeido > milisegundosDeEsperaParaLeer) {
    humedad = sensor.readHumidity();
    temperaturaEnGradosCelsius = sensor.readTemperature();
    // En ocasiones puede devolver datos erróneos; por eso lo comprobamos
    if (isnan(temperaturaEnGradosCelsius) || isnan(humedad)) {
      Serial.println("Error leyendo valores");
      ultimaVezLeido = 0;
      return;
    }
    // En caso de que todo esté correcto, imprimimos los valores
    Serial.print("Humedad: ");
    Serial.print(humedad);
    Serial.print(" %\t");
    Serial.print("Temperatura: ");
    Serial.print(temperaturaEnGradosCelsius);
    Serial.println(" *C");

    ultimaVezLeido = 0;
  }
  // Aquí podemos hacer otras cosas...


  // Esperamos 100 milisegundos y también los aumentamos al contador, de este
  // modo evitamos un delay de 2000 milisegundos y podemos hacer otras cosas
  // por aquí
  delay(100);
  ultimaVezLeido += 100;
}

Código completo para leer temperatura y humedad

Bien, ya expliqué el código por partes. Ahora veamos el código completo que nos permitirá usar el DHT22 con la tarjeta ESP8266 y otras.

/*

  ____          _____               _ _           _       
 |  _ \        |  __ \             (_) |         | |      
 | |_) |_   _  | |__) |_ _ _ __ _____| |__  _   _| |_ ___ 
 |  _ <| | | | |  ___/ _` | '__|_  / | '_ \| | | | __/ _ \
 | |_) | |_| | | |  | (_| | |   / /| | |_) | |_| | ||  __/
 |____/ \__, | |_|   \__,_|_|  /___|_|_.__/ \__, |\__\___|
         __/ |                               __/ |        
        |___/                               |___/         
    
    Blog:       https://parzibyte.me/blog
    Ayuda:      https://parzibyte.me/blog/contrataciones-ayuda/
    Contacto:   https://parzibyte.me/blog/contacto/
    
    Copyright (c) 2020 Luis Cabrera Benito
    Licenciado bajo la licencia MIT
    
    El texto de arriba debe ser incluido en cualquier redistribucion
*/
#include "DHT.h"

/*
Nota importante: si usas el pin D8 (como lo recomiendo)
  recuerda desconectar el lector del mismo cada vez que reinicies
  o quieras subir el código, pues el mismo "interfiere" con el
  monitor serial
*/

#define PIN_CONEXION D8// A cuál pin está conectado el lector
#define TIPO_SENSOR DHT22 // Puede ser DHT11 también

DHT sensor(PIN_CONEXION, TIPO_SENSOR);


float humedad, temperaturaEnGradosCelsius = 0;

int ultimaVezLeido = 0;
long milisegundosDeEsperaParaLeer = 2000; // 2 segundos

void setup() {
  Serial.begin(9600);
  Serial.setTimeout(2000);
  // Muy importante la siguiente línea, pues configura el pin del sensor como INPUT_PULLUP
  sensor.begin();

  while(!Serial) { }// Esperar que haya conexión serial

  Serial.println("Iniciando el dispositivo");
  Serial.println("Practica de IoT");
}

void loop() {
  // Debemos leer cada 2 segundos
  if(ultimaVezLeido > milisegundosDeEsperaParaLeer) {
    humedad = sensor.readHumidity();
    temperaturaEnGradosCelsius = sensor.readTemperature();
    // En ocasiones puede devolver datos erróneos; por eso lo comprobamos
    if (isnan(temperaturaEnGradosCelsius) || isnan(humedad)) {
      Serial.println("Error leyendo valores");
      ultimaVezLeido = 0;
      return;
    }
    // En caso de que todo esté correcto, imprimimos los valores
    Serial.print("Humedad: ");
    Serial.print(humedad);
    Serial.print(" %\t");
    Serial.print("Temperatura: ");
    Serial.print(temperaturaEnGradosCelsius);
    Serial.println(" *C");

    ultimaVezLeido = 0;
  }
  // Aquí podemos hacer otras cosas...


  // Esperamos 100 milisegundos y también los aumentamos al contador, de este
  // modo evitamos un delay de 2000 milisegundos y podemos hacer otras cosas
  // por aquí
  delay(100);
  ultimaVezLeido += 100;
}

Midiendo temperatura y humedad

Si ahora cargas el programa a la tarjeta y todo está conectado como debería, debes ver las lecturas en el monitor serial:

Leyendo DHT22 con ESP8266 – Mostrar temperatura y humedad en Monitor serial

Obviamente podemos hacer más cosas que enviar los datos al monitor serial. Por ejemplo, podríamos crear un servidor web y mostrar los datos, o enviar los mismos a la nube. Eso lo veremos en próximos tutoriales.

Estoy aquí para ayudarte 🤝💻


Estoy aquí para ayudarte en todo lo que necesites. Si requieres alguna modificación en lo presentado en este post, deseas asistencia con tu tarea, proyecto o precisas desarrollar un software a medida, no dudes en contactarme. Estoy comprometido a brindarte el apoyo necesario para que logres tus objetivos. Mi correo es parzibyte(arroba)gmail.com, estoy como@parzibyte en Telegram o en mi página de contacto

No te pierdas ninguno de mis posts 🚀🔔

Suscríbete a mi canal de Telegram para recibir una notificación cuando escriba un nuevo tutorial de programación.

Dejar un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *