Páginas

lunes, 30 de junio de 2014

Tutorial Arduino III. Sensores DHT y Display LCD

En este tutorial de Arduino vamos a medir la temperatura ambiente y el nivel de humedad relativa con un sensor digital de la familia DHT, en concreto el DHT22, y mostrarla en un display LCD de 16x2, de esta forma podemos familiarizarnos con el manejo de sensores digitales. El tutorial es válido para cualquier sensor de esta familia. Las ventajas de estos frente a los analógicos son dos: por un lado el nivel de precisión y rango de medida son superiores en los digitales (dejando a parte los termopares), además los sensores analógicos al enviar una lectura en forma de voltaje, no deben utilizarse con largas tiradas de cable, sino que deben estar físicamente cerca de la placa que recibe la lectura para evitar perdidas, lo que limita sus aplicaciones practicas. Este inconveniente no se da en los sensores digitales, por razones obvias.

La familia de sensores ambientales DHT esta formada por tres modelos: DHT11, DHT21 y DHT22, estos dos últimos se presentan en dos versiones diferentes, la básica, para soldar o pinchar directamente en protoboard y la encapsulada y cableada, mucho más práctica que es la podéis encontrar en nuestra tienda.




Las características generales de estos sensores son (el DHT22 es una evolución del DHT21 con unas prestaciones muy similares):


La estructura para la conexión de estos sensores es la misma en todos los modelos, un pin para la alimentación, otro para el GND y otro para datos. El cuarto pin es para la función "disconected" que rara vez se utiliza, de hecho en las versiones encapsuladas (como la que vamos a usar) si bien el pin esta presente no esta cableado, por lo que solo habrá tres cables: el rojo (alimentación), negro (GND) y amarillo (datos).

Material Necesario


El material necesario para la realización de este tutorial consiste en:

  1. Arduino Uno
  2. Breadboard con Puentes de Conexion
  3. Sensor de Temperatura DHT22
  4. Display LCD 16x2 LMB162HBC
  5. Resistencia variable de 10K Ohm
  6. Resistencia 1/4w 10K Ohm
  7. Tira de 40 Pines Macho

Esquema de Montaje

Los datasheet del sensor DHT22 y del Display LCD son:


El esquema de montaje en Fritzing de todos los componentes y las conexiones necesarias es el siguiente:



En lo que se refiere al conexionado del Display LCD es el mismo que usamos en el anterior Tutorial Arduino: Sensor TMP36 y Display LCD, que repetimos:

  • Salida 5V del Arduino al positivo de la Breadboard 
  • GND del Arduino al GND de la Breadboard 
  • Un pin del potenciometro de 10K Ohm al positivo de la Breadboard 
  • Pin central del potenciometro de 10K Ohm al GND de la Breadboard 
  • El tercer pin del potenciometro de 10K Ohm al pin 3 del LCD (V0) 
  • Pin 15 LCD  (BLA) al positivo de la breadboard  
  • Pin 16 LCD (BLK) al GND de la breadboard  
  • Pin 1 LCD (VSS) al GND de la Breadboard  
  • Pin 2 LCD  (VDD) al positivo de la Breadboard
  • Pin 4 LCD (RS) a la salida 7 del Arduino  
  • Pin 5 LCD (R/W) al GND de la Breadboard 
  • Pin 6 LCD (E) a la salida 8 del Arduino 
  • Pin 11 LCD (DB4) a la salida 9 del Arduino 
  • Pin 12 LCD (DB5) a la salida 10 del Arduino 
  • Pin 13 LCD (DB6) a la salida 11 del Arduino 
  • Pin 14 LCD (DB7) a la salida 12 del Arduino 

La resistencia variable de 10K Ohm se utiliza para regular el contraste del display LCD por lo que para ver los datos que enviemos al mismo hay que ajustarlo manualmente mediante un eje o un pequeño destornillador.

En lo que respecta al sensor DHT22, en nuestra versión encapsulada y cableada, tenemos tres cables, el rojo para la alimentación, el negro para el GND y el amarillo para datos conectado en nuestro ejemplo al pin 2 de Arduino. La única particularidad es que montamos una resistencia "pull-up" de 10K Ohm que conecta el voltaje con el pin de datos.



Sketch Arduino

Para el uso de este sensor, como en otros muchos casos, es necesario instalar de forma previa la librería correspondiente, sino se esta familiarizado con este proceso resultar interesante leer nuestro Tutorial Arduino II: Librerias Arduino.

Podéis descargar la librería necesaria aquí: Librería Sensores DHT.

El sketch para mostrar los datos de temperatura y humedad relativa en el display LCD es:

#include <LiquidCrystal.h> 
//Llamamos a la libreria para controlar el LCD incluida en el IDE de Arduino
LiquidCrystal lcd(7, 8, 9, 10, 11 , 12); 
//Definimos los pines asignados al LCD según el esquema de conexión
#include "DHT.h"
//Llamamos a la libreria de los sensores DHT instalada previamente
#define DHTPIN 2 
#define DHTTYPE DHT22
//Definimos el pin de Arduino al que conectamos el pin de datos del sensor e indicamos el tipo de sensor (DHT22)

DHT dht(DHTPIN, DHTTYPE);


void setup(){

  Serial.begin(9600);
  Serial.println("Prueba DHT22");
//Iniciamos la comunicacion Monitor Serial y editamos un texto descriptivo

  dht.begin();
//Iniciamos el sensor
  }

void loop(){

 delay(2000);
//Establecemos un retraso porque el DHT22 solo realiza una lectura cada 2 segundos

  float h = dht.readHumidity();

  float t = dht.readTemperature();
//Establecemos dos variables, una para la temperatura en ºC y otra para la humedad relativa en %

  if (isnan(h) || isnan(t)) {

    Serial.println("Error al Leer Sensor DHT¡");
    return;
//Con la funcion isnan controlamos que el valor recibido del sensor sea un número, sino dara error
  }
  
  Serial.print("Humedad: "); 
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperatura: "); 
  Serial.print(t);
  Serial.println(" *C ");
//Mostramos la información obtenida (temperatura y humedad) en el Monitor Serial
//El \t es equivalente al tabulador (separa los datos)
//El Serial.prinln nos cambia de linea en la siguiente lectura recibida

  lcd.begin(16, 2); 

//Indicamos el LCD que usamos: 16 caracteres y 2 lineas
  lcd.setCursor(0,0); 
//Situamos el cursor en la posicion 0 de la primera linea
  lcd.write("Temperatura: "); 
  lcd.setCursor(12,0); 
  lcd.print(t);
  lcd.setCursor(14,0); 
  lcd.write((char)223);
//Editamos el simbolo de los grados º
  lcd.setCursor(15,0); 
  lcd.write("C");
  lcd.setCursor(0,1); 
  lcd.write("Humedad: "); 
  lcd.setCursor(9,1); 
  lcd.print(h);
  lcd.setCursor(14,1);
  lcd.write("%");




Una cosa interesante, la librería instalada permite manejar dos variables adicionales que no hemos usado, por un lado la temperatura en grados Farenheit y por otro el Heat Index, que es un valor que pretende relacionar la temperatura y la humedad para dar la temperatura percibida, una especie de "sensación térmica", expresada en grados Farenheit. Se definirían de esta forma:


  float f = dht.readTemperature(true);
  float hi = dht.computeHeatIndex(f, h);




  
  
  

  
    

47 comentarios:

  1. hola, para poner digamos 3 dht22 en el mismo programa, con incluir una libreria vasta y poner pines diferente al 2 es suficiente para q trabaje el programa?

    ResponderEliminar
  2. Efectivamente, las librerias se instalan en el IDE de Arduino, y se incluyen en el sketch. En tu casos vas usar tres sensores que van a usar funciones de la misma libreria. Por otra parte como dices, has de conectar cada pin de datos de cada sensor a un pin diferente del Arduino para poder distiguir las lecturas.

    ResponderEliminar
  3. para los 3 sensores dht22► para digamos activar un led(1) si sube a 30 grados centigrados
    y otro led(2) si digamos baja a 40 porciento la humedad, como podria declarar eso en el programa o sea cual seria mi variable para activar ese led(1)(2) es lo q quisiera hacer

    ResponderEliminar
  4. y para pegar los 3 programas seria haci►?
    setup()
    {
    ... // Inicialización global
    }

    loop()
    {
    if(OpcionPrograma1) // Puede ser un pulsador, leer de la EEPROM un valor, ...
    {
    setup_programa1();
    while(1)
    loop_programa1();
    }
    else if(OpcionPrograma2) // Puede ser un pulsador, leer de la EEPROM un valor, ...
    {
    setup_programa2();
    while(1)
    loop_programa2();
    }
    ... // Repetir con las opciones que quieras
    }


    Después tendrías que renombrar cada uno de los setup() y loop() que quieres utilizar como setup_programa1, loop_programa1, setup_programa2, loop_programa2, setup_programa3, loop_programa3, ... y añadirlos al proyecto

    ResponderEliminar
  5. Tienes que establecer una variable float para la temperatura usando dht.readTemperature(), luego con if an else gestionas las salidas en función de los valores de la variable anterior.

    ResponderEliminar
  6. y sobre agregar varios programas, esta bien o no funciona eso, el mini programa q puse para compilar varios programas en uno?

    ResponderEliminar
  7. Seria algo asi:


    #include "DHT.h" //Añadimos la libreria con la cual trabaja nuestro sensor
    #include
    #include
    LiquidCrystal_I2C lcd(0x27,16,2); // 0x27 es la direccion del LCD 16x2

    //#define DHTPIN 13 // Indicamos el pin donde conectaremos la patilla data de nuestro sensor

    #define HT1 12
    #define HT2 13

    // El sensor que vas a emplear. En este caso usamos el DHT11
    #define DHTTYPE DHT11 // DHT 11

    DHT dht1 (HT1, DHTTYPE); //Indica el pin con el que trabajamos y el tipo de sensor
    DHT dht2 (HT2, DHTTYPE);

    void setup()
    {
    dht1.begin(); //Iniciamos el sensor
    dht2.begin();
    lcd.init();
    lcd.backlight(); //enciende la iluminacion
    }

    void loop()
    {
    float h1, h2, t1, t2 = 0;
    // La lectura de la temperatura o de la humedad lleva sobre 250 milisegundos
    // La lectura del sensor tambien puede estar sobre los 2 segundos (es un sensor muy lento)
    h1 = dht1.readHumidity(); //Guarda la lectura de la humedad en la variable float h
    t1 = dht1.readTemperature(); //Guarda la lectura de la temperatura en la variable float t

    h2 = dht2.readHumidity(); //Guarda la lectura de la humedad en la variable float h
    t2 = dht2.readTemperature(); //Guarda la lectura de la temperatura en la variable float t

    //Mostramos mensaje con valores actuales de humedad y temperatura, asi como maximos y minimos de cada uno de ellos
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Humedad 1: ");
    lcd.print(h1);
    lcd.print(" %");

    lcd.setCursor(0, 1);
    lcd.print("Temp 1: ");
    lcd.print(t1);
    lcd.print(" *C");
    delay(3000);

    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("Humedad 2: ");
    lcd.print(h2);
    lcd.print(" %");

    lcd.setCursor(0, 1);
    lcd.print("Temp 2: ");
    lcd.print(t2);
    lcd.print(" *C");
    delay(3000);
    }

    ResponderEliminar
  8. Asi has definido dos sensores, obtienes dos lecturas y actuas en funcion de ellas.

    ResponderEliminar
  9. paste facebook sisi, no e animarias a hacerme un programa mas o menos complejo puedo pagarte por hacerlo ya q es de mi interes, tu dirias, yo te mandaria un secuencia???

    ResponderEliminar
  10. Gracias por la oferta, lamentablemente no nos dedicamos a realizar desarrollos a medida, simplemente vendemos el material.

    ResponderEliminar
  11. Hola, en la versión encapsulada y cableada ya viene por defecto la resistencia de 10K o hay que ponérsela??? Un saludo

    ResponderEliminar
    Respuestas
    1. No, la resistencia en este sensor hay que comprarla a parte.

      Eliminar
  12. ME PUEDE BRINDAR UN LINK DONDE PUEDA DESCARGAR LA LIBRERIA DE DHT22 ??? POR FAVOR

    ResponderEliminar
    Respuestas
    1. Puedes usar la misma librería DHT, solo especifica que se trata de un DHT22

      ejemplo
      DHT dht1 (sensor1, DHT22);
      DHT dht2 (sensor2, DHT11);
      DHT dht3 (sensor3, DHT11);
      DHT dht4 (sensor4, DHT22);
      DHT dht5 (sensor5, DHT22);
      DHT dht6 (sensor6, DHT22);

      En este caso yo tengo 6 sensores, 4 dht22 y 2 dht11.

      Saludos

      Eliminar
  13. Puedes decargarlo desde este enlace:

    http://www.cetronic.es/sqlcommerce/disenos/plantilla1/seccion/producto/DetalleProducto.jsp?idIdioma=&idTienda=93&codProducto=999334036&cPath=1343

    ResponderEliminar
  14. Buenas, al conectar el potenciometro, no tendrías que poner en sus extremos los cables rojo y negro (voltaje y tierra respectivamente)?

    ResponderEliminar
    Respuestas
    1. Al menos en la resistencia variable que usamos (tienes el enlace en el tutorial) la señal se envia desde el pin lateral.

      Eliminar
  15. Y en el sensor DHT22 porque conectas el cable amarillo al pin 3 para luego pasarlo al 2? No se si son preguntas obvias pero soy un poco noob en este tema.

    ResponderEliminar
  16. No se a que te refieres, el pin 3 de Arduino no se esta utilizando ¿puedes darme mas detalles?

    ResponderEliminar
  17. Que tipo de cable debo utilizar para hecer este montaje (macho-macho o macho-hembra)?

    ResponderEliminar
  18. Yo usaria macho a macho, como estos: http://www.cetronic.es/sqlcommerce/disenos/plantilla1/seccion/producto/DetalleProducto.jsp?idIdioma=&idTienda=93&codProducto=888304022&cPath=1017

    ResponderEliminar
  19. Cuando tardaré en recibir mi pedido si lo he pedido hoy?

    ResponderEliminar
  20. Si la entrega es dentro de la peninsula, el miercoles, dado que el martes es festivo

    ResponderEliminar
  21. Una pregunta, en la protoboard que tengo yo, en cada extremo solo hay una línea horizontal en vez de dos (me refiero a las líneas que transportan voltaje y tierra), como funciona? La de abajo la conecto al voltaje y la de arriba a tierra o me tengo que comprar una como la del ejemplo?

    ResponderEliminar
  22. Correcto, en una conectas el positivo y en la otra el negativo de la alimentacion

    ResponderEliminar
  23. Arduino:1.6.11 (Mac OS X), Tarjeta:"Arduino/Genuino Uno"

    In file included from /Users/Pol/Documents/Arduino/libraries/DHT_sensor_library/DHT_U.cpp:22:0:
    /Users/Pol/Documents/Arduino/libraries/DHT_sensor_library/DHT_U.h:25:29: fatal error: Adafruit_Sensor.h: No such file or directory
    #include

    ^
    compilation terminated.
    Se encontraron múltiples librerías para "DHT.h"
    Usado: /Users/Pol/Documents/Arduino/libraries/DHT_sensor_library
    No usado: /Users/Pol/Documents/Arduino/libraries/DHT-sensor-library-master 2
    No usado: /Users/Pol/Documents/Arduino/libraries/DHT-sensor-library-master
    exit status 1
    Error compilación en tarjeta Arduino/Genuino Uno.

    Este reporte podría tener más información con
    "Mostrar salida detallada durante la compilación"
    opción habilitada en Archivo -> Preferencias.
    Me sale esto: Que hago???

    ResponderEliminar
  24. Del mensaje anterior sacamos dos conclusiones:

    1- Que en el sketch que hayas usado incluyes una libreria que no tienes instalada (la Adafruit_Sensor.h)
    2- Que en la carpeta de librerias tienes un "cacao" importante, repites librerias DHT con diferente nombre que no usas,...

    En resumen, haz limpieza en la carpeta de las librerias e instala correctamente la libreria de los sensores de Adafruit y las del DHT

    ResponderEliminar
  25. Que librerías tendría que tener instaladas para hacer este proyecto, solo la de "Librería Sensores DHT"?

    ResponderEliminar
    Respuestas
    1. Necesitas la libreria de los sensores DHT y la libreria de sensores de Adafruit, te dejo los enlaces:

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

      Eliminar
  26. Se podria hacer este proyecto sin usar la resistencia variable?

    ResponderEliminar
    Respuestas
    1. La resistencia variable es para ajustar el contraste del display, puedes usar tambien un potenciometro

      Eliminar
    2. Pero se podria hacer sin la resistencia variable? (solo con el sensor de humedad, la pantalla LCD y la resistencia del sensor de humedad)

      Eliminar
    3. Lo intento explicar de otra manera, la resistencia variable tiene como fin ajustar el contraste del LCD, si no la montas la pantalla tendrá tal nivel de brillo que no verás los datos mostrados y como el sketch usado no incluye monitor serial no tendrás forma de saber si funciona o no.

      Eliminar
  27. Que debo hacer si no se me ven los puntos negros? tengo la resistencia variable bien conectado (y ya lo he girado)

    ResponderEliminar
    Respuestas
    1. Lo primero es comprobar las conexiones una a una, ver que hay continuidad y que además cada pin del LCD esta conectado al pin correcto del Arduino y de la resistencia. ¿El LCD se ilumina, aunque no veas nada en él?

      Eliminar
    2. Lo dicho repasa conexiones y pineado.

      Eliminar
  28. Si al cargar el código a la placa me sale esto que debo hacer?

    Arduino:1.6.11 (Mac OS X), Tarjeta:"Arduino/Genuino Uno"

    El Sketch usa 6.024 bytes (18%) del espacio de almacenamiento de programa. El máximo es 32.256 bytes.
    Las variables Globales usan 326 bytes (15%) de la memoria dinámica, dejando 1.722 bytes para las variables locales. El máximo es 2.048 bytes.
    Ha ocurrido un error mientras se enviaba el sketch

    Este reporte podría tener más información con
    "Mostrar salida detallada durante la compilación"
    opción habilitada en Archivo -> Preferencias.

    ResponderEliminar
    Respuestas
    1. Sigue las instrucciones que aparecen en la parte inferior del mensajes que has copiado y envia el reporte completo del error

      Eliminar
  29. Muy bien explicados los pasos que debemos de dar para la correcta instalación y que no falle nada, me pongo cuando vuelva de almorzar porque lo tengo pendiente

    ResponderEliminar
  30. Tengo un problema. Me marca de 60 a 61º C y 1100-1200% de humedad. Podria estar quemado el sensor o el programa?

    ResponderEliminar
    Respuestas
    1. Puede deberse a muchos factores: sensor defectuoso, incorrecto conexionado, sketch incorrecto, habria que investigar

      Eliminar
  31. perfecto amigo, me gustaria incluirle un riego automatico dependiendo de la humedad de la planta, me podrais ayudar????

    ResponderEliminar
  32. funciona perfecto, intente hacerlo desde el esquema pero no funciono, luego desde el paso a paso y ahi si!.

    ResponderEliminar
  33. si quiero hacerlo con solo sensor de humedad y no de temperatura ???

    ResponderEliminar