- DHT11 - Specifikation og arbejde
- Kommunikation med DHT11-sensor
- Nødvendige komponenter
- Skematisk
- DHT11 med PIC MPLABX Kode forklaring
Måling af temperatur og fugtighed er ofte nyttig i mange applikationer som hjemmeautomatisering, miljøovervågning, vejrstation osv. Den mest populære brugte temperatursensor ved siden af LM35 er DHT11, vi har tidligere bygget mange DHT11-projekter ved at grænseflade til Arduino og Raspberry Pi og mange andre udviklingstavler. I denne artikel vil vi lære at interface denne DHT11 med PIC16F87A, som er en 8-bit PIC Microcontroller. Vi bruger denne mikrocontroller til at læse værdierne for temperatur og fugtighed ved hjælp af DHT11 og vise den på et LCD-display. Hvis du er helt ny med at bruge PIC-mikrocontrollere, kan du bruge vores PIC-tutorial-serie til at lære at programmere og bruge PIC-mikrocontroller, når det er sagt, lad os komme i gang.
DHT11 - Specifikation og arbejde
DHT11-sensoren fås enten i modulform eller i sensorform. I denne vejledning bruger vi sensoren, den eneste forskel mellem begge er, at sensoren i modulform har en filtreringskondensator og en pull-up-modstand fastgjort til sensorens udgangsstift. Så hvis du bruger modulet, behøver du ikke tilføje dem eksternt. DHT11 i sensorform er vist nedenfor.
DHT11-sensoren leveres med en blå eller hvid farvetarme. Inde i dette hus har vi to vigtige komponenter, der hjælper os med at registrere den relative fugtighed og temperatur. Den første komponent er et par elektroder; den elektriske modstand mellem disse to elektroder bestemmes af et fugtighedsholdende substrat. Så den målte modstand er omvendt proportional med miljøets relative fugtighed. Højere den relative fugtighed lavere vil være værdien af modstand og omvendt. Bemærk også, at relativ fugtighed er forskellig fra den faktiske fugtighed. Relativ fugtighed måler vandindholdet i luften i forhold til temperaturen i luften.
Den anden komponent er en overflademonteret NTC Thermistor. Udtrykket NTC står for den negative temperaturkoefficient, for temperaturstigningen falder modstandsværdien. Outputtet fra sensoren er fabrikskalibreret, og derfor behøver vi som programmerer ikke bekymre os om at kalibrere sensoren. Outputtet fra sensoren givet ved 1-ledningskommunikation, lad os se pin og forbindelsesdiagram for denne sensor.
Produktet er i en 4-polet enkeltpakke. 1. pin er forbundet over VDD og 4. pin er forbundet over GND. 2. pin er datapinnen, der bruges til kommunikationsformål. Denne datapind har brug for en pull-up-modstand på 5k. Imidlertid kan andre trække op modstande som 4.7k til 10k også bruges. Den 3. pin er ikke forbundet med noget. Så det ignoreres.
Dataarket indeholder tekniske specifikationer samt grænsefladesinformation, som kan ses i nedenstående tabel-
Ovenstående tabel viser måleområde for temperatur og fugtighed og nøjagtighed. Det kan måle temperatur fra 0-50 grader Celsius med en nøjagtighed på +/- 2 grad Celsius og relativ fugtighed fra 20-90% RH med en nøjagtighed på +/- 5% RH. Detaljespecifikationen kan ses i nedenstående tabel.
Kommunikation med DHT11-sensor
Som nævnt tidligere er vi nødt til at bruge PIC en lednings kommunikationsprotokol for at læse data fra DHT11 med PIC. Detaljerne om, hvordan man udfører dette, kan forstås fra grænsefladeschemaet for DHT 11, som kan findes i dets datablad, det samme er givet nedenfor.
DHT11 har brug for et startsignal fra MCU'en for at starte kommunikationen. Derfor skal MCU'en hver gang sende et startsignal til DHT11-sensoren for at bede den om at sende værdierne for temperatur og fugtighed. Efter at have afsluttet startsignalet sender DHT11 et svarsignal, der inkluderer information om temperatur og fugtighed. Datakommunikationen udføres ved hjælp af single bus datakommunikationsprotokollen. Den fulde datalængde er 40bit, og sensoren sender først højere databit.
På grund af pull-up-modstanden forbliver datalinjen altid på VCC-niveau i inaktiv tilstand. MCU'en er nødt til at trække denne spænding ned til høj i et minimum på 18 ms. I løbet af denne tid registrerer DHT11-sensoren startsignalet, og mikrocontrolleren gør datalinjen høj i 20-40us. Denne 20-40us tid kaldes en ventetid, hvor DHT11 begynder at svare. Efter denne venteperiode sender DHT11 dataene til mikrocontrollerenheden.
DHT11-sensor DATA-format
Dataene består af decimaler og integrerede dele kombineret. Sensoren følger nedenstående dataformat -
8 bit integreret RH-data + 8 bit decimal RH-data + 8 bit integreret T-data + 8 bit decimal T-data + 8 bit kontrolsum.
Man kan verificere dataene ved at kontrollere kontrolsummen med de modtagne data. Dette kan gøres, fordi hvis alt er korrekt, og hvis sensoren har transmitteret korrekte data, så skal kontrolsummen være summen af “8bit integreret RH-data + 8bit decimal RHdata + 8bit integreret T-data + 8bit decimal T-data”.
Nødvendige komponenter
For dette projekt kræves nedenstående ting -
- PIC-mikrocontroller (8bit) programmeringsopsætning.
- Brødbræt
- 5V 500mA strømforsyning.
- 4,7 k modstand 2 stk
- 1k modstand
- PIC16F877A
- 20mHz krystal
- 33pF kondensator 2 stk
- 16x2 tegn LCD
- DHT11-sensor
- Jumper ledninger
Skematisk
Kredsløbsdiagrammet til grænseflade mellem DHT11 og PIC16F877A er vist nedenfor.
Vi har brugt en 16x2 LCD til at vise de temperatur- og fugtighedsværdier, som vi måler fra DHT11. LCD'et er grænseflade i 4-leder tilstand, og både sensoren og LCD'et drives af en 5V ekstern strømforsyning. Jeg har brugt et brødbræt til at foretage alle de nødvendige forbindelser og har brugt en ekstern 5V-adapter. Du kan også bruge dette breadboard strømforsyningskort til at tænde dit board med 5V.
Når kredsløbet er klart, er alt, hvad vi skal gøre, at uploade koden, der er angivet nederst på denne side, og vi kan begynde at læse temperaturen og fugtigheden som vist nedenfor. Hvis du vil vide, hvordan koden blev skrevet, og hvordan den fungerer, kan du læse videre. Du kan også finde det komplette arbejde med dette projekt i videoen, der er vist nederst på denne side.
DHT11 med PIC MPLABX Kode forklaring
Koden blev skrevet ved hjælp af MPLABX IDE og kompileret ved hjælp af XC8-kompilatoren, som begge leveres af Microchip selv og er gratis at downloade og bruge. Se de grundlæggende vejledninger for at forstå det grundlæggende ved programmering. Kun de tre vigtige funktioner, der er nødvendige for at kommunikere med DHT11-sensoren, diskuteres nedenfor. Funktionerne er -
ugyldigt dht11_init (); ugyldigt find_response (); char read_dht11 ();
Den første funktion bruges til startsignalet med dht11. Som diskuteret før starter enhver kommunikation med DHT11 med et startsignal, her ændres pinretningen først for at konfigurere datapinnen som output fra mikrocontrolleren. Derefter trækkes datalinjen lavt og venter på 18mS. Derefter laves linjen igen højt af mikrocontrolleren og venter på op til 30us. Efter denne ventetid indstilles datapinnen som input til mikrocontrolleren for at modtage dataene.
ugyldigt dht11_init () { DHT11_Data_Pin_Direction = 0; // Konfigurer RD0 som output DHT11_Data_Pin = 0; // RD0 sender 0 til sensoren __forsink_ms (18); DHT11_Data_Pin = 1; // RD0 sender 1 til sensoren __delay_us (30); DHT11_Data_Pin_Direction = 1; // Konfigurer RD0 som input }
Den næste funktion bruges til at indstille en kontrolbit afhængigt af datapinnestatus. Det bruges til at detektere svaret fra DHT11-sensoren.
ugyldigt find_response () { Check_bit = 0; __forsinkelse (40); hvis (DHT11_Data_Pin == 0) { __forsinket_us (80); hvis (DHT11_Data_Pin == 1) { Check_bit = 1; } __forsinkelse (50);} }
Endelig læser funktionen dht11; her læses dataene i et 8-bit format, hvor dataene returneres ved hjælp af bit shift-operation afhængigt af datapinnestatus.
char read_dht11 () { char data, for_count; for (for_count = 0; for_count <8; for_count ++) { mens (! DHT11_Data_Pin); __forsinkelse (30); hvis (DHT11_Data_Pin == 0) { data & = ~ (1 << (7 - for_tælling)); // Ryd bit (7-b) } andet { data- = (1 << (7 - for_count)); // Indstil bit (7-b) mens (DHT11_Data_Pin); } } returner data }
</s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s>
Derefter gøres alt til hovedfunktionen. Først foretages systeminitialiseringen, hvor LCD'et initialiseres, og LCD-stifternes portretning indstilles til udgangen. Applikationen kører inde i hovedfunktionen
ugyldig main () { system_init (); mens (1) { __forsink_ms (800); dht11_init (); find_response (); hvis (Check_bit == 1) { RH_byte_1 = read_dht11 (); RH_byte_2 = read_dht11 (); Temp_byte_1 = read_dht11 (); Temp_byte_2 = read_dht11 (); Summation = read_dht11 (); hvis (Summation == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { Fugtighed = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Temp:"); // lcd_puts (""); lcd_data (48 + ((Fugtighed / 10)% 10)); lcd_data (48 + (fugtighed% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Fugtighed:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48 + (RH% 10)); lcd_puts ("%"); } andet { lcd_puts ("Fejl i kontrolsum"); } } andet { clear_screen (); lcd_com (0x80); lcd_puts ("Fejl !!!"); lcd_com (0xC0); lcd_puts ("Intet svar."); } __forsink_ms (1000); } }
Kommunikationen med DHT11-sensoren foregår inde i while- sløjfen, hvor startsignalet sendes til sensoren. Derefter udløses find_response- funktionen. Hvis Check_bit er 1, udføres den videre kommunikation, ellers viser LCD-displayet fejldialog.
Afhængig af 40bit-data kaldes read_dht11 5 gange (5 gange x 8bit) og gemmes dataene i henhold til dataformatet, der er angivet i databladet. Den checksum status er også kontrolleret, og, hvis der konstateres fejl, vil det også give på LCD. Endelig konverteres dataene og transmitteres til LCD-displayet på 16x2 tegn.
Komplet kode til denne PIC-måling af temperatur og fugtighed kan downloades herfra. Se også demonstrationsvideoen nedenfor.
Håber du forstod projektet og nød at bygge noget nyttigt. Hvis du har spørgsmål, skal du lade dem være i kommentarfeltet nedenfor eller bruge vores fora til andre tekniske spørgsmål.