Haga clic para más productos.
No se encontraron productos.

Tutorial sensor de temperatura y humedad DHT11 y DHT22

293119

Los sensores DHT11 y DHT22 son sensores digitales de Temperatura y Humedad, fáciles de implementar con cualquier microcontrolador. Utiliza un sensor capacitivo de humedad y un termistor para medir el aire circundante y solo un pin para la lectura de los datos. Tal vez la desventaja de estos es la velocidad de las lecturas y  el tiempo que hay que esperar para tomar nuevas lecturas (nueva lectura después de 2 segundos), pero esto no es tan importante puesto que la Temperatura y Humedad son variables que no cambian muy rápido en el tiempo.

Sensor DHT11

Este sensor trabaja con un rango de medición de temperatura de 0 a 50 °C con precisión de ±2.0 °C y un rango de humedad de 20% a 90% RH con precisión de 4% RH. Los ciclos de lectura debe ser como mínimo 1 o 2 segundos.

Sensor de temperatura y humedad DHT11

Sensor DHT22

El rango de  medición de temperatura es de  -40°C a 80 °C con precisión de ±0.5 °C y rango de humedad de 0 a 100% RH con precisión de 2% RH, el tiempo entre lecturas debe ser de 2 segundos.

 Sensor de Temperatura y Humedad DHT22

Como se observa la diferencia entre estos sensores es solo el rango y precisión, otra diferencia es que el DHT11 puede soprtar ciclos mas rapidos de lectura.

 

Conexiones entre Arduino y el sensor DHT11 o DHT22

La conexión es igual para ambos sensores:

Conexion Arduino y DHT11

Arduino y DHT22

La resisitencia Pull-Up puede ser una valor entre 4.7K y 10K.

Si se desea trabajar con lógica de 3.3v solo hay que cambiar la alimentación a dicho voltaje al igual que la resistencia pull-up debe ir a 3.3V, en nuestro caso vamos a trabajar con el pin digital 2, pero pueden usar otro pin si lo desean.

Librería DHT para Arduino

Usaremos la librería de adafruit, la cual lo pueden descargar desde el siguiente link:

https://github.com/adafruit/DHT-sensor-library

Con esta librería podemos realizar fácilmente la lectura de ambos sensores y no preocuparnos por el protocolo de comunicación entre Arduino y los sensores.

Después de descargar e importar la librería podemos empezar a programar nuestro sketch

1. Lectura de humedad y temperatura con Arduino:

Realizar la lectura del sensor es simple, el siguiente ejemplo muestra como leer la humedad, temperatura en Celsius y en Fahrenheit:

#include "DHT.h"

#define DHTPIN 2     // Pin donde está conectado el sensor

//#define DHTTYPE DHT11   // Descomentar si se usa el DHT 11
#define DHTTYPE DHT22   // Sensor DHT22

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println("Iniciando...");
  dht.begin();
}
void loop() {
  delay(2000);
  float h = dht.readHumidity(); //Leemos la Humedad
  float t = dht.readTemperature(); //Leemos la temperatura en grados Celsius
  float f = dht.readTemperature(true); //Leemos la temperatura en grados Fahrenheit
  //--------Enviamos las lecturas por el puerto serial-------------
  Serial.print("Humedad ");
  Serial.print(h);
  Serial.print(" %t");
  Serial.print("Temperatura: ");
  Serial.print(t);
  Serial.print(" *C ");
  Serial.print(f);
  Serial.println(" *F");
}

Expliquemos el Sketch anterior:

Con las siguientes líneas definimos el pin al que está conectado el sensor, tipo de sensor y creamos la variable DHT:

#include "DHT.h"

#define DHTPIN 2     // Pin donde está conectado el sensor

//#define DHTTYPE DHT11   // Descomentar si se usa el DHT 11
#define DHTTYPE DHT22   // Sensor DHT22

DHT dht(DHTPIN, DHTTYPE);

Dependerá el tipo de sensor con el que están trabajando para definir el DHTTYPE, en nuestro caso es el DHT22, si usan el DHT11, deberán cambiar a #define DHTTYPE DHT11, también pueden cambiar el número del DHTPIN si desean conectar el sensor en otro pin.

Para inicializar el sensor usamos la siguiente función:

  dht.begin();

Y para realizar las lecturas correspondientes se usan las siguientes funciones:

      float h = dht.readHumidity(); //Humedad
      float t = dht.readTemperature(); //Temperatura en grados Celsius
      float f = dht.readTemperature(true); //Temperatura en grados Fahrenheit

Tener en cuenta que solo podemos tomar 1 lectura cada 2 segundos, es por eso que ponemos una pausa de 2 segundos antes de tomar las lecturas para asegurarnos que ya han transcurrido 2 segundos después de la lectura anterior.

 

EL resultado del ejemplo anterior lo podemos observar al abrir el monitor serial:

 

2. Incorporando el DHT11/DHT22 en procesos rápidos.

Un problema muy común es que al hora de incluir el ejemplo anterior a nuestro proyecto debido a la pausa de los 2 segundos, todo nuestro proyecto también se vuelve lento, incluso podría afectar algunas funcionalidad de nuestro proyecto. Esto porque cada bucle demoraría 2 segundos, tiempo demasiado grande para algunos procesos.

La solución es usar la función millis() de Arduino, el cual nos da el tiempo en milisegundos desde que empieza a ejecutarse el código.

A continuación se muestra como incorporar el sensor a nuestro proyecto sin necesidad de hacer la pausa de 2 segundos.

#include "DHT.h"

#define DHTPIN 2     // Pin donde está conectado el sensor

//#define DHTTYPE DHT11   // Descomentar si se usa el DHT 11
#define DHTTYPE DHT22   // Sensor DHT22

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  Serial.println("Iniciando...");
  dht.begin();
  pinMode(13, OUTPUT);
}
long tiempoUltimaLectura=0;; //Para guardar el tiempo de la última lectura
void loop() {
  //---------Lectura del Sensor--------------------------
  if(millis()-tiempoUltimaLectura>2000)
  {    
      float h = dht.readHumidity(); //Leemos la Humedad
      float t = dht.readTemperature(); //Leemos la temperatura en grados Celsius
      float f = dht.readTemperature(true); //Leemos la temperatura en grados Fahrenheit
      //--------Enviamos las lecturas por el puerto serial-------------
      Serial.print("Humedad ");
      Serial.print(h);
      Serial.print(" %t");
      Serial.print("Temperatura: ");
      Serial.print(t);
      Serial.print(" *C ");
      Serial.print(f);
      Serial.println(" *F");
      tiempoUltimaLectura=millis(); //actualizamos el tiempo de la última lectura
  }
  //----Fin de la lectura---------------------------
  
  //---------Resto del código  del proyecto--------
  //...
  //...
  //...
  digitalWrite(13, HIGH); 
  delay(100);              
  digitalWrite(13, LOW);    
  delay(100);   
  //-------------------------------

}

De esta forma evitamos la pausa de los 2 segundos, pero no el tiempo que demora en hacer la lectura, que es de aproximadamente  250 milisegundos, el cual lo pueden notar si realizan el ejemplo anterior, en donde se hace parpadear el led interno de la placa (Pin 13) con pausas de 100ms, pero si observan el led, en el momento de hacer la lectura se nota claramente que el led se apaga por más tiempo durante la lectura del sensor.

 

Productos relacionados
Artículos relacionados
25 Comentarios
  • pa***

    pa*** 11/12/2020 Responder

    Hola buenas noches, tenia una duda y es queme sale este error:
    dht.begin();
    pinMode (LedPin, SALIDA); (en el void loop)

    y la verdad que no se como arreglarlo, es para un trabajo de classe y no he programado en mi vida
  • Po** ******on

    Po** ******on 29/07/2020 Responder

    Tengo una dudad. Estoy haciendo un control de temperstura y humedad con DHT22 pero cada cierto tiempo el sensor me marca Nan y me da 0 en temperatura y humedad. Como puedo resolver este error ya que mi circuito tiene que tener un funcionamiento constante y si lectura se pierde el control de la humedad y temp.?
  • Bl*** ***** **ng

    Bl*** ***** **ng 25/07/2020 Responder

    nice
  • Lo***** ****ad

    Lo***** ****ad 07/07/2020 Responder

    This is nice post
  • Bl*** ***** **ng

    Bl*** ***** **ng 07/07/2020 Responder

    Thaks for this nice post
  • Ja***

    Ja*** 28/11/2019 Responder

    Great article. Thanks for sharing your acknowledge.

    J
  • Es*****

    Es***** 13/08/2019 Responder

    me sale "exit status 1" "erro compilando arduino"
  • An***

    An*** 04/06/2019 Responder

    Hola, una pregunta, es posible conectar 7 sensores DHT22 a un mismo arduino y que estos me funcionen correctamente?
    • ch****

      ch**** 20/11/2022 Responder

      si, tienes que revisar los pines el begin y los float que esten bien nombrados
  • Cr******

    Cr****** 20/05/2019 Responder

    Buenas, estoy intentando conectar el sensor DHT22 a un nodo Lora, más en concreto a "Lora Radio Node v1.0". Se me presenta un problema a la hora de teclear el código (soy nuevo en esto), este nodo que estoy utilizando no utiliza pines numerados como podría ser el "2" que es el que tú conectas. Sólo puedo utilizar estos: "A1, A0, D4 y D3".
    ¿Cómo completo esta línea si no me permite introducir el nombre del pin?- DHT dht(D3, DHT22);-
    Gracias de antemano.
  • Ma**** ******za

    Ma**** ******za 19/04/2019 Responder

    Hola amigo, una pregunta, este dispositivo puede ser usado con un multiplexor, esto a fin de conectar varios a un arduino, pero usando la menor cantidad de pines, si conoces forma de hacer esto con los DHT.
    Gracias
  • Vi**** ******ez

    Vi**** ******ez 20/03/2019 Responder

    Hola gran trabajo y aporte. Tengo una duda, cómo haria para usar la función millis en la última seccion. Por qué al aplicar delay afectaría la lectura del sensor esto aplicando a qué high y low por ejemplo los quiera mantener por 5 segundos respectivamente.
    //...
    digitalWrite(13, HIGH);
    delay(100);
    digitalWrite(13, LOW);
    delay(100);
    //-------------------------------

    Gracias de antemano y saludos!!!
  • Fa****

    Fa**** 06/03/2019 Responder

    Hola una pregunta mi programa manda este mensaje Error compilando para la tarjeta Arduino/Genuino Uno, después de haber seguido todo el tutorial a pie de la letra.
    • Ma****

      Ma**** 01/07/2019 Responder

      yo instale las librerias "adafruit unified sensor" y "adafruit unified playground", busca en el repositorio con "unified" como palabra clave
    • Sc*****

      Sc***** 07/03/2019 Responder

      Cambia la versión de la biblioteca a DHT.h 1.2.3, las 1.3.0 no funcionan
  • Se**** ****** *****ez

    Se**** ****** *****ez 25/11/2018 Responder

    Buenas quiero hacer un control de temperatura y no me cambia el estado del pin te copio el código y a ver si me puedes echar un cable me va dando lecturas pero no varia el estado del pin se conecta y aunque suba temperatura no me pone en LOW el pin 2, gracias de antemano llevo tiempo con esto y no doy con ello.

    //Climatizador

    const int clima = 22;
    const int ESTUFA = 2; //Declarar pin ESTUFA
    const int EXTRACTOR = 3; //Declarar pin EXTRACTOR
    int AN5 = A0; //Declara entrada analogica en pin A5

    void setup()
    {
    pinMode(ESTUFA, OUTPUT);
    pinMode(EXTRACTOR, OUTPUT);
    pinMode(AN5, INPUT);
    Serial.begin (9600);

    }
    void loop()
    {
    AN5 = analogRead(A0); //Conexion analogica del LM35
    AN5 = (AN5 * 500.00) / 1024.00; //Calcula la temperatura en ºC
    Serial.println(AN5);

    delayMicroseconds(2000);








    if(AN5

    digitalWrite(ESTUFA, HIGH); //Pin 2 ACTIVADO
    digitalWrite(EXTRACTOR, LOW); //Pin 3 DESACTIVADO






    }
  • Ed*****

    Ed***** 18/11/2018 Responder

    Hola, el sensor DHT22 me da una humedad altísima y no se por qué, ya que con los DHT11 me funciona bien. Cuál puede ser el problema?? Saludos y gracias de antemano.
  • J4

    J4 15/07/2018 Responder

    Buenas.

    Tengo un problema con la lectura de humedad, he probado alimentando el dispositivo desde diferentes fuentes de alimentación, con distintas librerias y los resultados son los mismos:


    Humedad 1.00 %tTemperatura: 27.70 *C 81.86 *F
    Humedad 1.00 %tTemperatura: 27.70 *C 81.86 *F
    Humedad 1.00 %tTemperatura: 27.70 *C 81.86 *F
    Humedad 1.00 %tTemperatura: 27.70 *C 81.86 *F
    Humedad 1.00 %tTemperatura: 27.70 *C 81.86 *F
    Humedad 1.00 %tTemperatura: 27.70 *C 81.86 *F
    Humedad 1.00 %tTemperatura: 27.80 *C 82.04 *F
    Humedad 1.00 %tTemperatura: 27.70 *C 81.86 *F

    La humedad varia si se respira sobre el sensor, pero de forma natural, haciendo pruebas sobre la mesa de un escritorio no me parece normal.

    ¿Qúe podria hacer?
  • Ma***

    Ma*** 24/06/2018 Responder

    he conectado todo como lo indicas pero al igual que Linda me da el mismo error
    • Sc*****

      Sc***** 07/03/2019 Responder

      Prueba con una R de 10k, yo tuve el mismo problema
  • Li***

    Li*** 03/04/2018 Responder

    Por que el sensor me arroja Humedad nan %tTemperatura: nan *C nan *F estara dañado el sensor o me falta alguna libreria
    • Ra**

      Ra** 08/07/2019 Responder

      En mi caso estaba definiendo el DHTTYPE como DHT22 y tenia ese mismo error, probé con el DHT11 y ya esta funcionando, en mi caso no se distingue el codigo en el componente.

      Saludos!
    • Cé****

      Cé**** 21/04/2018 Responder

      Estás conectando mal la tierra y el pin 2
  • na******

    na****** 23/08/2016 Responder

    hola amigo para hacerte una pregunta tu has logrado conectar dos DHT11 a un solo arduino me
    • Na*****

      Na***** 26/08/2016 Responder

      Hola Nathalia, para conectar otro DHT11 tienes que crear otro objeto para el segundo sensor por ejemplo: DHT dht_2(DHTPIN_2, DHTTYPE); y desde en el programa referirte con sus nombres respectivos por ejemplo:

      h1=dht.readHumidity();

      h2=dht_2.readHumidity();
Dejar un comentario
Deja su comentario

Menú

Ajustes

Crear una cuenta gratuita para usar listas de deseos.

Registrarse