Programar fácil con Arduino

Programar fácil con Arduino, entiende cómo funciona el mundo.

  • Inicio
  • Blog
  • Podcast
  • ¿Quién soy?
  • Contactar
  • Acceder
Usted está aquí: Inicio / Blog / Arduino / Cómo utilizar el sensor DHT11 para medir la temperatura y humedad con Arduino

Cómo utilizar el sensor DHT11 para medir la temperatura y humedad con Arduino

Comentarios(17)
Luis del Valle Hernández

Ya has pasado por la fase previa de aprendizaje con Arduino y ahora quieres construir algo chulo, algo que te de información del mundo real. Una estación meteorológica puede ser un buen proyecto. En este artículo te voy a explicar el sensor DHT11 que nos permite medir la temperatura y humedad con Arduino.

Una de las ventajas que nos ofrece el DHT11, además de medir la temperatura y la humedad, es que es digital. A diferencia de sensores como el LM35, este sensor utiliza un pin digital para enviarnos la información y por lo tanto, estaremos más protegidos frente al ruido.

Si el ejemplo más común es la estación meteorológica, también puede ser útil en proyectos donde otros sensores y componentes dependan de la temperatura o la humedad para tomar las medidas.

Este tutorial paso a paso te va a enseñar cómo utilizar el sensor de temperatura y humedad DHT11 con Arduino.

Mini-curso de Arduino para principiantes
Por si quieres aprender (gratis) de qué va esto de Arduino
7 vídeos + 1 caso práctico de programación


Explicado para que lo entienda hasta tu abuela

Indice de contenidos

  • 1 DHT11 un único sensor para la temperatura y humedad
  • 2 Características técnicas del DHT11
  • 3 ¿Cómo transmite los datos el DHT11?
  • 4 Conectando el DHT11 a Arduino
  • 5 Programando el DHT11 desde el IDE de Arduino
  • 6 Código nativo de Arduino para el DHT11
  • 7 Conclusiones sobre el sensor DHT11

DHT11 un único sensor para la temperatura y humedad

El DHT11 presume de ser un sensor con una alta fiabilidad y estabilidad debido a su señal digital calibrada. Lo podemos comprar de dos maneras, de forma individual donde solo tenemos el sensor DHT11, o insertado en una PCB.

La diferencia en precio no es excesiva y la versión con PCB aporta una resistencia pull-up de 5 kΩ y un LED que nos avisa de su funcionamiento. Otra diferencia entre estas dos versiones del DHT11 son los pines.

En la versión  sin PCB tenemos 4 pines y en la versión con PCB tenemos 3 pines.

dht11 sin pcb

Los pines de la versión sin PCB del DHT11 son:

  • VCC: alimentación
  • I/O: transmisión de datos
  • NC: no conecta, pin al aire
  • GND: conexión a tierra
dht11 con pcb

Los pines de la versión con PCB del DHT11 son:

  • GND: conexión con tierra
  • DATA: transmisión de datos
  • VCC: alimentación

Mucho ojo. El orden de los pines depende del fabricante y se han dado casos en los que GND y VCC están intercambiados. Se muy precavido con esto y consulta la documentación del fabricante. También fíjate en la serigrafía de tu sensor.

Características técnicas del DHT11

Como siempre recomiendo, es aconsejable dirigirse a la hoja de características técnicas para ver cómo funciona el sensor DHT11. Puedes ver toda la información en esta hoja, o en esta otra hoja de características técncias.

En las dos encontrarás prácticamente la misma información. A continuación te hago un resumen de lo más importante.

ModeloDHT11
Alimentaciónde 3,5 V a 5 V
Consumo2,5 mA
Señal de salidaDigital
Temperatura 
Rangode 0ºC a 50ºC
Precisióna 25ºC ± 2ºC
Resolución1ºC (8-bit)
Humedad 
Rangode 20% RH a 90% RH
Precisiónentre 0ºC y 50ºC ± 5% RH
Resolución1% RH

¿Cómo transmite los datos el DHT11?

No tenemos que confundirnos entre analógico y digital. Aunque lo conectemos a un pin digital, se trata de un dispositivo analógico. Dentro del propio dispositivo se hace la conversión entre analógico y digital.

Por lo tanto, partimos de una señal analógica que luego es convertida en formato digital y se enviará al microcontrolador. La trama de datos es de 40 bits correspondiente a la información de humedad y temperatura del DHT11.

trama datos dht11

El primer grupo de 8-bit es la parte entera de la humedad y el segundo grupo la parte decimal. Lo mismo ocurre con el tercer y cuarto grupo, la parte entera de la temperatura y la parte decimal. Por último los bits de paridad para confirmar que no hay datos corruptos.

Estos bits de paridad lo único que hacen es asegurarnos de que la información es correcta, sumando los 4 primero grupos de 8-bit. Esta suma debe ser igual a los bit de paridad. Si nos centramos en la imagen anterior y sumamos los bits, comprobamos que todo está correcto.

0011 0101 + 0000 0000 + 0001 1000 + 0000 0000 = 0100 1101

Conectando el DHT11 a Arduino

Como tenemos dos versiones del sensor de temperatura y humedad DHT11, vamos a ver cómo tendríamos que conectarlo a Arduino en los dos casos. Te recuerdo que vamos a trabajar con un pin digital.

En los dos casos , la alimentación puede ser de 3,5 V a 5 V. Si vas a utilizar un Arduino MKR1000 o un ESP8266, tendrás que tenerlo en cuenta ya que estos dos dispositivos pueden dar problemas si se alimentan con una batería o con una pila ya que no suministran más de 3,3 V.

Antes de conectar el sensor es conveniente ver estas consideraciones:

  • La resistencia pull-up de 5 kΩ es la recomendada para un cable de longitud de hasta 20 metros. Si conectas un cable mayor al DHT11, la resistencia pull-up deberá ser proporcional.
  • Ojo 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 periodo menor puede ocasionar que los datos no sean precisos.

Una vez hayas leído y entendido las consideraciones, vamos a ver los circuitos eléctricos para los dos modelos.

Conexionado 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 el VCC (de 3,5V a 5V), la salida digital I/O, el pin no conectado NC y la toma de tierra GND.

El esquema eléctrico del DHT11 sería el siguiente:

DHT11 SIN PCB

Conexionado DHT11 con PCB

Al contrario que el otro modelo, el DHT11 integrado dentro de un PCB ya viene con la resistencia pull-up integrada. Puede resultar muy útil en ocasiones, pero si añadimos un cable de más de 20 metros, deberemos 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 a 5V). En la siguiente imagen puedes ver el esquema de conexión con Arduino.

DHT11 CON PCB

Programando el DHT11 desde el IDE de Arduino

Si tuvieras que programar desde cero el sensor de temperatura y humedad DHT11, sería francamente complicado. Sin embargo, las librerías que hay entorno a Arduino nos facilitan mucho la vida. Este es un claro ejemplo.

Hay varias librerías que podemos utilizar para obtener la información de temperatura y humedad. En este caso vamos a utilizar la que nos proporciona Adafruit. Esta librería es muy sencilla de utilizar y funciona para los dos modelos, DHT11 con PCB y sin PCB.

Recuerda, si no sabes instalar una librería te recomiendo que leas este tutorial donde te explico cómo instalar una librería de Arduino.

En el siguiente vídeo puedes ver el proceso.

Si cuando has instalado la librería DHT en tu IDE sale el siguiente error:

1
fatal error: Adafruit_Sensor.h: No such file or directory

Debes añadir la librería Adafruit_Sensor.h. Sólo tienes que abrir el gestor de librerías y buscar adafruit unified sensor.

Instala la librería que pone Adafruit Unified Sensor.

Código nativo de Arduino para el DHT11

Ahora ya si que tenemos todo preparado para obtener la temperatura y la humedad. Hemos montado el circuito (con el módulo con PCB o sin PCB) e instalado la librería de Adafruit. Solo nos falta crear un nuevo programa o sketch y a programar.

En este ejemplo, vamos a obtener 3 valores del DHT11:

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

Ya verás como es muy sencillo, vamos a ver el código que nos hará falta.

Librería DHT11 y variables

1
2
3
4
5
6
7
8
9
10
// Incluimos librería
#include <DHT.h>
// Definimos el pin digital donde se conecta el sensor
#define DHTPIN 2
// Dependiendo del tipo de sensor
#define DHTTYPE DHT11
// Inicializamos el sensor DHT11
DHT dht(DHTPIN, DHTTYPE);

Lo primero es importar la librería DHT.h. Luego definimos dos constantes una para indicar el pin donde hemos conectado el DHT11 (pin digital) y otra para indicar el tipo de sensor, DHT11. Esta librería también se utiliza para controlar el DHT22, el hermano mayor del DHT11.

Por último declaramos el objeto DHT con los parámetros pin y tipo de DHT.

Función setup

1
2
3
4
5
6
7
void setup() {
  // Inicializamos comunicación serie
  Serial.begin(9600);
  // Comenzamos el sensor DHT
  dht.begin();
}

En la función setup() vamos iniciar el monitor serie y el objeto dht con la sentencia begin().

Función loop

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
void loop() {
    // Esperamos 5 segundos entre medidas
  delay(5000);
  // Leemos la humedad relativa
  float h = dht.readHumidity();
  // Leemos la temperatura en grados centígrados (por defecto)
  float t = dht.readTemperature();
  // Leemos la temperatura en grados Fahrenheit
  float f = dht.readTemperature(true);
  // Comprobamos si ha habido algún error en la lectura
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Error obteniendo los datos del sensor DHT11");
    return;
  }
  // Calcular el índice de calor en Fahrenheit
  float hif = dht.computeHeatIndex(f, h);
  // Calcular el índice de calor en grados centígrados
  float hic = dht.computeHeatIndex(t, h, false);
  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");
}

Lo primero que hacemos es utilizar un delay para esperar los 5 segundos recomendados. La librería de Adafruit para el DHT11 nos proporciona datos en grados centígrados y grados Fahrenheit. Para obtener los dos datos utilizamos la misma función, readTemperature().

Si no pasamos ningún parámetro nos devuelve la temperatura en grados centígrados. Si pasamos el valor true nos devuelve la temperatura en grados Fahrenheit. La humedad se obtiene llamando a la función readHumidity().

Es conveniente comprobar que la información no está corrupta y que realmente nos está devolviendo un número. Eso lo hacemos con la sentencia isnan(…). Esto nos dará verdadero si no es un número (isnan, Is Not a Number) y falso en caso contrario.

Por último obtenemos el índice de calor con la función computeHeatIndex. Nos puede devolver grados centígrados o grados Fahrenheit. Al final del todo mostramos la información en el monitor serie.

Código completo del sensor de temperatura y humedad DHT11

Este sería el código completo que tienes que utilizar para medir la temperatura y la humedad con el sensor DHT11.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
// Incluimos librería
#include <DHT.h>
// Definimos el pin digital donde se conecta el sensor
#define DHTPIN 2
// Dependiendo del tipo de sensor
#define DHTTYPE DHT11
// Inicializamos el sensor DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  // Inicializamos comunicación serie
  Serial.begin(9600);
  // Comenzamos el sensor DHT
  dht.begin();
}
void loop() {
    // Esperamos 5 segundos entre medidas
  delay(5000);
  // Leemos la humedad relativa
  float h = dht.readHumidity();
  // Leemos la temperatura en grados centígrados (por defecto)
  float t = dht.readTemperature();
  // Leemos la temperatura en grados Fahreheit
  float f = dht.readTemperature(true);
  // Comprobamos si ha habido algún error en la lectura
  if (isnan(h) || isnan(t) || isnan(f)) {
    Serial.println("Error obteniendo los datos del sensor DHT11");
    return;
  }
  // Calcular el índice de calor en Fahreheit
  float hif = dht.computeHeatIndex(f, h);
  // Calcular el índice de calor en grados centígrados
  float hic = dht.computeHeatIndex(t, h, false);
  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");
}

Conclusiones sobre el sensor DHT11

Una de las partes más importantes a la hora de hacer nuestros proyectos Maker es la investigación. Cuando queremos hacer una estación de temperatura, por ejemplo, debemos conocer los diferentes sensores que tenemos a nuestra disposición.

Uno de ellos es el sensor DHT11 que, además de medir la temperatura, nos proporciona la humedad y el índice de calor. Es un sensor muy utilizado cuyas dos características más importantes son la fiabilidad y estabilidad.

¿Has utilizado el sensor de temperatura y humedad en algún proyecto?

Comporte con todos nosotros tus experiencias con el sensor DHT11 en los comentarios de este artículo.

TinyGS estaciones terrestres de código abierto

Bienvenidos a un capitulo nuevo de «La tecnología para todos«. Hoy vienen al podcast Oscar, German y José Manuel, para contar sobre Tiny GS la red … [+ info...]

raspberry pi vs intel nuc

Raspberry Pi vs Intel NUC

Bienvenidos a «La tecnología para todos«. En este capitulo de la sexta temporada junto a German y José Manuel, se plantea una incógnita: ¿Qué … [+ info...]

ESP-32

ESP32 Wifi y Bluetooth en un solo chip

ESP32 es una familia de microcontroladores de la empresa Espressif Systems. Su analogía más clara es la de un ESP8266 con esteroides, que incluye … [+ info...]

Copyright © 2021 · Programar Fácil · Aviso legal

Utilizamos cookies propios y de terceros para mejorar nuestros servicios y experiencia de usuario. Si continua navegando, consideramos que acepta su uso.Aceptar Política de privacidad y cookies
Política de cookies

Privacy Overview

This website uses cookies to improve your experience while you navigate through the website. Out of these, the cookies that are categorized as necessary are stored on your browser as they are essential for the working of basic functionalities of the website. We also use third-party cookies that help us analyze and understand how you use this website. These cookies will be stored in your browser only with your consent. You also have the option to opt-out of these cookies. But opting out of some of these cookies may affect your browsing experience.
Necessary
Siempre activado

Necessary cookies are absolutely essential for the website to function properly. This category only includes cookies that ensures basic functionalities and security features of the website. These cookies do not store any personal information.

Non-necessary

Any cookies that may not be particularly necessary for the website to function and is used specifically to collect user personal data via analytics, ads, other embedded contents are termed as non-necessary cookies. It is mandatory to procure user consent prior to running these cookies on your website.

GUARDAR Y ACEPTAR