Imagen | Descripción |
---|---|
![]() |
Arduino Uno o compatible con S4A y con el firmware para S4A cargado. |
![]() |
Una protoboard |
![]() |
Cables de conexión |
![]() |
Un módulo KY-015 o sensor DHT11 |
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.
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)
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:
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:
El esquema eléctrico y de montaje del DHT11 sería el siguiente:
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.
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:
#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.
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.
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");
}
Tienes el código completo aquí
#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");
}