Midiendo temperatura y humedad con Arduino y el sensor DHT11

En este tutorial aprenderemos a utilizar el sensor DHT11 para medir temperatura y humedad con nuestro ya conocido Arduino. Inicialmente solo obtendremos la lectura mediante la interfaz serial del Arduino, pero la idea final es enviar estos datos a un servidor en internet lo que dejaremos para otro tutorial. Para realizar este tutorial nos basamos en el realizado por Lady Ada.

Materiales

  • Sensor DHT11
  • Protoboard
  • Cables de conexión para protoboard
  • Cable conexión Arduino
  • Aurduino 1

Sensor DHT11

El DHT11 es un sensor básico de humedad y temperatura de costo reducido. Usa un sensor de capacidad para medir la humedad y un termistor para medir la temperatura del aire que lo rodea. Esta diseñado para medir temperaturas entre 0 y 50°C con una precisión de ±2°C y para medir humedad entre 20% y 80% con una precisión de 5% con periodos de muestreo de 1 segundo. El formato de presentación es una pequeña caja de plástico de 15.5mm x 12mm x 5.5mm con una cara en la cual tiene una rejilla que le permite obtener las lecturas del aire que lo rodea. Si se requiere mayor precisión podemos trabajar con su hermano, el sensor DHT22. El sensor tiene cuatro pines de los cuales solo usaremos el pin 1,2 y 4 DHT11_pins

Circuito

Para realizar el circuito utilizaremos un protoboard, en el colocamos el sensor y realizamos las conexiones según el siguiente esquema Sensor DHT11

Pin 1: +5V en Arduino
Pin 2: Digital 2 en Arduino
Pin 3: No se utiliza
Pin 4: Gnd en Arduino Se utiliza una resistencia pull up de 10K entre el Pin 2 del sensor y +5V de Arduino.

Programación

Para leer y transformar los datos que entrega el sensor es necesario utilizar una librería, en este tutorial utilizaremos la librería creada por Adafruit. Para instalar la librería en tu ambiente de desarrollo Arduino (IDE) debes bajar el archivo comprimido zip desde el botón Donwload Zip al lado derecho en el sitio de GitHub. Se descargará un archivo a tu computador que debes descomprimir, dentro del archivo zip encontrarás una carpeta, copia esta carpeta al directorio donde están las librerías de tu ambiente de desarrollo Arduino (IDE) que en este ejemplo donde estamos utilizando Windows 7 están en C:\Program Files (x86)\Arduino\libraries, el contenido de la carpeta lo copiamos dentro de C:\Program Files (x86)\Arduino\libraries\DHT y reiniciamos el IDE. Una vez terminado el circuito y con la librería cargada es hora de comenzar a trabajar con el sketch para Arduino.

// Internet de las Cosas
// www.internetdelascosas.cl
// Sketch de prueba para sensores DHT humedad / temperatura
// Escrito por @joniuz basado en el sketch de Ladyada

// Libreria para Sensores DHT
#include "DHT.h"

#define DHTPIN 2     // Puerto Digital del Arduino al cual esta conectado el pin 2 del sensor

// Descomentar segun el tipo de sensor DHT usado
#define DHTTYPE DHT11   // DHT 11 
//#define DHTTYPE DHT22   // DHT 22  (AM2302)
//#define DHTTYPE DHT21   // DHT 21 (AM2301)

// Diagrama
// Pin 1 Sensor a +5V de Arduino
// Pin 2 Sensor a HDTPIN (en este sketch es el puerto digital 2)
// Pin 4 Sensor a GROUND de  Arduino
// Resistencia de 10K desde Pin 2 de sensor a Pin 1 de Sensor o +5V

// Inicializa el sensor
DHT dht(DHTPIN, DHTTYPE);

// Configura Arduino 
void setup() {
  Serial.begin(9600); 
  Serial.println("InternetdelasCosas.cl\n\nPrueba de sensor DHTxx!");
 
  dht.begin();
}

void loop() {
  // Espera dos segundos para realizar la primera medición.
  delay(2000);

  // Lee los datos entregados por el sensor, cada lectura demora 250 milisegundos
  // El sensor muestrea la temperatura cada 2 segundos}
  
  // Obtiene la Humedad
  float h = dht.readHumidity();
  // Obtiene la Temperatura en Celsius
  float t = dht.readTemperature();
  
  // Control de errores, valida que se obtuvieron valores para los datos medidos
  if (isnan(h) || isnan(t)) {
    Serial.println("Falla al leer el sensor DHT!");
    return;
  }

  Serial.print("Humedad: "); 
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperatura: "); 
  Serial.print(t);
  Serial.println(" *C ");
}

Pueden copiar y pegar el código de arriba en la interfaz IDE de Arduino o descargarlo aquí y abrirlo desde la misma interfaz, luego deben presionar Verificar, si no hay errores continuar con el botón Cargar el cual traspasará el código binario que genera la interfaz IDE a nuestro Arduino donde comenzará a ejecutarse. Para ver el resultado de nuestro  trabajo debemos activar la interfaz serial, esta se activa desde el menú Herramientas / Monitor Serial o presionando Ctrl + Mayúsculas + M ActivarInterfazSerial En el monitor serial podremos ver como se ejecuta nuestro script y los valores que obtiene al medir la temperatura y humedad del aire que lo rodea. Prueben respirar cerca del sensor. Lecturas_TyH Termino este tutorial con un «Continuará» porque la idea es conectar ahora un Ethernet Shield y enviar los datos a un servidor en internet.

Author: José Zorrilla

Ingeniero Civil Informático, Universidad de Santiago de Chile. Master of Professional Engineering University of Sydney. En Chile trabajó empresas de servicios internet y telcos como IBM, VTR y Entel. Le gusta la fotografía y el armado de drones, tiene estudios de violín, guitarra eléctrica y sintetizadores que enciende cuando tiene algo de tiempo.

95 thoughts

  1. Hola amigo, sabe me interesa este tutorial ya que necesito que me ayude con la parte en como puedo subir estos datos a la web y que pueda yo visualisarlo desde cualquier ordenador connectado a la red mediante una pagina web. la verdd nesito controlar un invernadero atraves de la web, porfavor si me podria ayudar con eso esque nose como empesar.

      1. Hola amigo, me sirvio de mucho y que estoy haciendo algo similar, solo que, como lo puedo hacer para que mande los datos y se vean en una pantalla LCD 16×2

  2. hola amigo, la verdad me interesan mucho estos tutoriales
    estoy interesado como puedo enviar esta información con un modulo GSM
    para arduino

  3. Hola amigo, solo quisiera saber si para conectar otro sensor simplemente tengo que poner #define DHTPIN «X» x seria otro pin de lectura y para leer ambos sensores que tendria que hacer? gracias

    1. Mirko, si, debes definir otra variable para el segundo sensor como #define DHTPIN2 10 y despues inicializar el objeto que obtendra esas variables con DHT dht2(DHTPIN2, DHTTYPE); los valores los obtendrias con el objeto dht2.

      Saludos

  4. Estimado tu sabes donde puedo comprar SENSOR HUMEDAD Y TEMPERATURA DHT 11 y mas menos su valor, por tu respuesta muchas gracias….

  5. Disculpe Ingeniero, tengo un proyecto igual al que usted publico en esta sección pero en este caso me pide que conecte 4 sensores dht11 y que grafique en tiempo real la humedad y temperatura que se esta obteniendo, como puedo lograr que los datos del monitor serie se puedan capturar y como puedo declarar los otros sensores.

    1. Estimado, vea este tutorial donde eseñamos como enviar los datos tomados con el sensor DHT11 y enviarlos a un servidor para un proceso posterior que puede ser graficar. Con respecto a como conectar mas sensores vea la respuesta en ese mismo tutorial a Mirko que pregunta como conectar dos sensores.

      Saludos.

  6. Estimado,
    muy buen tutorial lo felicito.
    te cuento yo estoy comenzando con arduino y me gustaría saber si me puedes ayudar.
    quiero agregar a este mismo proyecto un sistema de «alarma», me explico:
    cuando la humedad llegue a 55% o + que encienda un led y cuando baje de 55% que se apague.
    me puedes orientar… gracias

  7. Estimado Joniuz,
    no consigo hacer funcionar el sensor, solo me aparece el mensaje «Falla al leer el sensor DHT!». revise el circuito mas de 10 veces y esta todo correctamente conectado.
    mi resistencia es de 2K, ¿puede ser ese el problema?

    Quedo atento a tu ayuda.

    1. Giovanni, si, la resistencia puede ser el problema, pero de todos modos debería detectar el sensor pero darte valores falsos. Puedes probar con otro sensor? Estas seguro que están bien conectados los pines y que no lo estas conectando al revés?

      Saludos

      1. Joniuz, cambie la resistencia por una de 10k, tengo dos sensores, con los dos me pasa lo mismo, con respecto a los pines, me guié por el dibujo del esquema (con los orificios del sensor mirando hacia adelante), para descartar lo probé también dando vuelta el sensor, y nada.

        1. hola Giovani vi tu comentario y me da el mismo error «Falla al leer el sensor DHT!», solucionastes el error para que me ayudes, espero contar contigo

  8. Hey amigo, ante todo saludos, soy ingeniero en telecomunicaciones con cierta experiencia en el área, y estoy muy interesado en Iot, ¿qué posibilidades hay de trabajar con ustedes?.

  9. hola ingeniero me gustaría saber como puedo hacer que cuando la lectura del sensor llegue a 40°C active un relevador y cuando baje a 37°C lo desactive, son algo principiante en esto, le agradecería mucho su ayuda

    1. Hola Rene, la solucion es simple, colocas un par de sentencias condicionales if y un relay (relevador) que activas si el sensor llega a 40 C y desactivas cuando baja la temperatura, el relay lo conectas al pin digital 2, el codigo seria algo asi:

      int relay = 2;

      if (temperatura > 40)
      digitalWrite(relay, HIGH);
      if (temperatura < 37) digitalWrite(relay, LOW); Puedes ver como conectar relays en este tutorial http://www.internetdelascosas.cl/2013/07/27/controlando-un-relay-con-arduino/

      Saludos

  10. hola excelente tus tutoriales, este proyecto se puede hacer para medir altas temperaturas con un sensor de altas temperaturas (1200 grados app.)

  11. Quisiera saber como hacer lo mismo pero con un sensor de temperatura LM35 y un sensor de humedad que me aparesca la temperatura y humedad en una LCD de 16×2

    1. Eduardo, el sensor LM35 no mide humedad asi que no te serviria para lo que necesitas.

      Ya haremos un tutorial para utilizar LCD.

      Saludos

      1. Flavio, el eror «Not declared» indica que la libreria no ha sido instalada o no esta instalada en donde corresponde.

        Revisa tu instalacion de las librerias Arduino.

        Saludos
        JZ

    1. Hola Alejandro

      Para el sensor dht22 debes comentar la linea (agregar // al comienzo de la linea)
      #define DHTTYPE DHT11 // DHT 11

      Y descomentar la linea (quitar los // del comienzo de la linea)
      //#define DHTTYPE DHT22 // DHT 22 (AM2302)

      Saludos
      JZ

  12. Hola Joniuz, tengo una duda con la libreria en realidad.. resulta que copie tu programación. me queda el led del pin 13 prendido, y no me permite encender un led u activar otro periférico, sabes porque pasa esto?
    [Codigo eliminado]
    el pin 13 esta prendido desde el principio, y si lo hago con otro pin, el led no prende.

    1. Alvaro, revise el codigo y no entiendo bien para que tienes la variable «altura», el sensor es de temperatura y humedad, por que altura? Ademas despues de 5 ciclos prendes el LED en el pin 13, para que? por eso siempre ves el LED prendido.

      Saludos

  13. Hola, he copiado el codigo en el programa y me da error. Pone exactamente esto: sketch_aug12a.ino:1:17: error: DHT.h: No such file or directory
    sketch_aug12a:17: error: ‘DHT’ does not name a type
    sketch_aug12a.ino: In function ‘void setup()’:
    sketch_aug12a:24: error: ‘dht’ was not declared in this scope
    sketch_aug12a.ino: In function ‘void loop()’:
    sketch_aug12a:35: error: ‘dht’ was not declared in this scope

    He revisado las conexiones y está todo bien. Estoy utilizando la misma versión de arduino (1.0.5), no sé como solucionar el problema, podrían ayudarme?

    1. Irene, instalaste la libreria? el error indica que no tienes el archivo DHT.h que es justamente el archivo de la libreria que te permite obtener los datos del sensor.

      Saludos

  14. Hola, al cargar el programa el resultado que me da es el siguiente:
    Read failHumedad:
    nan
    Temperatura:
    0.00
    No entiendo por qué no funciona correctamente, alguien sabe cuál es el error?

    1. Hola Laia, por lo que veo pueden ser varias cosas, el sensor puede estar defectuoso o mal conectado, la resistencia puede no ser la correcta o finalmente la libreria para leer el sensor no esta instalada.

      Saludos

    2. Me ha pasado con el Arduino Nano. El puerto digital 2 (D2) está en el pin 5 del microcontrolador. Ten en cuenta que cuando defines los pines, se deben definir por numero de puerto, no por número de pin, es decir si el puerto al que está conectado el sensor es el D2, la definición del pin debería ser 2.

  15. Hola sabes tengo el siguiente problema me aparece esto cuando quiero compilar «error: expected ‘,’ or ‘;’ before ‘if'», que podria ser, sin esas lineas el codigo funciona, pero necesito comprobar esos errores, saludos

  16. hola estimado.
    estoy haciendo algo similiar pero quiero setearlo en ciertos parametros y si pasan de los indicado como en la humedad que se active un humidificador y en temperatura un aire acondicionado o ventilador si es que por ahi tienes algun tutorial de algo similiar.

    De ante mano muchas gracias.

  17. Muy Bien explicado.

    Ingeniero, una pregunta, como podría hacer para mostrar las lecturas obtenidas por un sensor de humedad en php?

  18. Hola amigo, sabe me interesa este tutorial ya que necesito que me ayude con la parte en como puedo puedo hacer un invenadero con arduino ya que aun soy nuevo en este tema de arduino agradeceria su ayuda ..??

    1. Estimado
      Desea medir la temperatura en el invernadero? tiene algun dispositivo para subir o bajar la temperatura? Todo depende de lo que quiera hacer, pero debe tener claro cual es el objetivo del proyecto.
      Saludos
      JZ

  19. hola muy buen tutorial mi duda es quisiera saber como medir el potencial hidrico de las plantas mas no del suelo cual seria el sensor y la programcino en arduino porfavor gracias saludos

    1. Jorge, desconocemos si existe un sensor de potencial hidrico. Como se mide en laboratorio este potencial? Lo mas probable es que sea un conjunto de sensores lo que permitan medirlo.

      Saludos

  20. hola estimado
    muy bueno su tutorial pero me podria ayudar un poco
    como podemos repricar la temperatura del dht11 en dos display de siete segmentos
    se agradecerua su ayuda

  21. hola JONIUS tengo una duda esperando y puedas ayudarme, antes que nada muy buen tutorial e interesante; estoy trabajando con el mismo sensor DTH11 Y YL-69, YL38 el código me sirvió mucho no me marca error pero lo malo ala hora de monitoreo serial me marca <> please ayuda

    1. Adi, estas usando el mismo script? porque al menos deberia escribir «Humedad: % Temperatura: *C» si es que el sensor no entrega datos.
      Prueba cambiando el script quitando la parte del sensor y viendo si el Arduino escribe en la puerta serial, quiza es un problema de placa.

      Saludos

  22. hola, tengo una duda, mi DHT11 tiene cuatro pines pero esta conectado a una pequeña placa de tres pines, eso quiere decir que esta adecuado para trabajar instantáneamente con los pines 1,2 y 4?

    1. Hola Catalina, hay muchos tipos de este sensor, el que tienes tu esta montado sobre una placa y tiene solo los tres pines que se usan. Debes tener asegurarte de conectar correctamente cada pin, normalmente los pines de alimentacion van en los extremos, y el pin de datos en el centro, pero deberian estar bien marcados sobre la placa: 1 Vcc ( + ), 2 Out (o data), 3 GNR ( – )

      Saludos

  23. Saludos Buen tutorial,
    Como puedo conectar un xbee al arduino para que los datos que reciba el sensor dht11 atravez del xbee se manden al arduino.
    Logre probar el sensor con el arduino.

  24. hola,

    copié tu programa de la web, descargue la librería indicada y la instalé, compilé y cargue en el arduino y no funciona, todo está conectado como corresponde, sin embargo el monitor serial me muestra un error «falla al leer el sensor DHT»,
    al compilar veo este mensaje «ATENCIÓN: .github Espúrias carpetas en librería ‘DHT sensor library'»

    1. Hola Jose Luis, estas utilizando la misma libreria que sugerimos?
      por que el error esta en portugues si la libreria esta en ingles?
      Creo que el problema esta en la libreria.
      Saludos

      1. Amigo,
        A mi me sale el mismo mensaje, instalé todo bien y problemas con la librería.
        PD: la resistencia del esquema es de 1K

    1. Hola Anthony, con respecto a tu pregunta, cuando dices «led» te refieres a un solo led? una barra de leds? un display de leds con los cuales se pueden formar numeros?
      Para las opciones de led, simplemente es colocar una serie de if para encender cada led de acuerdo al valor de la temperatura, en pseudo codigo seria algo asi:

      if (temperatura > algun_valor) and (temperatura < otro_valor) enciende_led(pin_del_led);

      Para mostrar los valores en un display te recomiendo leer este tutorial

      http://www.internetdelascosas.cl/2015/02/28/mostrando-valores-en-display-led-de-4-digitos-tm1637/

      Saludos

  25. Oye disculpa yo necesito utilizar el sensor dth11 pero tengo que hacer prender un led para que suba la temperatura y prenda un ventilador para bajar temperatura…..pensé en una condición pero no he podido hacer….se muy poco de esto… Espero me puedan ayudar!!!!

    1. Hola Ricardo, creo que este tutorial es mejor para eso

      http://www.internetdelascosas.cl/2014/07/14/estacion-mereorologica-capturando-temperatura-humedad-y-luminosidad-en-mysql-usando-apache-php-arduino-ethernet-shield/

      Debes cambiar los LEDs por un relay con eso puedes controlar un ventilador para bajar la temperatura.

      Ahora si deseas hacer el sistema autonomo, es una simple condicion if en el codigo cuando la temperatura exceda un cierto valor, no es necesaria la conexion al servidor.

      Saludos

  26. hola, yo necesito implementar a mi gsm shield 2 un sensor dht11 para que me envie los datos a mi móvil cada cierto tiempo por mensaje y que me avise cuando baje o suba de cierta temperatura, es eso posible?¿ un saludo y muchas gracias de antemano.

    1. Bruno, lo que deseas es completamente factible, nosotros hemos usado una Rasberry Pi para hacer eso, y usamos whatsapp para enviar los mensajes ya que no cobran por mensaje.
      Saludos

  27. Buenos días, joniuz, me gustaria que me ayudaras en un montaje con Arduino: Verás, quiero que cuando detecte mas de un 80% de humedad, se active un motor x(por ejemplo 20) vueltas, se puede acer

  28. Hola, muchas gracias por tus enseñanzas, sabes quiero realizar una comunicación entre arduinos (Maestro-Esclavo) con módulos bluetooth HC-05,para medir temperatura y humedad con el sensor DHT11 y que los datos los pueda observar en un LCD, que me recomiendas?, te lo agradeceré mucho.
    hasta el momento he logrado enlazar ambos Bluetooth, se que la comunicación tiene que ser por string, pero no he intentado que la información que da el DHT11 que se encuentra en el maestro, la envía al LCD que se encontrara en el esclavo, alguna recomendación?.
    Muchas gracias.

  29. Buenas tardes, haber si me puede ayudar, necesito enviar información desde un arduino con xbee (router) este va a leer datos de humedad, temperatura y presión y estos datos enviarlos a otro arduino con xbee (coordinador) este ultimo va a recibir la informacion y almacenarlo a un micro-sd mismo que tiene el coordinador, claro estos van a estar conectados mediante una pila y cargados mediante panel solar, si me pueden ayudar con esto se los agredeceria, gracias.

  30. Hola Joniuz le felicito por todo su trabajo. Yo realice algunos montajes sencillos con Pic y ahora quiero comenzar con Arduino y veo muy interesantes sus publicaciones, procurare seguirle en Faceboock también . Gracias de nuevo por toda su labor didáctica. Un saludo desde España.

  31. Me gustaría saber por que agrega la resistencia de 10k si la intensidad entregada por el arduino es de 50mA.
    es decir la resistencia que seria la que da por ley de ohm es 100k
    V=R*I
    R=V/I
    R=5/0.00005
    R=100.000

    Eso me gustaria aclarar esa duda.
    Muchas gracias

    1. Hola Etiel, primero que nada, en la formula V=R*I los valores tienen que estar en Volts, Ohms y Amperes, si dices que la placa Arduino entrega 50mA entonces la conversión es 50mA = 0.05A y no 0.00005 como esta en tu formula.

      Lo segundo y mas importante es la función que cumple esta resistencia en el circuito, se usa como una resistencia pull-up, en otras palabras, la idea es dejar el voltaje en cero en el pin digital 2 de Arduino cuando el sensor no envía un valor HIGH (estamos hablando de puertos digitales) con esto evitamos interferencia entre la comunicación sensor-Arduino. Por este motivo se recomienda usar una resistencia alta, normalmente de 10KΩ.

      Espero que se aclare tu duda.
      Saludos
      JZ

  32. Estimado José, muchas gracias por su ayuda.

    Le envío todo mi proyecto, una carpeta con la conexion mysql y los distintos controllers y views, la base de datos propiamente tal, el código arduino para el funcionamiento de éste, las librerias arduino, fotografías de arduino uno, ethernet shield, sensor de temperatura DHT11 y LCD keypad SHIELD.

    Lo que es base de datos y código php, con conexión a la base de datos me funciona correctamente.

    El código arduino no lo he probado, pero al compilar no me refleja errores.

    Las conexiones, 0 avance

    Hasta Pronto.

    acá va el link de los archivos
    https://www.dropbox.com/sh/2gvpoxkvlprny6w/AABUokHMns3jSgW4VQXpN4Rda?dl=0

    1. Sebastian, me parece bien, es un proyecto publico? podemos subirlo a un repositorio en Github? es mucho mas fácil ver código con herramientas especializadas, Dropbox no esta pensado para desarrollar código.

      Saludos
      JZ

  33. hola te felicito, tu trabajo, pero tengo un problema, me tira este error de libreria cuando compilo
    :\Users\mfcz\Documents\Arduino\libraries\DHT-sensor-library-master/DHT_U.h:25:29: fatal error: Adafruit_Sensor.h: No such file or directory

    #include

    si me podes dar una mano, te agradesco

  34. Hola:
    Excelente tutorial !!! Muchas gracias.
    Una consulta:
    ¿Es posible construir un dispositivo como este para medir temperatura y humedad, pero que sea autosuficiente (por un par de horas) y pueda transmitir la información grabada de algún modo (inalámbricamente por ejemplo) para luego ser recuperada como un sistema por batch?.

    Muchas gracias

    1. Estimado Joel
      Todo depende del LCD Keypad que estes usando, debes revisar que pines usa, y elegir un pin diferente para el sensor dht11, en este ejemplo estamos usando el pin digital 2, en el codigo esto se configura en

      #define DHTPIN 2

      Luego deberias fusionar ambos codigos (LCD + DHT11) en un solo script y probar.
      Saludos
      JZ

  35. Hola Estimado, mira me encuentro en una encrucijada, ya que me encuentro realizando un pryecto en el que necesito coneccion wifi en el arduino y conectar sensores como el dht22 , sensores de medicion de viento e iluminacion, pero no se que arduino es apropiado para esto, por cierto los sensores los coloque por orden de importancia en el proyecto. Si me pudieses guiar te ganarias mil porotos

  36. Hola! también soy de la universidad de Santiago.
    Mi consulta es la siguiente, implementaré un sistema así (de humedad y tº) pero en otra tarjeta de desarrollo llamada BeagleBone Black, por lo que mi duda es cuál sería el programa en ésta. Qué comandos son diferentes para Arduino y para la BeagleBone (lenguaje C).

    Gracias.

  37. Buenas noches amigo, estoy inciando con arduino. Ya realice mi primera prueba con el dht22 y funciono en el monitor serial al 100%.
    Pero quiero imprimir mi valor en el LCD_I2C, pero no logro conectar los datos del sensor al LCD, e intentado con varios codigos y me indica error…
    Gracias de antemano.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *