- DHT11 - Especificació i funcionament
- Comunicació amb el sensor DHT11
- Components necessaris
- Esquema
- DHT11 amb explicació del codi PIC MPLABX
El mesurament de la temperatura i la humitat sol ser útil en moltes aplicacions com la domòtica, la supervisió del medi ambient, l’estació meteorològica, etc. El sensor de temperatura més utilitzat al costat de LM35 és el DHT11; prèviament hem construït molts projectes DHT11 mitjançant la interfície amb Arduino i Raspberry. Pi i moltes altres taules de desenvolupament. En aquest article, aprendrem a relacionar aquest DHT11 amb PIC16F87A, que és un microcontrolador PIC de 8 bits. Utilitzarem aquest microcontrolador per llegir els valors de temperatura i humitat mitjançant DHT11 i mostrar-lo en una pantalla LCD. Si sou completament nou en utilitzar microcontroladors PIC, podeu fer ús de la nostra sèrie de tutorials PIC per aprendre a programar i utilitzar el microcontrolador PIC, dit això, comencem.
DHT11 - Especificació i funcionament
El sensor DHT11 està disponible en forma de mòdul o en forma de sensor. En aquest tutorial estem utilitzant el sensor, l'única diferència entre tots dos és que, en forma de mòdul, el sensor té un condensador de filtratge i una resistència de tracció connectada al pin de sortida del sensor. Per tant, si esteu utilitzant el mòdul, no cal afegir-los externament. A continuació es mostra el DHT11 en forma de sensor.

El sensor DHT11 inclou una carcassa de color blau o blanc. Dins d’aquesta carcassa, tenim dos components importants que ens ajuden a percebre la humitat relativa i la temperatura. El primer component és un parell d’elèctrodes; la resistència elèctrica entre aquests dos elèctrodes la decideix un substrat que reté la humitat. Per tant, la resistència mesurada és inversament proporcional a la humitat relativa de l’ambient. Com més alta sigui la humitat relativa més baixa serà el valor de la resistència i viceversa. Tingueu en compte també que la humitat relativa és diferent de la humitat real. La humitat relativa mesura el contingut d'aigua a l'aire en relació amb la temperatura de l'aire.
L’altre component és un termistor NTC muntat a la superfície. El terme NTC significa el coeficient de temperatura negatiu, per a l’augment de temperatura el valor de la resistència disminuirà. La sortida del sensor està calibrada de fàbrica i, per tant, com a programador no ens hem de preocupar de calibrar el sensor. La sortida del sensor donada per la comunicació 1-Wire, vegem el pin i el diagrama de connexió d’aquest sensor.

El producte es troba en un paquet d’una sola fila de 4 pines. El primer pin està connectat a través del VDD i el quart pin està connectat a través del GND. El segon pin és el pin de dades, utilitzat amb finalitats de comunicació. Aquest pin de dades necessita una resistència de tracció de 5 k. Tanmateix, també es poden utilitzar resistències de tracció com 4.7k i 10k. El tercer pin no està connectat amb res. Per tant, s’ignora.
El full de dades proporciona especificacions tècniques i informació d’interfície que es pot veure a la taula següent:

La taula anterior mostra el rang i la precisió de mesurament de la temperatura i la humitat. Pot mesurar la temperatura de 0-50 graus centígrads amb una precisió de +/- 2 graus centígrads i la humitat relativa del 20-90% HR amb una precisió de +/- 5% HR. L'especificació detallada es pot veure a la taula següent.

Comunicació amb el sensor DHT11
Com es va esmentar anteriorment, per llegir les dades de DHT11 amb PIC hem d’utilitzar el protocol de comunicació PIC d’un cable. Els detalls sobre com fer-ho es poden comprendre a partir del diagrama d’interfície de DHT 11 que es pot trobar al seu full de dades, el mateix es dóna a continuació.

DHT11 necessita un senyal d’inici de l’MCU per iniciar la comunicació. Per tant, cada vegada que la MCU ha d’enviar un senyal d’inici al sensor DHT11 per sol·licitar-li que enviï els valors de temperatura i humitat. Després de completar el senyal d’inici, el DHT11 envia un senyal de resposta que inclou la informació de temperatura i humitat. La comunicació de dades es realitza mitjançant el protocol de comunicació de dades de bus únic. La longitud completa de les dades és de 40 bits i el sensor envia primer un bit de dades més alt.

A causa de la resistència de tracció, la línia de dades sempre es manté al nivell VCC durant el mode inactiu. La MCU ha de reduir aquest voltatge d’alç a baix durant un interval mínim de 18 ms. Durant aquest temps, el sensor DHT11 detecta el senyal d’inici i el microcontrolador fa que la línia de dades sigui alta durant 20-40us. Aquest temps de 20-40us s’anomena període d’espera en què el DHT11 comença a la resposta. Després d’aquest període d’espera, DHT11 envia les dades a la unitat de microcontroladors.
Format de dades del sensor DHT11
Les dades consten de parts decimals i integrals combinades entre si. El sensor segueix el format de dades següent:
Dades RH integrals de 8 bits + dades RH decimals de 8 bits + dades T de 8 bits integrals + dades T de 8 bits decimals + suma de comprovació de 8 bits.
Es poden verificar les dades comprovant el valor de suma de comprovació amb les dades rebudes. Això es pot fer perquè, si tot és correcte i si el sensor ha transmès dades adequades, la suma de comprovació hauria de ser la suma de "dades RH integrals de 8 bits + dades RH de 8 bits + dades T de 8 bits integrals + dades T de 8 bits decimals".
Components necessaris
Per a aquest projecte, a continuació es requereixen les coses -
- Configuració de programació de microcontrolador PIC (8 bits).
- Taula de pa
- Unitat d'alimentació 5V 500mA.
- Resistència de 4,7 k 2pcs
- 1k resistència
- PIC16F877A
- Cristall de 20 MHz
- Condensador de 33pF 2 unitats
- LCD de 16x2 caràcters
- Sensor DHT11
- Filferros de pont
Esquema
A continuació es mostra el diagrama de circuits per a la interfície de DHT11 amb PIC16F877A.

Hem utilitzat una pantalla LCD de 16x2 per mostrar els valors de temperatura i humitat que mesurem a partir de DHT11. La pantalla LCD té una interfície en mode de 4 fils i el sensor i la pantalla LCD s’alimenten amb una font d’alimentació externa de 5V. He utilitzat una placa de configuració per fer totes les connexions necessàries i he utilitzat un adaptador extern de 5V. També podeu utilitzar aquesta placa de subministrament d’alimentació per a taulers per alimentar la vostra placa amb 5V.

Un cop el circuit estigui llest, tot el que hem de fer és carregar el codi que es dóna a la part inferior d’aquesta pàgina i podem començar a llegir la temperatura i la humitat tal com es mostra a continuació. Si voleu saber com s’ha escrit el codi i com funciona, llegiu més. També podeu trobar el funcionament complet d’aquest projecte al vídeo que apareix al final d’aquesta pàgina.

DHT11 amb explicació del codi PIC MPLABX
El codi es va escriure amb MPLABX IDE i es va compilar amb el compilador XC8, proporcionat pel mateix Microchip i que es pot descarregar i utilitzar gratuïtament. Consulteu els tutorials bàsics per entendre els conceptes bàsics de la programació; a continuació, només es descriuen les tres funcions importants necessàries per comunicar-vos amb el sensor DHT11. Les funcions són:
buit dht11_init (); void find_response (); char read_dht11 ();
La primera funció s'utilitza per al senyal d'inici amb dht11. Com s’ha comentat anteriorment, cada comunicació amb DHT11 comença amb un senyal d’inici, aquí la direcció del pin es canvia al principi per configurar el pin de dades com a sortida del microcontrolador. A continuació, la línia de dades es baixa i continua esperant els 18mS. Després d'això, el microcontrolador augmenta la línia i continua esperant fins a 30us. Després d'aquest temps d'espera, el pin de dades es va configurar com a entrada al microcontrolador per rebre les dades.
void dht11_init () { DHT11_Data_Pin_Direction = 0; // Configureu RD0 com a sortida DHT11_Data_Pin = 0; // RD0 envia 0 al sensor __delay_ms (18); DHT11_Data_Pin = 1; // RD0 envia 1 al sensor __delay_us (30); DHT11_Data_Pin_Direction = 1; // Configura RD0 com a entrada }
La següent funció s'utilitza per configurar un bit de comprovació en funció de l'estat del pin de dades. S'utilitza per detectar la resposta del sensor DHT11.
void find_response () { Check_bit = 0; __delay_us (40); if (DHT11_Data_Pin == 0) { __delay_us (80); if (DHT11_Data_Pin == 1) { Check_bit = 1; } __delay_us (50);} }
Finalment, la funció de lectura dht11; aquí les dades es llegeixen en un format de 8 bits on es retornen les dades mitjançant l'operació de desplaçament de bits en funció de l'estat del pin de dades.
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) { data & = ~ (1 << (7 - for_count)); // Esborra el bit (7-b) } else { data- = (1 << (7 - for_count)); // Estableix el bit (7-b) mentre que (DHT11_Data_Pin); } } retornar dades; }
(…)
Després d'això, tot es converteix en la funció principal. En primer lloc, la inicialització del sistema es fa allà on s’inicialitza la pantalla LCD i la direcció del port dels pins LCD s’estableix a la sortida. L’aplicació s’executa dins de la funció principal
void main () { system_init (); mentre que (1) { __delay_ms (800); dht11_init (); find_response (); if (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)) { Humitat = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Temp:"); // lcd_puts (""); lcd_data (48 + ((Humitat / 10)% 10)); lcd_data (48 + (Humitat% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Humitat:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48 + (RH% 10)); lcd_puts ("%"); } else { lcd_puts ("Error de suma de verificació"); } } else { clear_screen (); lcd_com (0x80); lcd_puts ("Error !!!"); lcd_com (0xC0); lcd_puts ("Sense resposta"); } __delay_ms (1000); } }
La comunicació amb el sensor DHT11 es realitza dins de l' temps bucle en el qual es presenti el senyal d'inici a el sensor. Després, s'activa la funció find_response . Si Check_bit és 1, es realitzarà la comunicació posterior, en cas contrari, la pantalla LCD mostrarà el quadre de diàleg d'error.
Depenent de les dades de 40 bits, el read_dht11 es diu 5 vegades (5 vegades x 8 bits) i emmagatzema les dades segons el format de dades proporcionat al full de dades. També es comprova l'estat de la suma de comprovació i, si es detecten errors, també es notificarà a la pantalla LCD. Finalment, les dades es converteixen i es transmeten a la pantalla LCD de 16x2 caràcters.
El codi complet per a aquesta mesura de temperatura i humitat PIC es pot descarregar des d’aquí. Consulteu també el vídeo de demostració que es mostra a continuació.
Espero que hagueu entès el projecte i us hagi agradat construir alguna cosa útil. Si teniu alguna pregunta, deixeu-los a la secció de comentaris o utilitzeu els nostres fòrums per a altres qüestions tècniques.
