- DHT11 - Specifikation och arbete
- Kommunicerar med DHT11-sensorn
- Nödvändiga komponenter
- Schematisk
- DHT11 med PIC MPLABX-kodförklaring
Mätning av temperatur och luftfuktighet är ofta användbart i många applikationer som hemautomation, miljöövervakning, väderstation etc. Den mest populära temperatursensorn bredvid LM35 är DHT11, vi har tidigare byggt många DHT11-projekt genom att koppla ihop den med Arduino, med Raspberry Pi och många andra utvecklingskort. I den här artikeln kommer vi att lära oss hur man gränssnitt denna DHT11 med PIC16F87A som är en 8-bitars PIC Microcontroller. Vi kommer att använda denna mikrokontroller för att läsa värdena för temperatur och luftfuktighet med DHT11 och visa den på en LCD-skärm. Om du är helt ny med att använda PIC-mikrokontroller kan du använda vår PIC-handledningsserie för att lära dig att programmera och använda PIC-mikrokontroller, som sagt, låt oss komma igång.
DHT11 - Specifikation och arbete
DHT11-sensorn finns antingen i modulform eller i sensorform. I denna handledning använder vi sensorn, den enda skillnaden mellan de båda är att sensorn i modulform har en filtreringskondensator och ett uppdragningsmotstånd anslutet till sensorns utgångsstift. Så om du använder modulen behöver du inte lägga till dem externt. DHT11 i sensorform visas nedan.
DHT11-sensorn har ett blått eller vitt hölje. Inuti detta hölje har vi två viktiga komponenter som hjälper oss att känna av den relativa fuktigheten och temperaturen. Den första komponenten är ett par elektroder; det elektriska motståndet mellan dessa två elektroder bestäms av ett fukthållande substrat. Så det uppmätta motståndet är omvänt proportionellt mot den relativa fuktigheten i miljön. Högre relativ luftfuktighet lägre blir värdet på motståndet och tvärtom. Observera också att relativ luftfuktighet skiljer sig från faktisk luftfuktighet. Relativ fuktighet mäter vattenhalten i luften i förhållande till temperaturen i luften.
Den andra komponenten är en ytmonterad NTC Thermistor. Termen NTC står för den negativa temperaturkoefficienten, för temperaturökningen kommer motståndets värde att minska. Utgången från sensorn är fabrikskalibrerad och därför behöver vi inte som programmerare oroa oss för att kalibrera sensorn. Utgången från sensorn ges av 1-trådskommunikation, låt oss se stift och anslutningsdiagram för denna sensor.
Produkten är i ett 4-poligt paket med en rad. Första stiftet är anslutet över VDD och det fjärde stiftet är anslutet över GND. Den andra stiftet är datapinnen som används för kommunikationsändamål. Denna datapinne behöver ett dragmotstånd på 5k. Andra kan dock dra upp motstånd som 4.7k till 10k kan också användas. Den tredje stiftet är inte ansluten till någonting. Så det ignoreras.
Databladet innehåller tekniska specifikationer samt gränssnittsinformation som kan ses i nedanstående tabell-
Ovanstående tabell visar mätområde för temperatur och luftfuktighet och noggrannhet. Den kan mäta temperaturen från 0-50 grader Celsius med en noggrannhet på +/- 2 grader Celsius och relativ luftfuktighet från 20-90% RH med en noggrannhet på +/- 5% RH. Detaljspecifikationen kan ses i nedanstående tabell.
Kommunicerar med DHT11-sensorn
Som nämnts tidigare, för att läsa data från DHT11 med PIC måste vi använda PIC ett tråds kommunikationsprotokoll. Detaljerna om hur man utför detta kan förstås från gränssnittsdiagrammet för DHT 11 som finns i databladet, detsamma ges nedan.
DHT11 behöver en startsignal från MCU för att starta kommunikationen. Därför måste MCU varje gång skicka en startsignal till DHT11-sensorn för att begära att den skickar värdena för temperatur och fuktighet. Efter avslutad startsignalen sänder DHT11 en svarssignal vilken innehåller information av temperatur och fuktighet. Datakommunikationen görs med protokollet för datakommunikation med en enda buss. Full datalängd är 40 bitar och sensorn skickar först högre databit.
På grund av uppdragningsmotståndet förblir datalinjen alltid på VCC-nivån under viloläge. MCU måste dra ner den här spänningen högt till lågt i minst 18 ms. Under denna tid detekterar DHT11-sensorn startsignalen och mikrokontrollern gör datalinjen hög i 20-40us. Denna 20-40us-tid kallas en väntetid där DHT11 börjar till svaret. Efter denna väntetid skickar DHT11 data till mikrokontroller-enheten.
DHT11-sensor DATA-format
Data består av decimaler och integrerade delar kombinerade tillsammans. Sensorn följer nedanstående dataformat -
8 bitars integrerad RH-data + 8 bitars decimal RH-data + 8 bitars integrerad T-data + 8 bitars decimal T-data + 8 bitars kontrollsumma.
Man kan verifiera uppgifterna genom att kontrollera kontrollsummets värde med mottagen data. Detta kan göras eftersom, om allt är korrekt och om sensorn har överfört korrekta data, ska kontrollsumman vara summan av ”8bit integral RH data + 8bit decimal RHdata + 8bit integral T data + 8bit decimal T data”.
Nödvändiga komponenter
För detta projekt krävs nedanstående saker -
- Programmering av PIC-mikrokontroller (8bit).
- Bakbord
- 5V 500mA strömförsörjningsenhet.
- 4,7 k motstånd 2 st
- 1k motstånd
- PIC16F877A
- 20mHz kristall
- 33pF kondensator 2 st
- LCD-skärm med 16x2 tecken
- DHT11-sensor
- Bygeltrådar
Schematisk
Kretsschemat för gränssnitt mellan DHT11 och PIC16F877A visas nedan.
Vi har använt en 16x2 LCD för att visa temperatur- och luftfuktighetsvärdena som vi mäter från DHT11. LCD-skärmen är gränssnitt i 4-trådsläge och både sensorn och LCD-enheten drivs av en 5V extern strömförsörjning. Jag har använt ett brödbräda för att göra alla nödvändiga anslutningar och har använt en extern 5V-adapter. Du kan också använda detta strömförsörjningskort för brädbräda för att driva ditt kort med 5V.
När kretsen är klar är allt vi behöver göra att ladda upp koden längst ner på denna sida och vi kan börja läsa temperaturen och luftfuktigheten som visas nedan. Om du vill veta hur koden skrevs och hur den fungerar läs vidare. Du kan också hitta det fullständiga arbetet med detta projekt i videon längst ner på denna sida.
DHT11 med PIC MPLABX-kodförklaring
Koden skrevs med MPLABX IDE och kompilerades med hjälp av XC8-kompilatorn som båda tillhandahålls av Microchip själv och är gratis att ladda ner och använda. Se de grundläggande självstudierna för att förstå grunderna för programmering, endast de tre viktiga funktionerna som krävs för att kommunicera med DHT11-sensorn diskuteras nedan. Funktionerna är -
ogiltigt dht11_init (); ogiltig find_response (); char read_dht11 ();
Den första funktionen används för startsignalen med dht11. Som diskuterats tidigare börjar varje kommunikation med DHT11 med en startsignal, här ändras stiftriktningen först för att konfigurera datapinnen som utsignal från mikrokontrollern. Sedan dras datalinjen lågt och väntar på 18mS. Därefter höjs linjen högt av mikrokontrollern och väntar i upp till 30us. Efter den väntetiden ställde datapinnen in som ingång till mikrokontrollern för att ta emot data.
ogiltigt dht11_init () { DHT11_Data_Pin_Direction = 0; // Konfigurera RD0 som utgång DHT11_Data_Pin = 0; // RD0 skickar 0 till sensorn __fördröjning_ms (18); DHT11_Data_Pin = 1; // RD0 skickar 1 till sensorn __fördröjning_us (30); DHT11_Data_Pin_Direction = 1; // Konfigurera RD0 som ingång }
Nästa funktion används för att ställa in en kontrollbit beroende på datastiftstatus. Den används för att upptäcka svaret från DHT11-sensorn.
ogiltig find_response () { Check_bit = 0; __fördröja_us (40); om (DHT11_Data_Pin == 0) { __fördröja_us (80); om (DHT11_Data_Pin == 1) { Check_bit = 1; } __fördröja (50);} }
Slutligen läsfunktionen dht11; här läses data in i ett 8-bitarsformat där data returneras med användning av bitförskjutningsoperation beroende på datapinnestatus.
char read_dht11 () { char data, for_count; för (for_count = 0; for_count <8; for_count ++) { medan (! DHT11_Data_Pin); __fördröja_us (30); om (DHT11_Data_Pin == 0) { data & = ~ (1 << (7 - för_antal)); // Rensa bit (7-b) } annat { data- = (1 << (7 - för_räkning)); // Ställ in bit (7-b) medan (DHT11_Data_Pin); } } returnera data; }
</s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s> </s>
Därefter görs allt till huvudfunktionen. Först görs systeminitieringen där LCD: n initialiseras och LCD-stiftets portriktning är inställd på utgången. Applikationen körs i huvudfunktionen
ogiltig huvud () { system_init (); medan (1) { __fördröja_ms (800); dht11_init (); hitta_svar (); om (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 (); om (Summation == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { Luftfuktighet = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Temp:"); // lcd_puts (""); lcd_data (48 + ((Luftfuktighet / 10)% 10)); lcd_data (48 + (luftfuktighet% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Luftfuktighet:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48 + (RH% 10)); lcd_puts ("%"); } annat { lcd_puts ("Fel i kontrollsumman"); } } annat { clear_screen (); lcd_com (0x80); lcd_puts ("Fel !!!"); lcd_com (0xC0); lcd_puts ("Inget svar."); } __fördröja_ms (1000); } }
Kommunikationen med DHT11 sensorn sker inuti medan slingan där startsignalen skickas till sensorn. Därefter utlöses find_response- funktionen. Om Check_bit är 1 utförs ytterligare kommunikation annars visar LCD-skärmen felfönster.
Beroende på 40-bitars data kallas read_dht11 5 gånger (5 gånger x 8 bitar) och lagras data enligt det dataformat som tillhandahålls i databladet. Den kontrollsumma status även kontrolleras och om fel påträffas, kommer den också meddela i displayen. Slutligen konverteras data och överförs till LCD-skärmen med 16x2 tecken.
Komplett kod för denna PIC-temperatur och luftfuktighetsmätning kan laddas ner härifrån. Kolla även demonstrationsvideon nedan.
Hoppas du förstod projektet och gillade att bygga något användbart. Om du har några frågor lämnar du dem i kommentarfältet nedan eller använder våra forum för andra tekniska frågor.