bclose

Sensores de temperatura DHT11

Sensor de temperatura y humedad

Objetivos

 

 
    • Presentar los sensores DHT11.
    • Mostrar como leerlos utilizando la librería de control.
    • Escribir un programa básico de uso.
 

Material requerido.

Imagen de Arduino UNO  Arduino UNO o equivalente.
ProtoboardconexionesUna Protoboard más cables.
componente Una resistencia de 330Ω.
Sensor temperatura y humedad Un sensor de temperatura DHT11.
tienda online prometec

Sensores de temperatura y humedad

 

En la sesion Sensor de temperatura TMP36, vimos cómo medir la temperatura con un sensor TMP36. Es bastante sencillo y no presenta especiales problemas, mas allá de tener cuidado con las operación con números float.

Pero en muchas ocasiones, y especialmente en la industria alimentaria, no basta con medir la temperatura, sino que la humedad relativa es también un factor importante a tener en cuenta.

Por eso se desarrollaron los sensores de la familia DHT. Nos proporcionan de forma digital la temperatura y la humedad, con diferente precisión según el modelo.

Básicamente hay dos variantes DHT11 y DHT22

Las características del DHT11 son:

 
  • Muy barato, sobre 2€
  • Funciona con 3,3 y 5V de alimentación
  • Rango de temperatura: de 0º a 50º con 5% de precisión (pero solo mide por grados, no fracciones)
  • Rango de humedad: de 20% al 80% con 5% de precisión
  • 1 Muestra por segundo (No es el más rápido del oeste)
  • Bajo consumo
  • Devuelva la medida en ºC
 

En cuanto al DHT22:

 
  • Barato, entre 4 y 5 €
  • Funciona con 3,3 y %V de alimentación
  • Rango de temperatura: de -40º a 125º ±0.5°C
  • Rango de humedad: de 0% al 100% con 5% de precisión.
  • Lee 2 veces por segundo.
  • Bajo consumo.
  • Devuelva la medida en ºC
 

En cuanto a la forma de conectarlos y programarlos es la misma para ambos modelos y veremos que hay desarrolladas librerías para Arduino que soportan los dos de una forma sencilla.

Destacar que el chip incorpora electrónica para hacer internamente la conversión de temperatura y humedad y nos da un valor de medida de forma digital, es decir, que no necesitamos un pin analógico como en el caso del TMP36, sino que lo leeremos con un pin digital.

 

Diagramas del circuito

 

La conexión es trivial, pero cabe destacar que se vende en dos encapsulados, uno de tres pines que son GND, Data y Vcc, y otro 4 pines y uno de ellos, sencillamente sobra y no se conecta. Normalmente viene rotulado en el sensor el nombre de cada pin, y si no ya sabeis, a buscar el manual en Google

Version 4 pines

Version 3 pines
Vamos con el esquema por cortesía de Fritzing:

Esquema electrico

 

Y aquí tenemos el esquema de protoboard.

Protoboard

El Programa de lectura del DHT11

 

En primer lugar, tenemos que descargar una librería para manejarlos cómodamente, DX11.zip e importarla. Aquí teneís la librería  DHT11.zip

Hacemos el importar la librería DHT11 que nos pondrá:

#include <DHT11.h>

Y definimos una instancia del sensor donde declaramos el pin al que esta conectado.

int pin=2;
DHT11 dht11(pin);

Leerlo ahora es muy sencillo:

int error ;
float temp, humi;
error  =  dht11.read(humi, temp)

Basta con hacer dht11.read pasandole las variables donde queremos el resultado, y comprobamos que no haya errors (Siempre es buena idea comprobar que no hay error cuando hacemos una llamda). El programa completo seria más o menos algo así: Prog_24_1

#include <DHT11.h>

int pin=2;
DHT11 dht11(pin);

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

void loop()
   {
       int err;
       float temp, hum;
       if((err = dht11.read(hum, temp)) == 0)    // Si devuelve 0 es que ha leido bien
          {
             Serial.print("Temperatura: ");
             Serial.print(temp);
             Serial.print(" Humedad: ");
             Serial.print(hum);
             Serial.println();
          }
       else
          {
             Serial.println();
             Serial.print("Error Num :");
             Serial.print(err);
             Serial.println();
          }
       delay(1000);            //Recordad que solo lee una vez por segundo
   }

El resultado se envía a la consola y aquí podéis ver una muestra.

Medidas de consola

Para hacer variar os valores, de humedad y temperatura y comprobar que todo funciona correctamente, podeis, sencillamente, enviar vuestro aliento al sensor, y salvo que estéis en el trópico haréis subir tanto la temperatura como la humedad relativa.

Como vereris, son de lo mas sencillos de utilizar y un componente habitual de vuestro arsenal de sensores

 

 

Resumen de la sesión

 

 
  • Hemos visto los sensores DHT11, y montado un circuito de prueba con el
  • Los DHT22, usan el mismo circuito y pines, pero su resolución y velocidad es bastante mejor, aunque para muchas aplicaciones el DHT11 es mas que suficiente.
 

 

 

 

 

(146) Comments

    • Neil Litman Yalle Paucar

    Buenas me interesa el dht 22 estoy buscndo alternativas a los sensores que yo uso en la empresa donde trabajo

    Hber si pueden contactarme para ver este tema con un proveedor

  • buenas noches, he bajado el programa y cada vez que intento verificarlo me da el siguiente error que no consigo resolver, soy muy novato,
    if((err = dht11.read(hum, temp)) == 0), error”dht11″ was not declared in this scope

    • Hola Oli, ¿has instalado la librería?

    • Andres Mera

    Hola, me gustaría saber el área maxima que es capaz de abarcar el sensor. Para saber si con un solo sensor en una habitación está bien o sería necesario poner más sensores alrededor de esta para obtener una mejor medición.
    Saludos
    Gracias

    • Hola Andrés, eb principio este sendor mide en el punto en el que está colocado. Si el lugar en el que quieres realizar las mediciones varía mucho en temperatura y humedad de un punto a otro deberías poner varios. Un saludo.

    • César Torres

    Excelente, estoy adentrandome al mundo de la electrónica digital para análisis de agua y medio ambiente y éste proyecto funcionó muy bien, sólo tuve problema con el diagrama que el mio igualmente es de 3 pines, había intercambiado el voltaje por la entrada de dato, pero ya lo arreglé, muchas gracias por la información!

    • Gracias César por compartir la solución, seguro que hay gente con ese mismo problema. Un saludo.

  • Hola, me encanta su página

    Tengo una pregunta, estoy realizando un proyecto con la librería firmata. Sin embargo, mi dificultad radica en que no se cómo adquirir la señal de dicho sensor utilizando esta librería ya que estoy programando en python. Amablemente les pido el favor si alguien me puede colaborar, saludos desde Colombia.

  • Hola, en primer lugar, muchas gracias por vuestros tutoriales. Estos reyes me han (he 😉 echado el kit de iniciación y estoy a tope con muchas ideas que quiero hacer con Arduino. Sobre este tutorial tengo una pregunta, ¿porqué hay que poner una resistencia en una posición tan rara? Es decir, para un led lo entendía, se pone despues del led, en la parte de tierra. Pero en esta, la resistencia está después de haber leido el dato en el arduino y unido a 5v… Gracias!

    • Hola Diego, es una resistencia pull up como la que usamos en los pulsadores, ya que el dht11 funciona mediante interrupciones en el pin 2.

    • Migue

    Hola, uso el DHT22, es otra libreria? el programa es igual que con el DHT11

    Me da “Error Num 4”

    Gracias 🙂

    • Hola Miguel, debería ser la misma librería, sólo que tienes que indicarle en el programa que usas el 22. De todas formas si puedes mándame el error entero a ver, o prueba a actualizar la librería por si acaso.

        • Migue

        Como le indico que uso el 22??
        Lo unico que se del error es lo que sale por el serie “Error Num 4”
        siento la escasa información.

        Gracias

        • Hola Miguel, tienes que cambiar aquí me parece

          int pin=2;
          DHT11 dht22(pin,DHT22);

          • Avatar for Prueba TPV TPV
            • Migue

            Con este codigo me da el error anexo:

            #include

            int pin=2;
            DHT11 dht22 (pin,DHT22);

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

            void loop()
            {
            int err;
            float temp, hum;
            if((err = dht11.read(hum, temp)) == 0) // Si devuelve 0 es que ha leido bien
            {
            Serial.print(“Temperatura: “);
            Serial.print(temp);
            Serial.print(” Humedad: “);
            Serial.print(hum);
            Serial.println();
            }
            else
            {
            Serial.println();
            Serial.print(“Error Num :”);
            Serial.print(err);
            Serial.println();
            }
            delay(1000); //Recordad que solo lee una vez por segundo
            }

            El error es:
            sketch_feb07a.ino:4:18: error: ‘DHT22’ was not declared in this scope
            sketch_feb07a.ino: In function ‘void loop()’:
            sketch_feb07a.ino:15:18: error: ‘dht11’ was not declared in this scope

          • Avatar for Prueba TPV TPV

            Prueba con DHT22 dht22(pin);

          • Avatar for Prueba TPV TPV
            • Migue

            Muchas gracias por contestar.
            No hay manera ni con “DHT22 dht22(pin);” ni con ” DHT11 dht22(pin,DHT22);”

          • Avatar for Prueba TPV TPV

            Prueba a ver con esta librería, en los ejemplos se explica bien cómo funciona. Un saludo.

          • Avatar for Prueba TPV TPV
            • Migue

            Perdona…
            me siento un poco torpe.

            Cual librería? no veo el link 🙁
            Con esa librería y el código del ejemplo?
            Gracias

          • Avatar for Prueba TPV TPV

            Perdona que no debí copiar el enlace https://github.com/adafruit/DHT-sensor-library

    • Eduardo

    Hola Iván. Me respondiste el otro día a una pregunta que te hice con que quitara el código del loop y lo pusiera en el setup para que solo apareciera una vez. No me ha funcionado, y creo que no me entendiste. Me refería a que sólo salga una vez la palabra temperatura e igual la humedad, pero que se siga actualizando cada segundo.

    Muchas gracias!

    • Hola Eduardo, perdona que no te había entendido. Si quieres que sólo salga una vez esas dos palabras, ponlas sólo en el setup, y en el loop muestra directamente el valor de la temperatura y la humedad.

    • Melissa

    Hola, funciona para la comunicación RS485 junto con la raspberry?

    • Hola Melissa , no estoy seguro de cual es tu pregunta

  • holaaaaa. ¿alguien sabe como usar los valores del dht11? quiero climatizzar una habitacion y no se como decirle que encienda el calefactor cuando haya 18º y pare con 22º.

  • Hola tengo un problema, el monitor serie no me muestra ninguna lectura, sera que he conectado mal el sensor? (es un dht11 de 3 pines) lo conecte tal cual el plano protoboard…

    • Ya lo he solucionado. El sensor que tengo tiene los pines al revez, el izquierdo es el de data y no el del medio.
      Esta de mas decir que excelente trabajo el de ustedes.

    • Eduardo

    Hola,

    Me gustaría que apareciese la temperatura y la humedad solo una vez y no se fuera “acumulando” en el monitor serie. ¿Se podría hacer de alguna forma? Y para que sirve el serialprintln del final??

    Gracias!

    • Hola Eduardo, bastaría con que quites lo del loop y lo metas en el setup. Los Serial.println(); son para dejar líneas libres entre cada lectura y poder leerlas mejor. Un saludo.

  • hola, sabes cuando subo el programa en la consola me manda error num 4 cada segundo

    • Hola Daniel, probablemente esté el sensor mal conectado. Repasa bien el circuito a ver. Un saludo.

  • El Sketch usa 4714 bytes (14%) del espacio de almacenamiento de programa. El máximo es 32256 bytes.
    Las variables Globales usan 240 bytes (11%) de la memoria dinámica, dejando 1808 bytes para las variables locales. El máximo es 2048 bytes.

    Hola al compilar me marca esto, ayuda!

    • Hola Janet, eso simplemente te informa de la cantidad de memoria que usa Arduino para guardar tu programa.

  • Hola mira me salta un error en la parte de DHT11 dht11(pin); porfavor me puedes ayudar?

    • Hola Josue, ¿qué error te parece? ¿Has instalado la librería?

  • Hi, in my monitor serie, nothing appears, does somebody knows why…

    • Hi Moisés, is your monitor serie at 9600 baudios?

  • Hola, tengo un problema. Cuando voy a compilar si el programa se puede cargar correctamente no me deja y me dice que la libreria no es compatible con arduino uno. Que tendria que hacer?

    • Hola Debora, yo en estos casos lo que hago es actualizar el IDE y bajarme la última versión de la librería. Borras la antigua y cargas la nueva.

        • Alex

        A mí me pasa lo mismo: al terminar de verificar me sale error de que no soporta el Arduino Uno, y le cambio a otros Arduinos en el gestor de tarjetas a varios modelos pero siempre sale con que no es compatible con, hasta ahora, las 10 tarjetas diferentes que le selecciono. La versión de IDE es reciente: 1.8.5

        • Hola Alex, lo he probado en un UNO y a mí no me aparece ningún error. Prueba a borrar la librería dht que tengas y a descargar la versión más reciente que encuentres y nos cuentas. Un saludo.

    • Leandro

    Hola! Antes que nada muchísimas gracias por los instructivos!!
    Estoy iniciándome y la impaciencia me mata y quería saber como hacer como hacer para que los datos que me da este ejemplo me los muestre en un display LCD. Que instructivo tendría que leer??
    Nuevemtente gracias por todo el trabajo hecho!!

  • Buenas tardes:
    En el monitor serial solo aparece Temperatura:0 Humedad: 0. Probé con otro sensor y me da lo mismo.

    • Hola Cristina, normalmente se debe a un error en el montaje. Tus DHT11 son de 4 o 3 pines? Un saludo.

  • hola. tengo un problema, yo monte tal cual se muestra pero solo me da una lectura y tengo que cerra y volver a abrir el puerto serie para que se se refresque los datos. ayuda por favor

    • Hola Walter, fíjate que no engas puesto algún delay o un bucle infinito o algo por el estilo. Si has copiado y pegado el código, prueba mejor a descargarlo, para evitar errores. Un saludo.

Give a Reply

WordPress Anti-Spam by WP-SpamShield