- DHT11 - Specifikáció és működés
- Kommunikáció a DHT11 érzékelővel
- Szükséges alkatrészek
- Vázlatos
- DHT11 PIC MPLABX kód magyarázattal
A hőmérséklet és páratartalom mérése gyakran hasznos számos alkalmazásban, például otthoni automatizálásban, környezetfigyelésben, meteorológiai állomásban stb. Pi és sok más fejlesztői testület. Ebben a cikkben megtudhatjuk, hogyan lehet ezt a DHT11- et összekapcsolni a PIC16F87A-val, amely egy 8 bites PIC mikrokontroller. Ezt a mikrovezérlőt arra használjuk, hogy a DHT11 segítségével leolvassuk a hőmérséklet és a páratartalom értékeit, és megjelenítsük egy LCD kijelzőn. Ha Ön teljesen új a PIC mikrovezérlők használatában, akkor a PIC oktatósorozatunk segítségével megtanulhatja a PIC mikrovezérlő programozását és használatát, ennek ellenére kezdjük.
DHT11 - Specifikáció és működés
A DHT11 érzékelő modul vagy szenzor formájában kapható. Ebben az oktatóanyagban az érzékelőt használjuk, az egyetlen különbség mindkettő között az, hogy modul formájában az érzékelő szűrő kondenzátorral és felhúzási ellenállással rendelkezik, amely az érzékelő kimeneti tüskéjéhez van rögzítve. Tehát ha a modult használja, akkor nem kell külsőleg hozzáadnia őket. Az alábbiakban látható a DHT11 érzékelő formájában.
A DHT11 érzékelő kék vagy fehér színű házzal rendelkezik. Ebben a házban két fontos elem van, amelyek segítenek érzékelni a relatív páratartalmat és hőmérsékletet. Az első komponens egy pár elektróda; a két elektróda közötti elektromos ellenállást egy nedvességtartó aljzat határozza meg. Tehát a mért ellenállás fordítottan arányos a környezet relatív páratartalmával. Ha magasabb a relatív páratartalom, alacsonyabb lesz az ellenállás értéke és fordítva. Vegye figyelembe azt is, hogy a relatív páratartalom eltér a tényleges páratartalomtól. A relatív páratartalom a levegő víztartalmát méri a levegő hőmérsékletéhez viszonyítva.
A másik alkatrész egy felületre szerelt NTC termisztor. Az NTC kifejezés negatív hőmérsékleti együtthatót jelent, a hőmérséklet növekedése esetén az ellenállás értéke csökken. Az érzékelő kimenete gyárilag kalibrált, ezért programozóként nem kell aggódnunk az érzékelő kalibrálása miatt. Az érzékelő kimenetét az 1-vezetékes kommunikáció adja, nézzük meg ennek az érzékelőnek a tűjét és csatlakozási rajzát.
A termék 4 tűs egysoros csomagolásban található. Az 1. tüske a VDD-n, a 4. tüske pedig a GND-n keresztül csatlakozik. A 2. tű az adat tű, amelyet kommunikációs célokra használnak. Ehhez az adatcsaphoz 5k ellenállásra van szükség. Mások azonban felhúzhatnak olyan ellenállásokat is, mint például 4,7k - 10k. A 3. tű nem csatlakozik semmihez. Tehát figyelmen kívül hagyják.
Az adatlap technikai specifikációkat, valamint interfész információkat tartalmaz, amelyek az alábbi táblázatban láthatók -
A fenti táblázat a hőmérséklet és a páratartalom mérési tartományát és pontosságát mutatja. 0-50 Celsius fok hőmérsékletet képes mérni +/- 2 Celsius fok pontossággal és relatív páratartalmat 20-90% relatív páratartalommal +/- 5% relatív páratartalommal. A részletes specifikáció az alábbi táblázatban látható.
Kommunikáció a DHT11 érzékelővel
Ahogy korábban említettük, ahhoz, hogy a DHT11-ből PIC-vel leolvassuk az adatokat, egy vezetékes PIC kommunikációs protokollt kell használnunk. Ennek végrehajtásának részletei a DHT 11 interfészdiagramjából érthetők meg, amely megtalálható az adatlapján, ugyanez az alábbiakban található.
A kommunikáció megkezdéséhez a DHT11-nek szüksége van egy indító jelre az MCU-tól. Ezért minden alkalommal, amikor az MCU-nak indítási jelet kell küldenie a DHT11 érzékelőnek, hogy kérje a hőmérséklet és a páratartalom értékeinek elküldését. Befejezése után a start jelet, a DHT11 küld választ jel, amely magában foglalja a hőmérséklet és a páratartalom adatokat. Az adatkommunikációt az egyetlen buszos adatkommunikációs protokoll végzi. A teljes adathossz 40 bites, és az érzékelő először nagyobb adatbitet küld.
A felhúzási ellenállás miatt az adatvezeték alapjáraton mindig VCC szinten marad. Az MCU-nak ezt a feszültséget magasról alacsonyra kell csökkentenie, legalább 18 ms-ig. Ez idő alatt a DHT11 érzékelő észleli az indítási jelet, és a mikrovezérlő 20-40us-ig magasra teszi az adatsort. Ezt a 20-40usos időt várakozási periódusnak nevezzük, amikor a DHT11 megkezdi a választ. Ezen várakozási idő után a DHT11 elküldi az adatokat a mikrovezérlő egységnek.
DHT11 érzékelő DATA formátum
Az adatok tizedes és integrális részekből állnak együtt. Az érzékelő az alábbi adatformátumot követi -
8 bites integrált RH adatok + 8 bites decimális RH adatok + 8 bites integrált T adatok + 8 bites decimális T adatok + 8 bites ellenőrző összeg.
Az adatokat úgy ellenőrizhetjük, hogy a kapott adatokkal ellenőrizzük az ellenőrző összeg értékét. Ez azért tehető meg, mert ha minden rendben van, és ha az érzékelő megfelelő adatokat továbbított, akkor az ellenőrző összegnek a „8 bites integrált RH adatok + 8 bites decimális RHdata + 8 bites integrált T adatok + 8 bites decimális T adatok” összegének kell lennie .
Szükséges alkatrészek
Ehhez a projekthez az alábbiakra van szükség:
- PIC mikrokontroller (8bit) programozás beállítása.
- Kenyérlemez
- 5V 500mA tápegység.
- 4,7k ellenállás 2db
- 1k ellenállás
- PIC16F877A
- 20mHz kristály
- 33pF kondenzátor 2 db
- 16x2 karakteres LCD
- DHT11 érzékelő
- Jumper huzalok
Vázlatos
A DHT11 és a PIC16F877A összekapcsolásának kapcsolási rajza az alábbiakban látható.
16x2-es LCD-t használtunk a DHT11-től mért hőmérsékleti és páratartalmi értékek megjelenítésére. Az LCD interfész 4 vezetékes módban van, és az érzékelőt és az LCD-t is 5 V-os külső tápfeszültség táplálja. Az összes szükséges csatlakozás elvégzéséhez kenyérlapot használtam, és külső 5V-os adaptert használtam. Ezt a kenyérlap tápegységet is használhatja a kártya 5 V-os áramellátására.
Miután az áramkör készen áll, csak annyit kell tennünk, hogy feltöltöttük az oldal alján megadott kódot, és elkezdhetjük olvasni a hőmérsékletet és a páratartalmat az alábbiak szerint. Ha tudni szeretné, hogyan írták és hogyan működnek a kódok, olvassa el tovább. A projekt teljes működését megtalálja az oldal alján található videóban.
DHT11 PIC MPLABX kód magyarázattal
A kódot az MPLABX IDE segítségével írták, és az XC8 fordító segítségével állították össze, mindkettőt maga a Microchip nyújtotta, és ingyenesen letölthető és használható. Kérjük, olvassa el az alap oktatóanyagokat a programozás alapjainak megértéséhez. Az alábbiakban csak a DHT11 érzékelővel való kommunikációhoz szükséges három fontos funkciót tárgyaljuk. A funkciók a következők:
void dht11_init (); void find_response (); char read_dht11 ();
Az első funkciót a dht11 kezdőjelhez használjuk. Amint azt korábban említettük, a DHT11-vel folytatott minden kommunikáció kezdőjellel kezdődik, itt először megváltoztatja a tű irányát, hogy az adatcsapot a mikrovezérlő kimeneteként konfigurálja. Ezután az adatvonal alacsonyra húzódik, és folyamatosan várja a 18 mS-t. Ezt követően ismét a vonalat magasra teszi a mikrovezérlő, és folyamatosan vár akár 30 us-ig. Ez után a várakozási idő után az adatcsap be lett állítva a mikrovezérlőbe az adatok fogadására.
void dht11_init () { DHT11_Data_Pin_Direction = 0; // Az RD0 beállítása kimenetként DHT11_Data_Pin = 0; // RD0 0-t küld az érzékelőnek __delay_ms (18); DHT11_Data_Pin = 1; // RD0 1-et küld a __delay_us (30) érzékelőnek ; DHT11_Data_Pin_Direction = 1; // RD0 beállítása bemenetként }
A következő funkcióval egy ellenőrző bit állítható be, az adatcsap állapotától függően. A DHT11 érzékelő válaszának detektálására szolgál.
void find_response () { Check_bit = 0; __késleltetés_ (40); if (DHT11_Data_Pin == 0) { __delay_us (80); if (DHT11_Data_Pin == 1) { Check_bit = 1; } __delay_us (50);} }
Végül a dht11 olvasási funkció; itt az adatokat egy 8 bites formátumba olvassák, ahol az adatokat az adatcsap állapotától függően biteltolásos művelettel adják vissza.
char read_dht11 () { char adatok, for_count; for (for_count = 0; for_count <8; for_count ++) { while (! DHT11_Data_Pin); __késleltetés_ (30); if (DHT11_Data_Pin == 0) { adatok & = ~ (1 << (7 - a számhoz)); // Törölje a bitet (7-b) } else { data- = (1 << (7 - for_count)); // A bit beállítása (7-b) while (DHT11_Data_Pin); } } visszatérési adatok; }
A
Ezt követően minden a fő funkcióba kerül. Először a rendszer inicializálása történik, ahol az LCD inicializálódik, és az LCD csapok portjának irányát a kimenetre állítják. Az alkalmazás a fő funkción belül fut
void main () { system_init (); míg (1) { __késleltetési_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 (); Összegzés = read_dht11 (); if (Összegzés == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { Páratartalom = Temp_byte_1; RH = RH_bájt_1; lcd_com (0x80); lcd_puts ("Temp:"); // lcd_puts (""); lcd_data (48 + ((páratartalom / 10)% 10)); lcd_data (48 + (páratartalom% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Páratartalom:"); // lcd_puts (""); lcd_adatok (48 + ((RH / 10)% 10)); lcd_adatok (48 + (RH% 10)); lcd_puts ("%"); } else { lcd_puts ("Ellenőrző összeg hiba"); } } else { clear_screen (); lcd_com (0x80); lcd_puts ("Hiba !!!"); lcd_com (0xC0); lcd_puts ("Nincs válasz."); } __késleltetési_ms (1000); } }
A kommunikáció a DHT11 érzékelővel a while hurok belsejében zajlik, ahol az indítási jel az érzékelőhöz kerül. Ezt követően elindul a find_response függvény. Ha a Check_bit értéke 1, akkor a további kommunikáció folytatódik, különben az LCD hibaüzenetet jelenít meg.
A 40 bites adatoktól függően a read_dht11- t ötször (ötször x 8 bites) hívják meg, és az adatokat az adatlapon megadott adatformátum szerint tárolják. Az ellenőrző összeg állapotát is ellenőrzik, és ha hibákat találnak, akkor az LCD-n is értesíteni fogja. Végül az adatokat konvertáljuk és továbbítjuk a 16x2 karakteres LCD-re.
A PIC hőmérséklet és páratartalom mérés teljes kódja innen tölthető le. Ellenőrizze az alábbi bemutató videót is.
Remélem, megértette a projektet, és élvezett valami hasznos építését. Ha bármilyen kérdése van, hagyja őket az alábbi megjegyzés részben, vagy más technikai kérdésekhez használja fórumunkat.