- DHT11 - Specifikacija in delovanje
- Komunikacija s senzorjem DHT11
- Zahtevane komponente
- Shema
- DHT11 z razlago kode PIC MPLABX
Merjenje temperature in vlažnosti je pogosto uporabno v številnih aplikacijah, kot so avtomatizacija doma, spremljanje okolja, vremenska postaja itd. Najbolj priljubljen temperaturni senzor poleg LM35 je DHT11, že prej smo zgradili številne projekte DHT11, tako da smo ga povezali z Arduino in Raspberry Pi in številne druge razvojne plošče. V tem članku bomo izvedeli, kako povezati ta DHT11 s PIC16F87A, ki je 8-bitni mikrokrmilnik PIC. Ta mikrokrmilnik bomo uporabili za branje vrednosti temperature in vlažnosti z uporabo DHT11 in prikaz na LCD zaslonu. Če ste popolnoma novi pri uporabi mikrokrmilnikov PIC, lahko uporabite našo serijo vadnic PIC, če se želite naučiti programirati in uporabljati mikrokrmilnik PIC, kar pomeni, začnimo.
DHT11 - Specifikacija in delovanje
Senzor DHT11 je na voljo v obliki modula ali v obliki senzorja. V tej vadnici uporabljamo senzor, edina razlika med obema je v tem, da ima senzor v obliki modula filtrirni kondenzator in vlečni upor, pritrjen na izhodni zatič senzorja. Torej, če uporabljate modul, jih ni treba dodati zunaj. DHT11 v obliki senzorja je prikazan spodaj.
Senzor DHT11 ima modro ali belo barvno ohišje. Znotraj tega ohišja imamo dve pomembni komponenti, ki nam pomagata zaznati relativno vlažnost in temperaturo. Prva komponenta je par elektrod; električni upor med tema dvema elektrodama določa substrat, ki zadržuje vlago. Torej je izmerjena upornost obratno sorazmerna z relativno vlažnostjo okolja. Višja kot je relativna vlažnost zraka, bo vrednost upora in obratno. Upoštevajte tudi, da se relativna vlažnost razlikuje od dejanske. Relativna vlažnost meri vsebnost vode v zraku glede na temperaturo v zraku.
Druga komponenta je nadzemni NTC termistor. Izraz NTC pomeni negativni temperaturni koeficient, z zvišanjem temperature se bo vrednost upora zmanjšala. Izhod senzorja je tovarniško kalibriran, zato nam kot programerju ni treba skrbeti za kalibracijo senzorja. Izhod senzorja, ki ga daje 1-žična komunikacija, poglejmo shemo pinov in povezav tega senzorja.
Izdelek je v 4 vrstnem paketu z eno vrstico 1. zatič je povezan prek VDD, 4. zatič pa čez GND. Drugi zatič je podatkovni zatič, ki se uporablja za komunikacijo. Ta podatkovni zatič potrebuje upor 5K. Lahko pa se uporabijo tudi drugi upori, kot so 4,7 k do 10 k. 3. zatič ni povezan z ničemer. Torej se ignorira.
V obrazcu so tehnične specifikacije in informacije o povezavi, ki jih lahko vidite v spodnji tabeli -
Zgornja tabela prikazuje območje in natančnost merjenja temperature in vlažnosti. Lahko meri temperaturo od 0-50 stopinj Celzija z natančnostjo +/- 2 stopinj Celzija in relativno vlažnost od 20-90% relativne vlažnosti z natančnostjo +/- 5% relativne vlažnosti. Podrobna specifikacija je razvidna iz spodnje tabele.
Komunikacija s senzorjem DHT11
Kot smo že omenili, moramo za branje podatkov iz DHT11 s PIC uporabiti enožični komunikacijski protokol PIC. Podrobnosti o tem, kako to izvesti, je mogoče razumeti iz diagrama povezovanja DHT 11, ki ga najdete v njegovem obrazcu, enako je spodaj.
DHT11 potrebuje signal za zagon iz MCU za zagon komunikacije. Zato mora MCU vsakič poslati signal za zagon senzorju DHT11 in zahtevati, da pošlje vrednosti temperature in vlažnosti. Po zaključku zagonskega signala DHT11 pošlje odzivni signal, ki vključuje informacije o temperaturi in vlažnosti. Podatkovna komunikacija poteka z enim protokolom za podatkovno komunikacijo vodila. Celotna dolžina podatkov je 40 bitov in senzor najprej pošlje višji podatkovni bit.
Zaradi vlečnega upora podatkovna linija v načinu mirovanja vedno ostane na ravni VCC. MCU mora to napetost znižati visoko na najnižjo za najmanj 18 ms. V tem času senzor DHT11 zazna signal za zagon, mikrokrmilnik pa postavi podatkovno linijo visoko za 20-40us. Ta čas 20-40us se imenuje čakalna doba, ko se DHT11 začne odzivati. Po tej čakalni dobi DHT11 podatke pošlje v enoto mikrokrmilnika.
DHT11 Oblika podatkov senzorja
Podatki so sestavljeni iz decimalnih in sestavnih delov, združenih skupaj. Senzor sledi spodnji obliki podatkov -
8-bitni integrirani podatki RH + 8-bitni decimalni podatki RH + 8-bitni integrirani podatki T + 8-bitni decimalni podatki T + 8-bitna kontrolna vsota.
Podatke lahko preverite s preverjanjem vrednosti kontrolne vsote s prejetimi podatki. To je mogoče storiti, ker če je vse pravilno in če je senzor poslal ustrezne podatke, mora biti kontrolna vsota vsota "8-bitni integralni podatki RH + 8-bitni decimalni podatki RH + 8-bitni integralni podatki T + 8-bitni decimalni podatki T".
Zahtevane komponente
Za ta projekt so spodaj potrebne stvari -
- Nastavitev programiranja mikrokrmilnika PIC (8 bitov).
- Breadboard
- Napajalna enota 5V 500mA.
- 4.7k upor 2 kos
- 1k upor
- PIC16F877A
- Kristal 20mHz
- 33pF kondenzator 2 kos
- LCD z 16 x 2 znaki
- DHT11 senzor
- Jumper žice
Shema
Shema vezja za povezovanje DHT11 s PIC16F877A je prikazana spodaj.
Za prikaz temperatur in vlažnosti, ki jih merimo z DHT11, smo uporabili LCD 16x2. LCD je povezan v 4-žičnem načinu, senzor in LCD pa se napajata iz 5V zunanjega napajanja. Za izdelavo vseh zahtevanih povezav sem uporabil ploščo in uporabil zunanji 5V adapter. To napajalno ploščo lahko uporabite tudi za napajanje plošče s 5V.
Ko je vezje pripravljeno, moramo le naložiti kodo, navedeno na dnu te strani, in lahko začnemo brati temperaturo in vlažnost, kot je prikazano spodaj. Če želite vedeti, kako je bila koda napisana in kako deluje, preberite naprej. Celotno delovanje tega projekta najdete tudi v videoposnetku na dnu te strani.
DHT11 z razlago kode PIC MPLABX
Koda je bila napisana z uporabo MPLABX IDE in prevedena s pomočjo prevajalnika XC8, ki ga ponuja Microchip sam in ga lahko brezplačno prenesete in uporabite. Za razumevanje osnov programiranja si oglejte osnovne vadnice, spodaj so obravnavane le tri pomembne funkcije, ki so potrebne za komunikacijo s senzorjem DHT11. Funkcije so -
void dht11_init (); void find_response (); char read_dht11 ();
Prva funkcija se uporablja za signal zagona z dht11. Kot smo že omenili, se vsaka komunikacija z DHT11 začne s startnim signalom, pri čemer se najprej spremeni smer pin-a, da se podatkovni pin konfigurira kot izhod iz mikrokrmilnika. Nato se podatkovna črta potegne nizko in še naprej čaka na 18mS. Nato mikrokrmilnik spet postavi linijo visoko in čaka do 30us. Po tej čakalni dobi se podatkovni zatič nastavi kot vhod v mikrokrmilnik za sprejem podatkov.
void dht11_init () { DHT11_Data_Pin_Direction = 0; // Konfigurirajte RD0 kot izhod DHT11_Data_Pin = 0; // RD0 pošlje 0 senzorju __delay_ms (18); DHT11_Data_Pin = 1; // RD0 pošlje 1 senzorju __delay_us (30); DHT11_Data_Pin_Direction = 1; // Konfigurirajte RD0 kot vhodno }
Naslednja funkcija se uporablja za nastavitev kontrolnega bita, odvisno od stanja podatkovnega zatiča. Uporablja se za zaznavanje odziva senzorja DHT11.
void find_response () { Check_bit = 0; __zakasni_us (40); če (DHT11_Data_Pin == 0) { __delay_us (80); če (DHT11_Data_Pin == 1) { Check_bit = 1; } __delay_us (50);} }
Na koncu še funkcija branja dht11; tukaj se podatki berejo v 8-bitni format, kjer se podatki vrnejo z uporabo postopka premika bitov, odvisno od stanja podatkovnega zatiča.
char read_dht11 () { podatki char, za_število; for (for_count = 0; for_count <8; for_count ++) { while (! DHT11_Data_Pin); __zakasni_us (30); če (DHT11_Data_Pin == 0) { podatki & = ~ (1 << (7 - za_štetje)); // Počisti bit (7-b) } else { data- = (1 << (7 - za_štetje)); // Nastavimo bit (7-b) while (DHT11_Data_Pin); } } vrni podatke; }
U
Po tem se vse naredi v glavni funkciji. Najprej se izvede inicializacija sistema, kjer se LCD inicializira in smer vrat zatičev LCD nastavi na izhod. Aplikacija se izvaja znotraj glavne funkcije
void main () { system_init (); medtem ko (1) { __delay_ms (800); dht11_init (); find_response (); če (Check_bit == 1) { RH_byte_1 = read_dht11 (); RH_byte_2 = read_dht11 (); Temp_byte_1 = read_dht11 (); Temp_byte_2 = read_dht11 (); Vsota = read_dht11 (); če (Vsota == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { Vlažnost = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Temp:"); // lcd_puts (""); lcd_data (48 + ((Vlažnost / 10)% 10)); lcd_data (48 + (vlažnost% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Vlažnost:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48 + (RH% 10)); lcd_puts ("%"); } else { lcd_puts ("Napaka kontrolne vsote"); } } else { clear_screen (); lcd_com (0x80); lcd_puts ("Napaka !!!"); lcd_com (0xC0); lcd_puts ("Brez odgovora."); } __delay_ms (1000); } }
Komunikacija s senzorjem DHT11 poteka znotraj zanke while, kjer se senzor odda signal za zagon. Po tem se sproži funkcija find_response . Če je Check_bit 1, se izvede nadaljnja komunikacija, sicer se na LCD-prikazovalniku prikaže pogovorno okno z napako.
Odvisno od 40 -bitnih podatkov se read_dht11 pokliče 5-krat (5-krat x 8-bitna) in shrani podatke v skladu z obliko zapisa podatkov v obrazcu. Prav tako se preveri stanje kontrolne vsote in če se odkrijejo napake, se o tem obvesti tudi na LCD-prikazovalniku. Na koncu se podatki pretvorijo in prenesejo na LCD s 16 x 2 znaki.
Popolno kodo za to merjenje temperature in vlažnosti PIC lahko prenesete od tukaj. Oglejte si tudi spodnji predstavitveni video.
Upam, da ste projekt razumeli in uživali v gradnji nečesa koristnega. Če imate kakršna koli vprašanja, jih pustite v oddelku za komentarje spodaj ali uporabite naša forum za druga tehnična vprašanja.