10 - Sensor de temperatura y humedad DHT11
Objetivos
- Conexión de sensores
- Utilizar librerías específicas
- Captación de información de elementos exteriores
- Tratamiento de la información
Material
Imagen | Descripción |
---|---|
![]() |
Arduino Uno o compatible. |
![]() |
Una protoboard |
![]() |
Cables de conexión |
![]() |
Un módulo KY-015 o sensor DHT11 |
Descripción
El DHT11 es un sensor digital de temperatura y humedad relativa de bajo costo y fácil uso. Integra un sensor capacitivo de humedad y un termistor para medir el aire circundante, y muestra los datos mediante una señal digital en el pin de datos (no posee salida analógica). Utilizado en aplicaciones académicas relacionadas con el control automático de temperatura, aire acondicionado, monitoreo ambiental en agricultura y más.
Utilizar el sensor DHT11 con las plataformas Arduino/Raspberry Pi/Nodemcu es muy sencillo tanto a nivel de software como hardware. A nivel de software se dispone de librerías para Arduino con soporte para el protocolo “Single bus”. En cuanto al hardware, solo es necesario conectar el pin VCC de alimentación a 3-5V, el pin GND a Tierra (0V) y el pin de datos a un pin digital en nuestro Arduino. Si se desea conectar varios sensores DHT11 a un mismo Arduino, cada sensor debe tener su propio pin de datos. El protocolo de comunicación entre el sensor y el microcontrolador emplea un único hilo o cable, la distancia máxima recomendable de longitud de cable es de 20m., de preferencia utilizar cable con malla.
Quizás la única desventaja del sensor es que solo se pueden obtener nuevos datos cada 2 segundos.
Características básicas
DHT11 | |
---|---|
Alimentación | de 3,5 V a 5 V |
Consumo | 2,5 mA |
Señal de salida | Digital |
Temperatura | |
---|---|
Rango | de 0ºC a 50ºC |
Precisión | A 25ºC ± 2ºC |
Resolución | 1ºC (8-bit) |
Humedad relativa | |
---|---|
Rango | de 20% HR a 90% HR |
Precisión | Entre 0ºC y 50ºC ± 5% HR |
Resolución | 1% HR |
Puedes ver la hoja de características aquí DHT11-DataSheet (en)
Montaje
Como tenemos dos versiones del sensor de temperatura y humedad DHT11, veremos cómo deberíamos conectarlo a Arduino en ambos casos. Recuerda que trabajaremos con un pin digital. En ambos casos, la alimentación puede ser de 3,5 V o 5 V.
Consideraciones previas:
- La resistencia pull-up de 5 kΩ es la recomendada para un cable de longitud de hasta 20 m. Si conectas un cable mayor al DHT11, la resistencia pull-up deberá ser proporcional.
- Ten en cuenta si alimentas el DHT11 con 3,5 V. En este caso, el cable de alimentación no debe ser mayor de 20 cm debido a que las caídas de tensión pueden provocar mal funcionamiento.
- Se recomienda tomar medidas cada 5 segundos. Si se utiliza un período menor puede ocasionar que los datos no sean precisos.
DHT11 sin pcb
Para conectar el circuito de una aplicación típica con un DHT11, necesitaremos tener una resistencia pull-up conectada a la salida digital. La recomendación es utilizar una resistencia de 5 kΩ. Disponemos de 4 pines:
- VCC (de 3,5V a 5V)
- la salida digital I/O
- el pin no conectado NC
- la toma de tierra GND.
El esquema eléctrico y de montaje del DHT11 sería el siguiente:
DHT11 con pcb (KY-015)
Al contrario que el otro modelo, el DHT11 integrado dentro de un PCB (Printed Circuit Board) ya viene con la resistencia pull-up integrada. Puede resultar muy útil a veces, pero si añadimos un cable de más de 20 metros, tendremos que tener en cuenta este factor.
Este modelo de DHT11 dispone de 3 pines, la toma de tierra GND, para los datos DATA y para la alimentación VCC (de 3,5V o 5V).
En la siguiente imagen puedes ver el esquema de conexión con Arduino.
Programación
Tanto el sensor DHT11 como el módulo KY-015 utilizan su propio protocolo de comunicación bidireccional mediante un único conductor, empleando señales temporizadas.
Para simplificar el proceso de lectura de datos tenemos a disposición librerías preparadas. Hay varias librerías que podemos utilizar para obtener la información de temperatura y humedad. En este caso utilizaremos la que nos proporciona Adafruit. Esta librería es muy sencilla de utilizar y funciona para ambos modelos, DHT11 con PCB y sin PCB.
Con esta librería obtendremos tres valores:
- Humedad relativa: describe la cantidad de agua que se transporta por el aire, es importante para determinar el desarrollo de las nubes y el factor precipitación.
- Temperatura ambiente: temperatura en un determinado lugar.
- Índice de calor: indica cuánto calor hace teniendo en cuenta la humedad relativa y la temperatura. Nos da una idea de la sensación de calor.
Análisis del código
Declaraciones previas
#include <DHT.h> // Incluimos la librería
#define DHTPIN 2 // Definir el pin digital donde se conecta el sensor
#define DHTTYPE DHT11 // Definir el tipo de sensor
DHT dht(DHTPIN, DHTTYPE); // Declarar el objeto DHT con el nombre dht
La primera línea incluye la librería DHT.h en nuestro programa para que podamos hacer uso de ella.
Después vienen dos definiciones de objetos, DHTPIN indica qué pin digital usamos para comunicarnos con el sensor y DHTTYPE indica el tipo de sensor.
Con estas definiciones, configuramos la instancia DHT con el nombre dht y le pasamos los valores necesarios. Podemos decir que la librería está en funcionamiento y le pediremos los datos cuando nos interese.
Función setup()
void setup()
{
Serial.begin(9600); // Inicializar comunicación serie
dht.begin(); // Inicializar el objeto DHT
}
En esta sección preparamos el puerto serie y el sensor para la comunicación.
Función loop()
void loop()
{
delay(5000); // Esperamos 5 segundos entre medidas
float h = dht.readHumidity(); // Leer la humedad relativa
float t = dht.readTemperature(); // Leer la temperatura en grados centígrados
float f = dht.readTemperature(true); // Leer la temperatura en grados Fahrenheit
...
Dentro de la función loop() que se repetirá continuamente incluimos primeramente un retardo de 5000 ms para dar tiempo al sensor a recopilar la información a transmitir.
Las siguientes órdenes tienen dos partes. La primera parte es una declaración de variable float para recopilar el dato requerido (float «nombre_variable») y la segunda parte hace uso de la orden reservada para pedir al sensor la información pertinente.
if (isnan(h) || isnan(t) || isnan(f)) // Comprobar si hay error en la lectura
{
Serial.println("Error obteniendo los datos del sensor DHT11");
return;
}
...
Comprobación de errores, la función «isnan(variable)» devuelve el valor TRUE si la variable no es un número (Is Not A Number).
float hif = dht.computeHeatIndex(f, h); // Calcular el índice de calor en Fahrenheit
float hic = dht.computeHeatIndex(t, h, false); // Calcular el índice de calor en grados centígrados
...
Otra vez declaramos variables float y pedimos al sensor que nos retorne la información «índice de calor» con la llamada reservada para el objeto dht.
Para finalizar enviamos la información capturada al monitor serie por medio de la comunicación serie.
Serial.print("Humedad: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Índice de calor: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");
}
Código completo
/******************************************
qode66 (www.qserrano.es)
ARD_10.ino
Tutorial ARduino - Lección 10: Sensor de temperatura y humedad DHT11
25.02.2021
******************************************/
#include <DHT.h> // Incluimos la librería
#define DHTPIN 2 // Definir el pin digital donde se conecta el sensor
#define DHTTYPE DHT11 // Definir el tipo de sensor
DHT dht(DHTPIN, DHTTYPE); // Inicializar el objeto DHT con el nombre dht
void setup()
{
Serial.begin(9600); // Inicializar comunicación serie
dht.begin(); // Inicializar el sensor DHT
}
void loop()
{
delay(5000); // Esperamos 5 segundos entre medidas
float h = dht.readHumidity(); // Leer la humedad relativa
float t = dht.readTemperature(); // Leer la temperatura en grados centígrados (por defecto)
float f = dht.readTemperature(true); // Leer la temperatura en grados Fahrenheit
if (isnan(h) || isnan(t) || isnan(f)) // Comprobar si hay error en la lectura
{
Serial.println("Error obteniendo los datos del sensor DHT11");
return;
}
float hif = dht.computeHeatIndex(f, h); // Calcular el índice de calor en Fahrenheit
float hic = dht.computeHeatIndex(t, h, false); // Calcular el índice de calor en grados centígrados
Serial.print("Humedad: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperatura: ");
Serial.print(t);
Serial.print(" *C ");
Serial.print(f);
Serial.print(" *F\t");
Serial.print("Índice de calor: ");
Serial.print(hic);
Serial.print(" *C ");
Serial.print(hif);
Serial.println(" *F");
}
Conceptos importantes
- Inclusión de librerías predefinidas
- Declaración de objetos
- Tratamiento de la información