- DHT11 - Spesifikasjon og arbeid
- Kommuniserer med DHT11-sensor
- Nødvendige komponenter
- Skjematisk
- DHT11 med PIC MPLABX Kode forklaring
Måling av temperatur og fuktighet er ofte nyttig i mange applikasjoner som hjemmeautomatisering, miljøovervåking, værstasjon, etc. Den mest brukte temperatursensoren ved siden av LM35 er DHT11, vi har tidligere bygget mange DHT11-prosjekter ved å koble den sammen med Arduino, med Raspberry Pi og mange andre utviklingstavler. I denne artikkelen vil vi lære hvordan du kobler denne DHT11 til PIC16F87A, som er en 8-biters PIC-mikrokontroller. Vi vil bruke denne mikrokontrolleren til å lese verdiene for temperatur og fuktighet ved hjelp av DHT11 og vise den på en LCD-skjerm. Hvis du er helt ny med å bruke PIC-mikrokontrollere, kan du bruke PIC-opplæringsserien vår for å lære hvordan du programmerer og bruker PIC-mikrokontroller, når det er sagt, la oss komme i gang.
DHT11 - Spesifikasjon og arbeid
DHT11-sensoren er tilgjengelig enten i modulform eller i sensorform. I denne opplæringen bruker vi sensoren, den eneste forskjellen mellom begge er at sensoren i modulform har en filtreringskondensator og en opptrekksmotstand festet til utgangstappen til sensoren. Så hvis du bruker modulen, trenger du ikke legge dem til eksternt. DHT11 i sensorform er vist nedenfor.
DHT11-sensoren kommer med et blått eller hvitt fargeskjerm. Inne i dette foringsrøret har vi to viktige komponenter som hjelper oss å føle den relative fuktigheten og temperaturen. Den første komponenten er et par elektroder; den elektriske motstanden mellom disse to elektrodene bestemmes av et fuktighetsholdende substrat. Så den målte motstanden er omvendt proporsjonal med den relative fuktigheten i miljøet. Høyere den relative fuktigheten lavere vil være motstandsverdien og omvendt. Vær også oppmerksom på at relativ fuktighet er forskjellig fra faktisk fuktighet. Relativ fuktighet måler vanninnholdet i luften i forhold til temperaturen i luften.
Den andre komponenten er en overflatemontert NTC Thermistor. Begrepet NTC står for den negative temperaturkoeffisienten, for økningen i temperatur vil motstandsverdien synke. Utgangen til sensoren er kalibrert fra fabrikken, og derfor trenger vi ikke å bekymre oss for å kalibrere sensoren. Utgangen fra sensoren gitt av 1-ledningskommunikasjon, la oss se pinnen og tilkoblingsskjemaet til denne sensoren.
Produktet er i en 4-pins enkelradepakke. Første pin er koblet over VDD og den fjerde pin er koblet over GND. Den andre pinnen er datapinnen, som brukes til kommunikasjonsformål. Denne datapinnen trenger en opptrekksmotstand på 5k. Imidlertid kan andre trekke opp motstander som 4.7k til 10k også kan brukes. Den tredje pinnen er ikke koblet til noe. Så det blir ignorert.
Dataarket gir tekniske spesifikasjoner samt grensesnittinformasjon som kan sees i tabellen nedenfor -
Tabellen ovenfor viser måleområdet for temperatur og fuktighet og nøyaktighet. Den kan måle temperaturen fra 0-50 grader Celsius med en nøyaktighet på +/- 2 grad Celsius og relativ fuktighet fra 20-90% RF med en nøyaktighet på +/- 5% RF. Detaljspesifikasjonen kan sees i tabellen nedenfor.
Kommuniserer med DHT11-sensor
Som nevnt tidligere, for å lese dataene fra DHT11 med PIC, må vi bruke PIC en lednings kommunikasjonsprotokoll. Detaljene om hvordan du utfører dette kan forstås fra grensesnittdiagrammet til DHT 11 som du finner i databladet, det samme er gitt nedenfor.
DHT11 trenger et startsignal fra MCU for å starte kommunikasjonen. Derfor, hver gang MCU trenger å sende et startsignal til DHT11-sensoren for å be den sende verdiene for temperatur og fuktighet. Etter å ha fullført startsignalet sender DHT11 et svarsignal som inkluderer informasjon om temperatur og fuktighet. Datakommunikasjonen utføres av protokollen for enkeltbussdatakommunikasjon. Full datalengde er 40bit, og sensoren sender høyere databit først.
På grunn av opptrekksmotstanden forblir datalinjen alltid på VCC-nivå i hvilemodus. MCU må trekke ned denne spenningen høyt til lavt i et minimum spenn på 18 ms. I løpet av denne tiden oppdager DHT11-sensoren startsignalet, og mikrokontrolleren gjør datalinjen høy i 20-40us. Denne 20-40us tiden kalles en ventetid der DHT11 begynner å svare. Etter denne ventetiden sender DHT11 dataene til mikrokontrollerenheten.
DHT11 sensor DATA-format
Dataene består av desimal- og integrerte deler kombinert sammen. Sensoren følger dataformatet nedenfor -
8bit integrert RH data + 8bit desimal RH data + 8bit integrert T data + 8bit desimal T data + 8 bit kontrollsum.
Man kan verifisere dataene ved å sjekke kontrollsummen med mottatte data. Dette kan gjøres fordi, hvis alt er riktig, og hvis sensoren har overført riktige data, bør sjekksummen være summen av “8bit integral RH data + 8bit desimal RHdata + 8bit integral T data + 8bit decimal T data”.
Nødvendige komponenter
For dette prosjektet kreves det følgende:
- PIC mikrokontroller (8bit) programmeringsoppsett.
- Brettbrett
- 5V 500mA strømforsyningsenhet.
- 4,7 k motstand 2 stk
- 1k motstand
- PIC16F877A
- 20mHz krystall
- 33pF kondensator 2 stk
- 16x2 tegn LCD
- DHT11-sensor
- Jumper ledninger
Skjematisk
Kretsskjemaet for grensesnitt DHT11 med PIC16F877A er vist nedenfor.
Vi har brukt en 16x2 LCD for å vise temperatur- og fuktighetsverdiene som vi måler fra DHT11. LCD-skjermen er grensesnittet i 4-ledermodus, og både sensoren og LCD-en drives av en 5V ekstern strømforsyning. Jeg har brukt et brødbrett for å lage alle nødvendige tilkoblinger og har brukt en ekstern 5V-adapter. Du kan også bruke dette brødbrettens strømforsyningskort til å drive kortet ditt med 5V.
Når kretsen er klar, er alt vi trenger å gjøre å laste opp koden som er oppgitt nederst på denne siden, og vi kan begynne å lese temperatur og fuktighet som vist nedenfor. Hvis du vil vite hvordan koden ble skrevet og hvordan den fungerer, kan du lese videre. Du kan også finne fullstendig bearbeiding av dette prosjektet i videoen gitt nederst på denne siden.
DHT11 med PIC MPLABX Kode forklaring
Koden ble skrevet ved hjelp av MPLABX IDE og kompilert ved hjelp av XC8-kompilatoren som begge er levert av Microchip selv og er gratis å laste ned og bruke. Se de grunnleggende opplæringene for å forstå det grunnleggende ved programmering. Bare de tre viktige funksjonene som er nødvendige for å kommunisere med DHT11-sensoren blir diskutert nedenfor. Funksjonene er -
ugyldig dht11_init (); ugyldig find_response (); char read_dht11 ();
Den første funksjonen brukes til startsignalet med dht11. Som diskutert tidligere starter hver kommunikasjon med DHT11 med et startsignal, her endres pinretningen først for å konfigurere datapinnen som utgang fra mikrokontrolleren. Da trekkes datalinjen lavt og venter på 18mS. Etter det blir linjen igjen høy av mikrokontrolleren og venter i opptil 30us. Etter ventetiden ble datapinnen satt som inngang til mikrokontrolleren for å motta dataene.
ugyldig dht11_init () { DHT11_Data_Pin_Direction = 0; // Konfigurer RD0 som utgang 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 inngang }
Den neste funksjonen brukes til å sette opp en kontrollbit avhengig av datapinnestatus. Den brukes til å oppdage responsen fra DHT11-sensoren.
ugyldig find_response () { Check_bit = 0; __forsinkelse (40); hvis (DHT11_Data_Pin == 0) { __forsinker_us (80); hvis (DHT11_Data_Pin == 1) { Check_bit = 1; } __forsinkelse (50);} }
Endelig leser funksjonen dht11; her leses dataene inn i et 8-biters format der dataene returneres ved hjelp av bitskiftoperasjon avhengig av 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_count)); // Fjern bit (7-b) } annet { data- = (1 << (7 - for_count)); // Sett bit (7-b) mens (DHT11_Data_Pin); } } returner data; }
</s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s>
Etter det blir alt gjort inn i hovedfunksjonen. Først gjøres systeminitialiseringen der LCD-skjermen initialiseres og LCD-pinnens portretning er satt til utgangen. Programmet kjører inne i hovedfunksjonen
ugyldig hoved () { 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 (); Oppsummering = read_dht11 (); hvis (Summation == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { Fuktighet = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Temp:"); // lcd_puts (""); lcd_data (48 + ((Fuktighet / 10)% 10)); lcd_data (48 + (fuktighet% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Fuktighet:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48 + (RH% 10)); lcd_puts ("%"); } annet { lcd_puts ("Kontrollsumfeil"); } } annet { clear_screen (); lcd_com (0x80); lcd_puts ("Feil !!!"); lcd_com (0xC0); lcd_puts ("Ingen svar."); } __forsink_ms (1000); } }
Kommunikasjonen med DHT11-sensoren skjer inne i mens sløyfen der startsignalet sendes til sensoren. Etter det utløses find_response- funksjonen. Hvis Check_bit er 1, blir den videre kommunikasjonen utført ellers vil LCD-skjermen vise feildialog.
Avhengig av 40-biters data, blir read_dht11 kalt 5 ganger (5 ganger x 8bit) og lagret dataene i henhold til dataformatet gitt i databladet. Den sjekksum status er også sjekket, og hvis feil er funnet, vil det også gi beskjed i displayet. Til slutt konverteres dataene og overføres til LCD-skjermen på 16x2 tegn.
Komplett kode for denne PIC-temperaturen og fuktighetsmålingen kan lastes ned herfra. Sjekk også demonstrasjonsvideoen nedenfor.
Håper du forsto prosjektet og likte å bygge noe nyttig. Hvis du har spørsmål, la dem være i kommentarseksjonen nedenfor, eller bruk forumene våre for andre tekniske spørsmål.