- DHT11 - Especificación y funcionamiento
- Comunicación con el sensor DHT11
- Componentes necesarios
- Esquemático
- DHT11 con explicación del código PIC MPLABX
La medición de temperatura y humedad a menudo es útil en muchas aplicaciones como automatización del hogar, monitoreo del medio ambiente, estación meteorológica, etc. El sensor de temperatura más utilizado junto al LM35 es el DHT11; anteriormente hemos construido muchos proyectos DHT11 mediante la interfaz con Arduino, con Raspberry Pi y muchas otras placas de desarrollo. En este artículo, aprenderemos cómo conectar este DHT11 con PIC16F87A, que es un microcontrolador PIC de 8 bits. Usaremos este microcontrolador para leer los valores de Temperatura y Humedad usando DHT11 y mostrarlos en una pantalla LCD. Si es completamente nuevo en el uso de microcontroladores PIC, puede hacer uso de nuestra serie de tutoriales PIC para aprender a programar y usar el microcontrolador PIC. Dicho esto, comencemos.
DHT11 - Especificación y funcionamiento
El sensor DHT11 está disponible en forma de módulo o en forma de sensor. En este tutorial estamos usando el sensor, la única diferencia entre ambos es que en forma de módulo el sensor tiene un condensador de filtrado y una resistencia pull-up unida al pin de salida del sensor. Entonces, si está utilizando el módulo, no necesita agregarlos externamente. El DHT11 en forma de sensor se muestra a continuación.
El sensor DHT11 viene con una carcasa de color azul o blanco. Dentro de esta carcasa, tenemos dos componentes importantes que nos ayudan a sentir la humedad relativa y la temperatura. El primer componente es un par de electrodos; la resistencia eléctrica entre estos dos electrodos se decide mediante un sustrato que retiene la humedad. Entonces, la resistencia medida es inversamente proporcional a la humedad relativa del ambiente. Cuanto mayor sea la humedad relativa menor será el valor de resistencia y viceversa. Además, tenga en cuenta que la humedad relativa es diferente de la humedad real. La humedad relativa mide el contenido de agua en el aire en relación con la temperatura del aire.
El otro componente es un termistor NTC montado en superficie. El término NTC significa Coeficiente de temperatura negativo, por el aumento de temperatura el valor de resistencia disminuirá. La salida del sensor viene calibrada de fábrica y, por lo tanto, como programadores no debemos preocuparnos por calibrar el sensor. La salida del sensor dada por la comunicación 1-Wire, veamos el diagrama de pines y conexiones de este sensor.
El producto está en un paquete de una sola fila de 4 pines. El primer pin está conectado a través del VDD y el cuarto pin está conectado a través de GND. El segundo pin es el pin de datos, que se utiliza con fines de comunicación. Este pin de datos necesita una resistencia pull-up de 5k. Sin embargo, también se pueden usar otras resistencias pull-up como 4.7k a 10k. El tercer pin no está conectado con nada. Entonces se ignora.
La hoja de datos proporciona especificaciones técnicas, así como información de interfaz que se puede ver en la siguiente tabla:
La tabla anterior muestra el rango y la precisión de la medición de temperatura y humedad. Puede medir temperatura de 0 a 50 grados Celsius con una precisión de +/- 2 grados Celsius y humedad relativa de 20 a 90% de HR con una precisión de +/- 5% de HR. La especificación detallada se puede ver en la siguiente tabla.
Comunicación con el sensor DHT11
Como se mencionó anteriormente, para leer los datos de DHT11 con PIC tenemos que usar el protocolo de comunicación PIC one wire. Los detalles sobre cómo realizar esto se pueden entender en el diagrama de interfaz de DHT 11 que se puede encontrar en su hoja de datos, el mismo se muestra a continuación.
DHT11 necesita una señal de inicio de la MCU para iniciar la comunicación. Por lo tanto, cada vez que la MCU necesita enviar una señal de inicio al sensor DHT11 para solicitarle que envíe los valores de temperatura y humedad. Después de completar la señal de inicio, el DHT11 envía una señal de respuesta que incluye la información de temperatura y humedad. La comunicación de datos se realiza mediante el protocolo de comunicación de datos de bus único. La longitud total de los datos es de 40 bits y el sensor envía primero el bit de datos más alto.
Debido a la resistencia pull-up, la línea de datos siempre permanece en el nivel VCC durante el modo inactivo. La MCU debe reducir este voltaje de alto a bajo durante un intervalo mínimo de 18 ms. Durante este tiempo, el sensor DHT11 detecta la señal de inicio y el microcontrolador hace que la línea de datos sea alta durante 20-40us. Este tiempo de 20-40us se llama un período de espera donde el DHT11 comienza a responder. Después de este período de espera, DHT11 envía los datos a la unidad del microcontrolador.
Formato de datos del sensor DHT11
Los datos constan de partes decimales e integrales combinadas. El sensor sigue el siguiente formato de datos:
Datos de HR integral de 8 bits + datos de HR decimal de 8 bits + datos T integral de 8 bits + datos T decimal de 8 bits + suma de comprobación de 8 bits
Se pueden verificar los datos comprobando el valor de la suma de comprobación con los datos recibidos. Esto se puede hacer porque, si todo es correcto y si el sensor ha transmitido los datos correctos, entonces la suma de verificación debe ser la suma de “datos RH integrales de 8 bits + datos RHdatos decimales de 8 bits + datos T integrales de 8 bits + datos T decimales de 8 bits”.
Componentes necesarios
Para este proyecto, se requieren las siguientes cosas:
- Configuración de programación del microcontrolador PIC (8 bits).
- Tablero de circuitos
- Fuente de alimentación de 5V 500mA.
- Resistencia de 4,7 k 2 piezas
- Resistencia de 1k
- PIC16F877A
- Cristal de 20mHz
- Condensador 33pF 2 piezas
- LCD de 16x2 caracteres
- Sensor DHT11
- Cables de puente
Esquemático
El diagrama de circuito para interconectar DHT11 con PIC16F877A se muestra a continuación.
Hemos utilizado una pantalla LCD de 16x2 para mostrar los valores de temperatura y humedad que medimos desde DHT11. La pantalla LCD está interconectada en modo de 4 cables y tanto el sensor como la pantalla LCD están alimentados por una fuente de alimentación externa de 5V. He utilizado una placa de pruebas para realizar todas las conexiones necesarias y he utilizado un adaptador externo de 5V. También puede usar esta placa de fuente de alimentación de placa para alimentar su placa con 5V.
Una vez que el circuito está listo, todo lo que tenemos que hacer es cargar el código que se encuentra en la parte inferior de esta página y podemos comenzar a leer la temperatura y la humedad como se muestra a continuación. Si desea saber cómo se escribió el código y cómo funciona, lea más. También puede encontrar el funcionamiento completo de este proyecto en el video que se encuentra al final de esta página.
DHT11 con explicación del código PIC MPLABX
El código fue escrito usando MPLABX IDE y compilado usando el compilador XC8, ambos proporcionados por Microchip y son de descarga y uso gratuitos. Consulte los tutoriales básicos para comprender los conceptos básicos de la programación; a continuación, solo se describen las tres funciones importantes que se requieren para comunicarse con el sensor DHT11. Las funciones son:
void dht11_init (); void find_response (); char read_dht11 ();
La primera función se utiliza para la señal de inicio con dht11. Como se mencionó anteriormente, cada comunicación con DHT11 comienza con una señal de inicio, aquí la dirección del pin se cambia al principio para configurar el pin de datos como salida del microcontrolador. Luego, la línea de datos se baja y sigue esperando los 18 mS. Después de eso, el microcontrolador hace que la línea sea alta y sigue esperando hasta 30us. Después de ese tiempo de espera, el pin de datos se establece como entrada al microcontrolador para recibir los datos.
void dht11_init () { DHT11_Data_Pin_Direction = 0; // Configurar RD0 como salida DHT11_Data_Pin = 0; // RD0 envía 0 al sensor __delay_ms (18); DHT11_Data_Pin = 1; // RD0 envía 1 al sensor __delay_us (30); DHT11_Data_Pin_Direction = 1; // Configurar RD0 como entrada }
La siguiente función se utiliza para configurar un bit de verificación según el estado del pin de datos. Se utiliza para detectar la respuesta del sensor DHT11.
void find_response () { Check_bit = 0; __delay_us (40); si (DHT11_Data_Pin == 0) { __delay_us (80); si (DHT11_Data_Pin == 1) { Check_bit = 1; } __delay_us (50);} }
Finalmente, la función de lectura dht11; aquí los datos se leen en un formato de 8 bits donde los datos se devuelven usando la operación de desplazamiento de bits dependiendo del estado del pin de datos.
char read_dht11 () { char data, for_count; for (for_count = 0; for_count <8; for_count ++) { while (! DHT11_Data_Pin); __delay_us (30); if (DHT11_Data_Pin == 0) { datos & = ~ (1 << (7 - para_contento)); // Borrar bit (7-b) } else { data- = (1 << (7 - for_count)); // Establecer bit (7-b) while (DHT11_Data_Pin); } } devolver datos; }
Después de eso, todo se hace en la función principal. Primero, la inicialización del sistema se realiza donde la pantalla LCD se inicializa y la dirección del puerto de los pines LCD se establece en la salida. La aplicación se ejecuta dentro de la función principal.
void main () { system_init (); while (1) { __delay_ms (800); dht11_init (); find_response (); si (Check_bit == 1) { RH_byte_1 = read_dht11 (); RH_byte_2 = read_dht11 (); Temp_byte_1 = read_dht11 (); Temp_byte_2 = read_dht11 (); Suma = read_dht11 (); if (Suma == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { Humedad = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Temp:"); // lcd_puts (""); lcd_data (48 + ((Humedad / 10)% 10)); lcd_data (48 + (% de humedad 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Humedad:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48 + (RH% 10)); lcd_puts ("%"); } else { lcd_puts ("Error de suma de comprobación"); } } else { clear_screen (); lcd_com (0x80); lcd_puts ("¡¡¡Error !!!"); lcd_com (0xC0); lcd_puts ("Sin respuesta"); } __delay_ms (1000); } }
La comunicación con el sensor DHT11 se realiza dentro del tiempo bucle en el que se presente la señal de inicio al sensor. Después de eso, se activa la función find_response . Si Check_bit es 1, la comunicación adicional se lleva a cabo; de lo contrario, la pantalla LCD mostrará un cuadro de diálogo de error.
Dependiendo de los datos de 40 bits, read_dht11 se llama 5 veces (5 veces x 8 bits) y almacena los datos según el formato de datos proporcionado en la hoja de datos. El estado de suma de control también se comprueba y si se encuentran errores, también se notificará en la pantalla LCD. Finalmente, los datos se convierten y se transmiten a la pantalla LCD de 16x2 caracteres.
El código completo para esta medición de temperatura y humedad PIC se puede descargar desde aquí. Consulte también el video de demostración que se muestra a continuación.
Espero que haya entendido el proyecto y haya disfrutado construyendo algo útil. Si tiene alguna pregunta, déjela en la sección de comentarios a continuación o use nuestros foros para otras preguntas técnicas.