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:
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:
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.