- DHT11 - Specificații și funcționare
- Comunicarea cu senzorul DHT11
- Componente necesare
- Schematic
- DHT11 cu explicația codului PIC MPLABX
Măsurarea temperaturii și a umidității este adesea utilă în multe aplicații, cum ar fi automatizarea casei, monitorizarea mediului, stația meteo etc. Cel mai popular senzor de temperatură utilizat lângă LM35 este DHT11, am construit anterior mai multe proiecte DHT11 prin interfață cu Arduino, cu Raspberry Pi și multe alte plăci de dezvoltare. În acest articol, vom învăța cum să interfațăm acest DHT11 cu PIC16F87A, care este un microcontroler PIC pe 8 biți. Vom folosi acest microcontroler pentru a citi valorile de temperatură și umiditate folosind DHT11 și îl vom afișa pe un ecran LCD. Dacă sunteți complet nou în utilizarea microcontrolerelor PIC, puteți folosi seria de tutoriale PIC pentru a afla cum să programați și să utilizați microcontrolerele PIC, ceea ce se spune, să începem.
DHT11 - Specificații și funcționare
Senzorul DHT11 este disponibil fie sub formă de modul, fie sub formă de senzor. În acest tutorial folosim senzorul, singura diferență dintre ambele este că în formă de modul senzorul are un condensator de filtrare și un rezistor de tracțiune atașat la pinul de ieșire al senzorului. Deci, dacă utilizați modulul, nu trebuie să le adăugați extern. DHT11 sub formă de senzor este prezentat mai jos.
Senzorul DHT11 vine cu o carcasă albastră sau albă. În interiorul acestei carcase avem două componente importante care ne ajută să simțim umiditatea relativă și temperatura. Prima componentă este o pereche de electrozi; rezistența electrică dintre acești doi electrozi este decisă de un substrat care menține umezeala. Deci rezistența măsurată este invers proporțională cu umiditatea relativă a mediului. Cu cât este mai mare umiditatea relativă mai mică va fi valoarea rezistenței și invers. De asemenea, rețineți că umiditatea relativă este diferită de umiditatea reală. Umiditatea relativă măsoară conținutul de apă din aer în raport cu temperatura din aer.
Cealaltă componentă este un termistor NTC montat la suprafață. Termenul NTC înseamnă coeficientul de temperatură negativ, pentru creșterea temperaturii valoarea rezistenței va scădea. Ieșirea senzorului este calibrată din fabrică și, prin urmare, ca programator, nu trebuie să ne facem griji cu privire la calibrarea senzorului. Ieșirea senzorului dată de comunicarea cu 1 fir, să vedem pinul și diagrama de conectare a acestui senzor.
Produsul este într-un pachet de 4 pini cu un singur rând. Primul pin este conectat pe VDD, iar cel de-al 4-lea pin este conectat pe GND. Al doilea pin este pinul de date, utilizat în scopuri de comunicare. Acest pin de date are nevoie de un rezistor pull-up de 5k. Cu toate acestea, pot fi utilizate și alte rezistențe care trag în sus, cum ar fi 4.7k la 10k. Al 3-lea pin nu este conectat cu nimic. Deci este ignorat.
Fișa tehnică oferă specificații tehnice, precum și informații de interfață care pot fi văzute în tabelul de mai jos.
Tabelul de mai sus arată intervalul și precizia măsurării temperaturii și umidității. Poate măsura temperatura de la 0-50 grade Celsius cu o precizie de +/- 2 grade Celsius și umiditatea relativă de la 20-90% HR cu o precizie de +/- 5% HR. Specificațiile detaliate pot fi văzute în tabelul de mai jos.
Comunicarea cu senzorul DHT11
După cum sa menționat mai devreme, pentru a citi datele de la DHT11 cu PIC trebuie să folosim protocolul de comunicație PIC cu un fir. Detaliile despre cum să efectuați acest lucru pot fi înțelese din diagrama de interfață a DHT 11 care poate fi găsită în foaia sa tehnică, aceleași fiind date mai jos.
DHT11 are nevoie de un semnal de pornire de la MCU pentru a începe comunicarea. Prin urmare, de fiecare dată când MCU trebuie să trimită un semnal de pornire către senzorul DHT11 pentru a solicita acestuia să trimită valorile de temperatură și umiditate. După finalizarea semnalului de pornire, DHT11 trimite un semnal de răspuns care include informații despre temperatură și umiditate. Comunicarea datelor se face prin protocolul de comunicație de date cu magistrală unică. Lungimea totală a datelor este de 40 de biți, iar senzorul trimite mai întâi un bit de date mai mare.
Datorită rezistenței de tracțiune, linia de date rămâne întotdeauna la nivelul VCC în modul inactiv. MCU trebuie să reducă această tensiune de la înalt la scăzut pentru un interval minim de 18 ms. În acest timp, senzorul DHT11 detectează semnalul de pornire, iar microcontrolerul ridică linia de date pentru 20-40us. Acest timp de 20-40us se numește perioadă de așteptare în care DHT11 începe la răspuns. După această perioadă de așteptare, DHT11 trimite datele către unitatea de microcontroler.
Format senzor DHT11 DATA
Datele constau din părți zecimale și integrale combinate împreună. Senzorul urmează formatul de date de mai jos -
Datele RH integrale de 8 biți + Datele RH zecimale de 8 biți + Datele T integrale de 8 biți + Datele T zecimale de 8 biți + Suma de control 8 biți
Se pot verifica datele verificând valoarea sumelor de control cu datele primite. Acest lucru se poate face pentru că, dacă totul este corect și dacă senzorul a transmis date adecvate, atunci suma de control ar trebui să fie suma de „date RH integrale de 8 biți + date RH zecimale de 8 biți + date T integrale de 8 biți + date T zecimale de 8 biți”.
Componente necesare
Pentru acest proiect, mai jos sunt necesare lucruri -
- Configurare programare microcontroler PIC (8 biți).
- Breadboard
- Unitate de alimentare 5V 500mA.
- 4.7k rezistor 2buc
- 1k rezistor
- PIC16F877A
- 20mHz cristal
- Condensator 33pF 2 buc
- LCD de 16x2 caractere
- Senzor DHT11
- Sârme de jumper
Schematic
Schema circuitului pentru interfața DHT11 cu PIC16F877A este prezentată mai jos.
Am folosit un ecran LCD de 16x2 pentru a afișa valorile de temperatură și umiditate pe care le măsurăm din DHT11. LCD-ul este interfațat în modul cu 4 fire și atât senzorul cât și LCD-ul sunt alimentate de o sursă de alimentare externă de 5V. Am folosit un panou pentru a face toate conexiunile necesare și am folosit un adaptor extern de 5V. Puteți utiliza, de asemenea, această placă de alimentare pentru panou de alimentare pentru a vă alimenta placa cu 5V.
Odată ce circuitul este gata, tot ce trebuie să facem este să încărcăm codul dat în partea de jos a acestei pagini și putem începe să citim Temperatura și Umiditatea așa cum se arată mai jos. Dacă doriți să știți cum a fost scris codul și cum funcționează, citiți mai departe. De asemenea, puteți găsi funcționarea completă a acestui proiect în videoclipul dat în partea de jos a acestei pagini.
DHT11 cu explicația codului PIC MPLABX
Codul a fost scris folosind MPLABX IDE și compilat folosind compilatorul XC8, ambele furnizate chiar de Microchip și este gratuit pentru descărcare și utilizare. Vă rugăm să consultați tutorialele de bază pentru a înțelege elementele de bază ale programării, doar cele trei funcții importante care sunt necesare pentru comunicarea cu senzorul DHT11 sunt discutate mai jos. Funcțiile sunt -
void dht11_init (); void find_response (); char read_dht11 ();
Prima funcție este utilizată pentru semnalul de pornire cu dht11. După cum sa discutat anterior, fiecare comunicare cu DHT11 începe cu un semnal de pornire, aici direcția pinului este modificată la început pentru a configura pinul de date ca ieșire de la microcontroler. Apoi, linia de date este scăzută și continuă să aștepte 18mS. După aceea, linia este ridicată de microcontroler și continuă să aștepte până la 30us. După acel timp de așteptare, pinul de date a fost setat ca intrare în microcontroler pentru a primi datele.
void dht11_init () { DHT11_Data_Pin_Direction = 0; // Configurați RD0 ca ieșire DHT11_Data_Pin = 0; // RD0 trimite 0 la senzorul __delay_ms (18); DHT11_Data_Pin = 1; // RD0 trimite 1 la senzorul __delay_us (30); DHT11_Data_Pin_Direction = 1; // Configurați RD0 ca intrare }
Următoarea funcție este utilizată pentru configurarea unui bit de verificare în funcție de starea pinului de date. Este folosit pentru a detecta răspunsul de la senzorul 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);} }
În cele din urmă, funcția de citire dht11; aici datele sunt citite într-un format de 8 biți în care datele sunt returnate utilizând operația de schimbare a biților în funcție de starea pinului de date.
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)); // Ștergeți bitul (7-b) } else { data- = (1 << (7 - for_count)); // Set bit (7-b) while (DHT11_Data_Pin); } } returnează date; }
(…)
După aceea, totul se face în funcția principală. În primul rând, inițializarea sistemului se face acolo unde LCD-ul este inițializat și direcția portului pinilor LCD este setată la ieșire. Aplicația rulează în interiorul funcției principale
void main () { system_init (); while (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)) { Umiditate = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Temp:"); // lcd_puts (""); lcd_data (48 + ((Umiditate / 10)% 10)); lcd_data (48 + (Umiditate% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Umiditate:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48 + (RH% 10)); lcd_puts ("%"); } else { lcd_puts ("Eroare sumă de verificare"); } } else { clear_screen (); lcd_com (0x80); lcd_puts ("Eroare !!!"); lcd_com (0xC0); lcd_puts ("Fără răspuns."); } __delay_ms (1000); } }
Comunicarea cu senzorul DHT11 se face în interiorul buclei while , unde semnalul de pornire este transmis senzorului. După aceea, se declanșează funcția find_response . Dacă Check_bit este 1, atunci se efectuează comunicarea ulterioară, altfel ecranul LCD va afișa dialogul de eroare.
În funcție de datele de 40 de biți, read_dht11 este apelat de 5 ori (de 5 ori x 8 biți) și stochează datele conform formatului de date furnizat în foaia de date. Statutul de control este, de asemenea, verificată și în cazul în care se constată erori, aceasta va notifica, de asemenea, în ecranul LCD. În cele din urmă, datele sunt convertite și transmise pe ecranul LCD de 16x2 caractere.
Codul complet pentru această măsurare a temperaturii și umidității PIC poate fi descărcat de aici. De asemenea, verificați videoclipul demonstrativ dat mai jos.
Sper că ați înțeles proiectul și v-a plăcut să construiți ceva util. Dacă aveți întrebări, lăsați-le în secțiunea de comentarii de mai jos sau folosiți forumurile noastre pentru alte întrebări tehnice.