- DHT11 - Specifikace a práce
- Komunikace se senzorem DHT11
- Požadované komponenty
- Schematické
- DHT11 s vysvětlením kódu PIC MPLABX
Měření teploty a vlhkosti je často užitečné v mnoha aplikacích, jako je domácí automatizace, monitorování prostředí, meteorologická stanice atd. Nejpopulárněji používaným snímačem teploty vedle LM35 je DHT11, dříve jsme postavili mnoho projektů DHT11 propojením s Arduino, s Raspberry Pi a mnoho dalších vývojových desek. V tomto článku se naučíme, jak propojit tento DHT11 s PIC16F87A, což je 8bitový mikrokontrolér PIC. Tento mikrokontrolér použijeme ke čtení hodnot teploty a vlhkosti pomocí DHT11 a zobrazení na LCD displeji. Pokud jste s používáním mikrokontrolérů PIC úplně noví, můžete využít naši sérii tutoriálů PIC, abyste se naučili programovat a používat mikrokontrolér PIC, to znamená, pojďme začít.
DHT11 - Specifikace a práce
Senzor DHT11 je k dispozici buď ve formě modulu nebo ve formě senzoru. V tomto tutoriálu používáme senzor, jediný rozdíl mezi oběma je ten, že v modulové formě má senzor filtrační kondenzátor a pull-up rezistor připojený k výstupnímu kolíku senzoru. Pokud tedy modul používáte, nemusíte je přidávat externě. DHT11 ve formě senzoru je zobrazen níže.
Senzor DHT11 je dodáván s krytem v modré nebo bílé barvě. Uvnitř tohoto pouzdra máme dvě důležité součásti, které nám pomáhají snímat relativní vlhkost a teplotu. První složkou je dvojice elektrod; o elektrickém odporu mezi těmito dvěma elektrodami rozhoduje substrát zadržující vlhkost. Takže změřený odpor je nepřímo úměrný relativní vlhkosti prostředí. Čím vyšší bude relativní vlhkost, tím nižší bude hodnota odporu a naopak. Mějte také na paměti, že relativní vlhkost se liší od skutečné vlhkosti. Relativní vlhkost měří obsah vody ve vzduchu vzhledem k teplotě ve vzduchu.
Druhou součástí je povrchově namontovaný NTC termistor. Termín NTC znamená záporný teplotní koeficient, pro zvýšení teploty se hodnota odporu sníží. Výstup senzoru je kalibrován z výroby, a proto se jako programátor nemusíme starat o kalibraci senzoru. Výstup senzoru daný 1-Wire komunikací, podívejme se na pin a schéma zapojení tohoto senzoru.
Produkt je v 4pinovém jednořadém balení. 1. pin je připojen přes VDD a 4. pin je připojen přes GND. 2. pin je datový pin, který se používá pro komunikační účely. Tento datový kolík potřebuje pull-up rezistor 5k. Lze však použít i jiné odpory, například 4,7k až 10k. Třetí pin není s ničím spojen. Je to tedy ignorováno.
Datasheet obsahuje technické specifikace a informace o rozhraní, které lze vidět v následující tabulce -
Výše uvedená tabulka ukazuje rozsah a přesnost měření teploty a vlhkosti. Může měřit teplotu od 0-50 stupňů Celsia s přesností +/- 2 stupně Celsia a relativní vlhkost od 20-90% RH s přesností +/- 5% RH. Podrobná specifikace je uvedena v následující tabulce.
Komunikace se senzorem DHT11
Jak již bylo zmíněno dříve, abychom mohli číst data z DHT11 pomocí PIC, musíme použít jeden drátový komunikační protokol PIC. Podrobnosti o tom, jak to provést, lze pochopit z diagramu rozhraní DHT 11, který je uveden v jeho datovém listu, totéž je uvedeno níže.
DHT11 potřebuje ke spuštění komunikace spouštěcí signál z MCU. Proto pokaždé, když MCU potřebuje poslat spouštěcí signál do senzoru DHT11 a požádat o odeslání hodnot teploty a vlhkosti. Po dokončení startovacího signálu odešle DHT11 signál odpovědi, který obsahuje informace o teplotě a vlhkosti. Datová komunikace se provádí protokolem datové komunikace s jednou sběrnicí. Plná délka dat je 40 bitů a senzor nejprve odešle vyšší datový bit.
Díky pull-up rezistoru zůstává datová linka v klidovém režimu vždy na úrovni VCC. MCU musí stáhnout toto napětí z vysokého na nízké pro minimální rozpětí 18 ms. Během této doby senzor DHT11 detekuje spouštěcí signál a mikrokontrolér zvýší datovou linku na 20-40us. Tato doba 20-40us se nazývá čekací doba, kdy DHT11 začíná reagovat. Po uplynutí této čekací doby odešle DHT11 data do jednotky mikrokontroléru.
Formát dat snímače DHT11
Data se skládají z desítkových a integrálních částí dohromady. Senzor dodržuje níže uvedený datový formát -
8bitová integrální RH data + 8bitová desetinná RH data + 8bitová integrální T data + 8bitová desetinná T data + 8bitový kontrolní součet.
Data lze ověřit kontrolou hodnoty kontrolního součtu s přijatými daty. Toho lze dosáhnout, protože pokud je vše v pořádku a pokud snímač přenesl správná data, pak by kontrolní součet měl být součtem „8bitových integrálních dat RH + 8bitových desetinných RHdata + 8bitových integrálních T dat + 8bitových desetinných T dat“.
Požadované komponenty
U tohoto projektu jsou vyžadovány níže uvedené věci -
- Nastavení programování mikrokontroléru PIC (8bit).
- Nepájivá deska
- Napájecí jednotka 5V 500mA.
- 4,7k rezistor 2ks
- 1k rezistor
- PIC16F877A
- 20mHz krystal
- 33pF kondenzátor 2 ks
- 16x2 znakový LCD
- Senzor DHT11
- Propojovací vodiče
Schematické
Schéma zapojení rozhraní DHT11 s PIC16F877A je uvedeno níže.
K zobrazení hodnot teploty a vlhkosti, které měříme z DHT11, jsme použili 16x2 LCD. Displej LCD je propojen ve čtyřvodičovém režimu a senzor i LCD jsou napájeny externím zdrojem napájení 5 V. K vytvoření všech požadovaných připojení jsem použil prkénko a použil jsem externí 5V adaptér. Tuto desku napájecího zdroje můžete také použít k napájení vaší desky 5V.
Jakmile je obvod připraven, vše, co musíme udělat, je nahrát kód uvedený v dolní části této stránky a můžeme začít číst teplotu a vlhkost, jak je znázorněno níže. Pokud chcete vědět, jak byl kód napsán a jak funguje, přečtěte si dále. Ve videu ve spodní části této stránky také najdete kompletní fungování tohoto projektu.
DHT11 s vysvětlením kódu PIC MPLABX
Kód byl napsán pomocí MPLABX IDE a zkompilován pomocí kompilátoru XC8, který poskytl samotný Microchip a je zdarma ke stažení a použití. V základním výukovém programu najdete základní informace o programování, níže jsou popsány pouze tři důležité funkce potřebné pro komunikaci se snímačem DHT11. Funkce jsou -
void dht11_init (); void find_response (); char read_dht11 ();
První funkce se používá pro spouštěcí signál s dht11. Jak bylo diskutováno výše, každá komunikace s DHT11 začíná spouštěcím signálem, zde se nejprve změní směr kolíku, aby se konfiguroval datový kolík jako výstup z mikrokontroléru. Pak je datová linka stažena a čeká na 18 mS. Poté je mikrokontrolér linka opět vysoko a čeká až 30us. Po této čekací době se datový kolík nastavil jako vstup do mikrokontroléru pro příjem dat.
void dht11_init () { DHT11_Data_Pin_Direction = 0; // Nakonfigurujte RD0 jako výstup DHT11_Data_Pin = 0; // RD0 pošle 0 do senzoru __delay_ms (18); DHT11_Data_Pin = 1; // RD0 pošle 1 do senzoru __delay_us (30); DHT11_Data_Pin_Direction = 1; // Konfigurace RD0 jako vstupu }
Další funkce se používá k nastavení kontrolního bitu v závislosti na stavu datového kolíku. Slouží k detekci odezvy ze snímače DHT11.
void find_response () { Check_bit = 0; __delay_us (40); if (DHT11_Data_Pin == 0) { __delay_us (80); if (DHT11_Data_Pin == 1) { Check_bit = 1; } __delay_us (50);} }
Nakonec dht11 čtecí funkce; zde jsou data čtena do 8bitového formátu, kde jsou data vrácena pomocí operace bit shift v závislosti na stavu datového pinu.
char read_dht11 () { char data, for_count; for (for_count = 0; for_count <8; for_count ++) { while (! DHT11_Data_Pin); __delay_us (30); if (DHT11_Data_Pin == 0) { data & = ~ (1 << (7 - pro_počet)); // Vymazat bit (7-b) } else { data- = (1 << (7 - pro_počet)); // Nastavit bit (7-b) while (DHT11_Data_Pin); } } vrátit data; }
Zloženie: 100% bavlna.
Poté se vše provede do hlavní funkce. Nejprve se provede inicializace systému, kde je inicializován LCD a směr portu pinů LCD je nastaven na výstup. Aplikace běží uvnitř hlavní funkce
void main () { system_init (); while (1) { __delay_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 (); Součet = read_dht11 (); if (Summation == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { Humidity = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Teplota:"); // lcd_puts (""); lcd_data (48 + ((Vlhkost / 10)% 10)); lcd_data (48 + (vlhkost% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Vlhkost:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48 + (RH% 10)); lcd_puts ("%"); } else { lcd_puts ("chyba kontrolního součtu"); } } else { clear_screen (); lcd_com (0x80); lcd_puts ("Chyba !!!"); lcd_com (0xC0); lcd_puts ("Žádná odpověď."); } __delay_ms (1000); } }
Komunikace se senzorem DHT11 probíhá uvnitř smyčky while, kde je startovací signál odesílán senzoru. Poté se spustí funkce find_response . Pokud je Check_bit 1, pak se provede další komunikace, jinak se na LCD zobrazí chybový dialog.
V závislosti na 40bitových datech je read_dht11 volán 5krát (5krát x 8bit) a data jsou uložena podle datového formátu uvedeného v datovém listu. Status součet je také kontrolována a pokud jsou nalezeny chyby, bude také informovat na LCD displeji. Nakonec jsou data převedena a přenesena na 16x2 znakový LCD.
Kompletní kód pro toto měření teploty a vlhkosti PIC lze stáhnout zde. Zkontrolujte také níže uvedené ukázkové video.
Doufám, že jste pochopili projekt a bavilo vás stavět něco užitečného. Pokud máte nějaké dotazy, nechte je v sekci komentářů níže nebo použijte naše fóra pro další technické dotazy.