Descripción
El sensor DHT11 es capaz de realizar mediciones de humedad relativa y temperatura con un costo muy bajo. A pesar de no ser la opción mas precisa del mercado, es ideal cuando el costo es una preocupación y por lo tanto funciona de maravilla para las aplicaciones experimentales, escolares y de hobby.
El DHT11 no requiere pines analógicos, pues entrega la información a través de una interfaz serial propietaria (similar a 1-wire), aunque hay que tomar en cuenta que se requiere ser preciso en los tiempos de las señales para lograr una comunicación confiable con el sensor.
Existen librerías en el ecosistema de Arduino que permiten una fácil integración en cualquier proyecto por lo tanto el DHT11 se ha vuelto un componente muy popular.
Si se desean mejores características en cuanto a precisión, rango y velocidad, el sensor DHT22 es recomendable como sustituto de este componente.
Características y especificaciones
- Modelo: DHT11
- Marca: ASAIR (AOSONG)
- Tipo de sensor: temperatura, humedad relativa
- Principio de funcionamiento: termistor, sensor de humedad capacitivo
- Voltaje de alimentación: 3.5 a 5.5 VDC
- Corriente típica en operación: 300 uA
- Corriente típica en reposo: 60 uA
- Especificaciones de sensor de humedad:
- Rango: 20 a 90 % RH
- Resolución: 16 bits
- Precisión: ± 5% RH (a 25 °C)
- Especificaciones de sensor de temperatura:
- Rango: 0 a 50 °C
- Resolución: 16 bits
- Precisión: ± 2 °C
- Frecuencia de muestreo: 1 vez cada dos segundos (0.5 Hz)
- Conector: 4 pines con espaciado de 0.1 pulgadas
- Interfaz: 4 conexiones
- VDD
- DATA
- NC
- GND
- Peso: 2.7 gramos
- Dimensiones
- Largo: 15.5 mm
- Ancho: 12 mm
- Alto: 5.5 mm
¿Qué es el DHT11?
El sensor DHT11 es un componente electrónico que permite medir humedad relativa y temperatura ambiente. Su funcionamiento está basado internamente en un termistor para medir temperatura y un material cuya capacitancia cambia dependiendo de la humedad en el ambiente (sensor capacitivo).
El sensor integra un convertidor analógico a digital (ADC) en su interior, por lo que aquellos microcontroladores y microprocesadores que no dispongan de un ADC podrán tomar mediciones con este sensor sin requerir hardware adicional. La entrega de la medición a otros circuitos se realiza mediante una interfaz serial digital.
¿Cómo funciona el sensor de humedad DHT11?
Internamente el DHT11 tiene dos componentes que permiten la medición: Un termistor y una membrana cuya capacitancia cambia con la humedad. También incorpora un ASIC que se encarga de transformar las magnitudes analógicas en señales digitales.
Para poder utilizar el DHT11 es indispensable conocer cómo funciona su protocolo de comunicación. A pesar de que puede parecer complejo, las librerías de Arduino implementan internamente el protocolo y nos permiten ahorrar mucho trabajo de programación.
El DHT11 no utiliza una interfaz serial estándar como I2C, SPI o 1Wire (en realidad utiliza algo similar a esta último). En cambio requiere su propio protocolo para comunicarse a través de un solo hilo. Afortunadamente el protocolo de comunicación del sensor DHT11 es simple y puede implementarse tranquilamente usando los pines de I/O en un Arduino.
Inicio de la comunicación
El microcontrolador debe iniciar la comunicación con el DHT11 manteniendo la línea de datos en estado bajo durante al menos 18 ms. Luego el DHT11 envía una respuesta con un pulso a nivel bajo (para indicar su presencia) de 80 uS y luego deja “flotar” la línea de datos por otros 80 uS.
En la figura de abajo se observa el inicio de la comunicación con el sensor DHT11. El pulso de inicio enviado por el microcontrolador esta marcado en rojo, mientras que la respuesta desde el sensor esta marcada en azul.
Codificación de bits
La codificación de datos esta basada en un esquema de ancho de pulso (se toma en cuenta el ancho del estado alto): Un pulso ancho representa un 1 lógico, un pulso corto representa un 0 lógico. Todos los bits comienzan con un pulso bajo de 50 uS. Las librerías de comunicación con el DHT11 aprovechan este pulso para la sincronización. Luego viene un pulso alto que varía según el estado lógico o el valor del bit que el DHT11 desea transmitir:
- Se utilizan pulsos de 26-28 microsegundos para un “0”
- Se utilizan pulsos de 70 microsegundos para un “1”
Significado de los bits transmitidos
En la siguiente ilustración observamos el inicio de una comunicación con el DHT11 o DHT22, resumiendo lo que hemos hablado con anterioridad: Una transmisión completa comienza como ya describimos y se compone de 40 bits (5 bytes) que incluyen todos los datos que el sensor puede proporcionar. En cuanto a los datos que se transmiten, su interpretación es como sigue:
- El primer byte que recibimos es la parte entera de la humedad relativa (RH).
- El segundo byte es la parte decimal de la humedad relativa (no se utiliza en el DHT11, siempre es 0).
- El tercer byte es la parte entera de la temperatura.
- El cuarto byte es la parte decimal de la temperatura (no se utiliza en el DHT11, siempre es 0).
- El último byte es la suma de comprobación (checksum), resultante de sumar todos los bytes anteriores.
Pinout o distribución de pines
La distribución de los pines en el sensor se muestra en la siguiente imagen:
Existen distintas variantes de módulos en el mercado (sensores montados en PCB). Recomendamos que revises las indicaciones en cada modelo de PCB para evitar daños al sensor. Normalmente si el sensor viene montado en un PCB, ya no será necesario agregar una resistencia pull-up externa.
Datasheet u hoja de datos
El documento “oficial” donde se describe la funcionalidad del sensor DHT11 es su hoja de datos o datasheet. Podemos descargar dicho documento en el siguiente enlace.
Tutorial sensor de humedad y temperatura DHT11 con Arduino
En esta sección te explicaremos cómo poner en marcha el sensor DHT11. Se incluyen datos sobre el funcionamiento, la conexión y programación (código) del sensor bajo la plataforma Arduino.
¿Cómo conectar el sensor DHT11 con Arduino?
La conexión del sensor DHT11 con Arduino es sencilla, solamente se requieren 3 hilos y algunos componentes externos. Las conexiones a realizar son:
- VCC – Alimentación de 5 volts
- GND – Tierra o común del circuito
- SIGNAL – Señal de datos con protocolo de un hilo
Es importante mencionar que el pin correspondiente a la señal de datos debe llevar una resistencia pull-up.
Cabe aclarar que podemos utilizar cualquier otro pin para la señal de datos, nosotros hemos elegido utilizar el 12, pero puede funcionar con cualquier otro.
Prácticas y código de ejemplo
Los materiales necesarios para realizar las prácticas en esta página son los siguientes:
- Arduino UNO R3 o tarjeta compatible con Arduino Uno
- DHT11 sensor de humedad y temperatura
- Cables tipo dupont
- Protoboard de 400 puntos o protoboard de 830 puntos
Para poder compilar el código, es necesario descargar e instalar la librería DHT de Adafruit. En concreto se requiere la versión 1.2.3 que puedes encontrar en los siguientes enlaces:
Programa básico para mostrar temperatura y humedad en el monitor serial
Este programa permite validar el funcionamiento del sensor DHT11, el resultado de las mediciones es arrojado directamente al monitor serie de Arduino a través de la conexión USB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | /** Geek Factory - "Dale vuelo a tus proyectos" Tienda de electrónica, Arduino, Raspberry Pi, IoT www.geekfactory.mx GEEK FACTORY INVIERTE TIEMPO Y RECURSOS EN DESARROLLAR ESTOS EJEMPLOS Y TUTORIALES. SI ENCUENTRAS ÚTIL ESTE CÓDIGO, CONSIDERA REALIZAR UNA COMPRA CON NOSOTROS. EJEMPLO SENSOR DE HUMEDAD Y TEMPERATURA DHT11 1 Descripción: Realiza la medición de temperatura y humedad con un sensor DHT11. El resultado se muestra en el monitor serial. Este ejemplo utiliza la librería DHT de Adafruit, que deberá estar instalalda en nuestro IDE para que pueda compilar de forma satisfactoria. */ // incluir la librería en nuestro programa #include <DHT.h> // constructor del objeto dhtsensor recibe el pin en el que se conecta el sensor // y también una constante que define el tipo de sensor que conectaremos // en nuestro caso el sensor estará conectado al pin 12 y será un DHT11 DHT dhtsensor(12, DHT11); /** Función setup: se ejecuta una vez cuando encendemos el arduino */ void setup() { // preparar la comunicación serial Serial.begin(115200); // mostrar mensaje inicial Serial.println(F("----------------------------------------------------")); Serial.println(F(" EJEMPLO SENSOR DE HUMEDAD DHT11 CON ARDUINO ")); Serial.println(F(" https://www.geekfactory.mx ")); Serial.println(F("----------------------------------------------------")); // preparar la librería para comunicarse con el sensor dhtsensor.begin(); } /** Función loop: se ejecuta continuamente mientras el arduino permanece encendido */ void loop() { // esperar entre mediciones, es necesario para el buen funcionamiento del sensor delay(2000); // leer la humedad utilizando la función readHumidity() y la temperatura // con readTemperature(), almacenamos los resultados en variables (h y t) float h = dhtsensor.readHumidity(); float t = dhtsensor.readTemperature(); // revisar que tengamos valores numéricos válidos // si la comunicación falla, no será así y podemos detectar un error if (isnan(h) || isnan(t)) { Serial.println(F("Falla al leer el sensor DHT11!")); // volver al inicio del loop() return; } // imprimir la humedad y temperatura medida al monitor serial Serial.print(F("Humedad: ")); Serial.print(h); Serial.print(F(" % ")); Serial.print(F("Temperatura: ")); Serial.print(t); Serial.println(" *C"); } |
Programa para mostrar humedad y temperatura en display LCD 16×2
Este programa es muy similar al anterior, pero muestra la información leída desde el sensor en una pantalla LCD de 16x 2 caracteres.
Las conexiones de la pantalla deben realizarse como se muestra en la página del display LCD 16×2.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 | /** Geek Factory - "Dale vuelo a tus proyectos" Tienda de electrónica, Arduino, Raspberry Pi, IoT www.geekfactory.mx GEEK FACTORY INVIERTE TIEMPO Y RECURSOS EN DESARROLLAR ESTOS EJEMPLOS Y TUTORIALES. SI ENCUENTRAS ÚTIL ESTE CÓDIGO, CONSIDERA REALIZAR UNA COMPRA CON NOSOTROS. EJEMPLO SENSOR DE HUMEDAD Y TEMPERATURA DHT11 2 Descripción: Realiza la medición de temperatura y humedad con un sensor DHT11. El resultado se muestra en una pantalla LCD de 16x2 caracteres. La pantalla LCD 16x2 debe ser conectada de acuerdo a nuestro tutorial de Display LCD 16x2 con Arduino. Este ejemplo utiliza la librería DHT de Adafruit, que deberá estar instalalda en nuestro IDE para que pueda compilar de forma satisfactoria. */ // incluir la librería en nuestro programa #include <DHT.h> #include <LiquidCrystal.h> // constructor del objeto dhtsensor recibe el pin en el que se conecta el sensor // y también una constante que define el tipo de sensor que conectaremos // en nuestro caso el sensor estará conectado al pin 12 y será un DHT11 DHT dhtsensor(12, DHT11); // constructor de la clase LiquidCrystal, se crea un objeto llamado "lcd" para // poder acceder a la funcionalidad de la pantalla y escribir texto LiquidCrystal lcd(7, 6, 5, 4, 3, 2); /** Función setup: se ejecuta una vez cuando encendemos el arduino */ void setup() { // indicar a la librería que tenemos conectada una pantalla de 16x2 lcd.begin(16, 2); // preparar la librería para comunicarse con el sensor DHT11 dhtsensor.begin(); // mover el cursor a la primera posición de la pantalla (0,0) // y al mismo tiempo borramos su contenido lcd.clear(); // imprimir otra cadena en la posición actual del cursor lcd.print(" GEEKFACTORY "); } /** Función loop: se ejecuta continuamente mientras el arduino permanece encendido */ void loop() { // esperar entre mediciones, es necesario para el buen funcionamiento del sensor delay(2000); // leer la humedad utilizando la función readHumidity() y la temperatura // con readTemperature(), almacenamos los resultados en variables (h y t) float h = dhtsensor.readHumidity(); float t = dhtsensor.readTemperature(); // borrar la pantalla lcd lcd.clear(); // revisar que tengamos valores numéricos válidos // si la comunicación falla, no será así y podemos detectar un error if (isnan(h) || isnan(t)) { lcd.print(F("Error de")); lcd.setCursor (0, 1); lcd.print(F("comunicacion")); // volver al inicio del loop() return; } // imprimir la humedad en LCD lcd.print(F("H: ")); lcd.print(h); lcd.print(F(" % ")); // y la temperatura lcd.setCursor (0, 1); lcd.print(F("T: ")); lcd.print(t); lcd.println(" *C"); } |
Valoraciones
No hay valoraciones aún.