Inicio » Sensores para Arduino » Sensor de temperatura y humedad DHT11

¿Qué es un sensor DHT11?

Un sensor DHT11 es un dispositivo utilizado para medir la temperatura y la humedad en el ambiente. Este sensor es bastante común en proyectos de electrónica y se utiliza en aplicaciones como estaciones meteorológicas caseras, sistemas de control de clima, y otros proyectos relacionados con la monitorización de condiciones ambientales.

Sensor DHT11

El DHT11 tiene dos componentes principales: un sensor de temperatura y un sensor de humedad. Está diseñado para ser fácil de usar y es compatible con microcontroladores como Arduino. El sensor proporciona datos digitales que pueden ser leídos y procesados por otros dispositivos para realizar acciones específicas en respuesta a cambios en la temperatura o la humedad.

Es importante mencionar que el DHT11 tiene ciertas limitaciones en términos de precisión y rango de medición en comparación con sensores más avanzados, como el DHT22 o el DHT21, pero sigue siendo una opción popular para proyectos sencillos y educativos debido a su facilidad de uso y bajo costo.

Especificaciones del sensor DHT11

Estructura física

Como puedes ver en la imagen tiene un cuerdo rectangular de color azul que protege los dos sensores en su interior:

Dispone de 4 pines, aunque uno de ellos (el marcado con un aspa roja) no tiene aplicación.

Veamos los pines en detalle. Para ello debes colocar el sensor en la misma posición que lo ves en la imagen, con los huecos de la carcasa apuntando hacia a ti.

De izquierda a derecha tenemos:

  • VCC: Es el pin de alimentación. El sensor soporta rangos de voltaje de entre los 3.3V y los 5V.
  • OUT: Es la señal digital. Este pin, conectado a un pin digital de Arduino, le enviará las mediciones de humedad y temperatura tomadas.
  • X: Este pin marcado en rojo no tiene aplicación.
  • GND: Es el pin que irá conectado a tierra.

Un poco más abajo veremos cómo conectar el sensor DHT11 con Arduino.

Especificaciones técnicas

Rango de mediciónTemperatura: 0ºC a 50ºC
Humedad: 20% a 90%
PrecisiónTemperatura: +- 2ºC
Humedad: +-5%
ResoluciónTemperatura: 1ºC
Humedad: 1%
Voltaje de alimentación3.3V a 5V
TermistorNTC (coeficiente de temperatura negativo)
Sensor de humedadSensor capacitivo
Dimensiones12 mm x 23.5 mm x 5.5 mm

¿Cómo funciona el sensor DHT11?

El sensor DHT11 funciona utilizando dos componentes principales para medir la temperatura y la humedad: un termistor para la temperatura y un sensor capacitivo para la humedad.

Temperatura

  • Termistor: En el interior del sensor DHT11, hay un termistor. Se trata de un dispositivo semiconductor cuya resistencia eléctrica varía de manera significativa con la temperatura.
  • Variación de resistencia: La resistencia del termistor varía de acuerdo con la temperatura del entorno. Cuando la temperatura cambia, la resistencia del termistor también cambia de manera proporcional.
  • Microcontrolador interno: El sensor DHT11 tiene un microcontrolador interno que mide la resistencia del termistor y la convierte en un valor de temperatura.

Humedad

  • Sensor capacitivo: Para medir la humedad, el DHT11 utiliza un sensor capacitivo. Este sensor mide la capacitancia del material higroscópico en el sensor, que cambia con la humedad.
  • Variación de la capacidad: La cantidad de agua en el aire afecta la capacidad del sensor capacitivo. A medida que la humedad del ambiente cambia, la capacidad del sensor capacitivo varía.
  • Microcontrolador interno: Al igual que con la temperatura, el microcontrolador interno convierte las variaciones en la capacidad del sensor capacitivo en un valor de humedad relativa.

Comunicación y Protocolo

  • El DHT11 utiliza un protocolo de comunicación de un solo cable para transmitir los datos de temperatura y humedad al microcontrolador externo (por ejemplo, Arduino).
  • Los datos se envían como pulsos digitales de duración variable. La duración de los pulsos cortos y largos representa la información codificada sobre la temperatura y la humedad.
  • El microcontrolador externo lee estos pulsos y los interpreta para obtener los valores numéricos de temperatura y humedad.
  1. Alimentación y Conexión:
    • El DHT11 generalmente opera con un voltaje de 3.3V o 5V, y se conecta a través de tres pines: VCC (alimentación), DATA (salida de datos) y GND (tierra).
    • La conexión es simple, y la mayoría de los microcontroladores, como Arduino, pueden leer los datos del sensor con facilidad.

¿Cómo conectar un sensor DHT11 con Arduino?

Materiales

Antes de nada, vamos a ver qué materiales necesitamos para conectar un sensor DHT11 con Arduino:

Una placa Arduino (Yo usaré Arduino UNO)
Un sensor DHT11
Una resistencia de 10KΩ
Cables
Una protoboard
Un ordenador con el IDE de Arduino instalado

Conexiones

Es necesaria una resistencia pull-up conectada a la salida digital del sensor. Un extremo de la resistencia de 10KOhm irá conectado al pin OUT del sensor y el otro extremo a 5V. El pin OUT a su vez va conectado al pin 5 digital del Arduino (o a cualquier otro pin digital que prefieras.

En cuando a los otros dos pines del sensor, el pin VCC (pin de la izquirda) va conectado a los 5V del Arduino. Y el pin GND (pin de la derecha) va conectado a tierra.

Las conexiones no tienen mucho más misterio.

¿Cómo programar un sensor DHT11 con Arduino?

Para programar este sensor con Arduino nos ayudaremos de la librería DHT11 de Dhruba Saha.

Debes instalarla desde el Library Manager de tu IDE de Arduino. Busca dht11 y de entre todos los resultados instala DHT11 by Dhruba Saha:

Una vez instalada ya la puedes utilizar en tu sketch incluyendola al inicio del código (#include <DHT11.h>):


#include <DHT11.h>

//DECLARACIONES
DHT11 dht11(5);

//CONFIGURACIÓN
void setup()
{
    Serial.begin(9600);
}

//FUNCION LOOP
void loop()
{
    int temp = dht11.readTemperature();

    int hum = dht11.readHumidity();

    if (temp != DHT11::ERROR_CHECKSUM && temp != DHT11::ERROR_TIMEOUT &&
        hum != DHT11::ERROR_CHECKSUM && hum != DHT11::ERROR_TIMEOUT)
    {
        Serial.print("Remperatura: ");
        Serial.print(temp);
        Serial.println(" °C");

        Serial.print("Humidity: ");
        Serial.print(hum);
        Serial.println(" %");
    }
    else
    {
        if (temp == DHT11::ERROR_TIMEOUT || hum == DHT11::ERROR_CHECKSUM)
        {
            Serial.print("Temperature Reading Error: ");
            Serial.println(DHT11::getErrorString(temperature));
        }
        if (hum == DHT11::ERROR_TIMEOUT || hum == DHT11::ERROR_CHECKSUM)
        {
            Serial.print("Humidity Reading Error: ");
            Serial.println(DHT11::getErrorString(humidity));
        }
    }

    delay(5000);
}

Vamos a analizar el resto del sketch.

Declaraciones

Debemos declarar el objeto de tipo DHT11 indicando el pin digital del Arduino al que hemos conectado el pin OUT del sensor. En mi caso el pin 5, si usaste otro cámbialo por el valor correcto:

DHT11 dht11(5);

Posteriormente, en la función loop, usaremos el objeto dht11 para realizar las lecturas de temperatura y humedad.

Configuración

En la configuración (función setup) solo tenemos que inicializar el puerto serie utilizando la instrucción Serial.begin(9600):

void setup()
{
    Serial.begin(9600);
}

Así posteriormente podremos enviar al monitor serie los datos que obtengamos del sensor y comprobar los resultados.

Función loop

En la función principal es donde realizamos las lecturas. Recuerda que habíamos declarado anteriormente un objeto al que llamamos dhtt que escuchaba el pin digital en el que estaba el sensor conectado.

Para leer la temperatura basta con utilizar la función readTemperature de la librería DHT11:

int temp = dht11.readTemperature();

El resultado queda almacenado en la variable entera temp en grados celsius.

Para leer la humedad es muy similar. Utilizamos la función readHumidity de la librería:

int hum = dht11.readHumidity();

El resultado queda almacenado en la variable entera hum. La humedad se mide en tanto por ciento.

El resto del código simplemente muestra los resultados en el monitor serie. Se que puede parecer un código complejo, pero es más fácil de lo que parece. Vamos a revisarlo:

La primera instrucción if que nos encontramos tiene esta pinta:

if (temp != DHT11::ERROR_CHECKSUM && temp != DHT11::ERROR_TIMEOUT &&
        hum != DHT11::ERROR_CHECKSUM && hum != DHT11::ERROR_TIMEOUT)

Ni te preocupes, asusta más de lo que es. Simplemente comprueba que ni la variable temp ni la variable hum hayan almacenado un error tras la lectura. Si todas esas comprobaciones son ciertas significa que ambas lecturas son correctas y tienen almacenadas la temperatura y la humedad.

Por tanto, las siguientes instrucciones mostrarán los datos en el monitor seria:

Serial.print("Temperatura: ");
Serial.print(temp);
Serial.println(" °C");

Serial.print("HUmedad: ");
Serial.print(hum);
Serial.println(" %");

Si se ha detectado algún error en las comprobaciones realizadas en la instrucción if, la ejecución saltaría automáticamente a la instrucción else y se ejecutaría este bloque de código:

else
    {
        if (temp == DHT11::ERROR_TIMEOUT || hum == DHT11::ERROR_CHECKSUM)
        {
            Serial.print("Temperature Reading Error: ");
            Serial.println(DHT11::getErrorString(temperature));
        }
        if (hum == DHT11::ERROR_TIMEOUT || hum == DHT11::ERROR_CHECKSUM)
        {
            Serial.print("Humidity Reading Error: ");
            Serial.println(DHT11::getErrorString(humidity));
        }
    }

Las instrucciones if aquí analizan cuál fue exactamente el error que se produjo y de esa forma poder mostrar un mensaje más concreto en el monitor serie.

Como puedes ver hay un if para la temperatura con sus correspondientes mensajes:

if (temp == DHT11::ERROR_TIMEOUT || hum == DHT11::ERROR_CHECKSUM)
{
    Serial.print("Temperature Reading Error: ");
    Serial.println(DHT11::getErrorString(temperature));
}

Y otro if similar para la humedad también con sus errores:

if (hum == DHT11::ERROR_TIMEOUT || hum == DHT11::ERROR_CHECKSUM)
{
    Serial.print("Humidity Reading Error: ");
    Serial.println(DHT11::getErrorString(humidity));
}

Justo al final de la función loop hay un delay de 5 segundos:

delay(5000);

De esta forma el bucle loop hará una nueva lectura tras 5 segundos.

Prepara tu circuito y ejecuta el sketch. Si todo ha ido bien verás una salida como esta:

Prueba a cubrir el sensor con tu mano y verás que aumentan, tanto la humedad como la temperatura.


Te avisaré cuando publique nuevo contenido en paraarduino.com y en mi canal de YouTube (@ParaArduino).

No hemos podido validar tu suscripción.
¡Se ha realizado tu suscripción!

Newsletter

Suscríbete para que te avise cuando publique nuevo contenido.

Usamos Brevo como plataforma de marketing. Al hacer clic a continuación para enviar este formulario, consiente que la información proporcionada sea transferida a Brevo para su procesamiento de acuerdo con sus términos de uso