- DHT11 - Спецификация и работа
- Комуникация със сензор DHT11
- Необходими компоненти
- Схематично
- DHT11 с обяснение на PIC MPLABX код
Измерването на температурата и влажността често е полезно в много приложения като автоматизация на дома, мониторинг на околната среда, метеорологична станция и др. Най-популярният сензор за температура до LM35 е DHT11, преди това сме изградили много проекти на DHT11, свързвайки го с Arduino, с Raspberry Pi и много други дъски за разработка. В тази статия ще научим как да свързваме този DHT11 с PIC16F87A, който е 8-битов PIC микроконтролер. Ще използваме този микроконтролер, за да отчитаме стойностите на температурата и влажността с помощта на DHT11 и да ги показваме на LCD дисплей. Ако сте напълно нови с използването на PIC микроконтролери, можете да се възползвате от нашата серия уроци по PIC, за да научите как да програмирате и използвате PIC микроконтролер, като казахме, нека да започнем.
DHT11 - Спецификация и работа
Сензорът DHT11 се предлага или под формата на модул, или под формата на сензор. В този урок използваме сензора, единствената разлика между двете е, че във формата на модула сензорът има филтриращ кондензатор и издърпващ резистор, прикрепен към изходния щифт на сензора. Така че, ако използвате модула, не е необходимо да ги добавяте външно. DHT11 под формата на сензор е показан по-долу.
Сензорът DHT11 се доставя със син или бял цветен корпус. Вътре в тази обвивка имаме два важни компонента, които ни помагат да усетим относителната влажност и температура. Първият компонент е чифт електроди; електрическото съпротивление между тези два електрода се определя от влагозадържащ субстрат. Така измереното съпротивление е обратно пропорционално на относителната влажност на околната среда. Колкото по-висока е относителната влажност, толкова по-ниска ще бъде стойността на съпротивлението и обратно. Също така имайте предвид, че относителната влажност се различава от действителната влажност. Относителната влажност измерва съдържанието на вода във въздуха спрямо температурата във въздуха.
Другият компонент е NTC термистор, монтиран на повърхността. Терминът NTC означава отрицателен температурен коефициент, за повишаване на температурата стойността на съпротивлението ще намалее. Изходът на сензора е фабрично калибриран и следователно като програмист не е нужно да се притесняваме за калибриране на сензора. Изходът на сензора, даден от 1-Wire комуникация, нека видим щифта и схемата за свързване на този сензор.
Продуктът е в 4-пинов едноредов пакет. Първият щифт е свързан през VDD, а четвъртият щифт е свързан през GND. Вторият щифт е щифтът за данни, използван за комуникационни цели. Този пин за данни се нуждае от издърпващ резистор от 5k. Въпреки това могат да се използват и други издърпващи резистори като 4.7k до 10k. Третият щифт не е свързан с нищо. Така че се пренебрегва.
Информационният лист предоставя технически спецификации, както и информация за взаимодействие, която може да се види в таблицата по-долу
Горната таблица показва обхвата и точността на измерване на температурата и влажността. Той може да измерва температура от 0-50 градуса по Целзий с точност до +/- 2 градуса по Целзий и относителна влажност от 20-90% относителна влажност с точност до +/- 5% относителна влажност. Подробната спецификация може да се види в таблицата по-долу.
Комуникация със сензор DHT11
Както споменахме по-рано, за да прочетем данните от DHT11 с PIC, трябва да използваме PIC едножичен комуникационен протокол. Подробностите за това как да се извърши това могат да бъдат разбрани от диаграмата на свързване на DHT 11, която може да бъде намерена в техническия лист, същото е дадено по-долу.
DHT11 се нуждае от стартов сигнал от MCU, за да стартира комуникацията. Следователно, всеки път, когато MCU трябва да изпрати стартов сигнал до сензора DHT11, за да поиска да изпрати стойностите на температурата и влажността. След завършване на стартовия сигнал, DHT11 изпраща сигнал за отговор, който включва информация за температурата и влажността. Комуникацията на данни се извършва от един протокол за комуникация на данни по шина. Пълната дължина на данните е 40 бита и сензорът изпраща първо по-висок бит данни.
Поради издърпващия резистор, линията за данни винаги остава на ниво VCC по време на режим на празен ход. MCU трябва да свали това напрежение високо до ниско за минимален период от 18ms. През това време сензорът DHT11 открива стартовия сигнал и микроконтролерът прави линията за данни висока за 20-40us. Това 20-40us време се нарича период на изчакване, когато DHT11 започва да отговаря. След този период на изчакване DHT11 изпраща данните на микроконтролера.
DHT11 Сензор DATA Формат
Данните се състоят от десетични и интегрални части, комбинирани заедно. Сензорът следва долния формат на данните -
8-битови интегрални данни за RH + 8-битови данни за десетична RH + 8-битови интегрални T данни + 8-битови десетични данни за T + 8-битова контролна сума.
Човек може да провери данните, като провери стойността на контролната сума с получените данни. Това може да се направи, защото, ако всичко е правилно и ако сензорът е предал правилни данни, тогава контролната сума трябва да бъде сумата от „8-битови интегрални данни за RH + 8-битови десетични данни от RH + 8-битови интегрални данни от T + 8-битови данни от десетичен T“.
Необходими компоненти
За този проект по-долу са необходими неща -
- Настройка за програмиране на PIC микроконтролер (8 бита).
- Макет
- 5V 500mA захранващ блок.
- 4.7k резистор 2бр
- 1k резистор
- PIC16F877A
- 20mHz кристал
- 33pF кондензатор 2 бр
- LCD с 16x2 знака
- DHT11 сензор
- Джъмперни проводници
Схематично
Схемата за свързване на DHT11 с PIC16F877A е показана по-долу.
Използвали сме 16x2 LCD, за да покажем стойностите на температурата и влажността, които измерваме от DHT11. LCD дисплеят е свързан в 4-жичен режим и сензорът и LCD се захранват от 5V външно захранване. Използвал съм макет, за да направя всички необходими връзки и съм използвал външен 5V адаптер. Можете също да използвате тази платка за захранване, за да захранвате дъската си с 5V.
След като веригата е готова, всичко, което трябва да направим, е да качим кода, даден в долната част на тази страница, и можем да започнем да четем температурата и влажността, както е показано по-долу. Ако искате да знаете как е написан кодът и как работи, прочетете по-нататък. Също така можете да намерите пълната работа на този проект във видеото, дадено в долната част на тази страница.
DHT11 с обяснение на PIC MPLABX код
Кодът е написан с помощта на MPLABX IDE и компилиран с помощта на компилатора XC8, предоставен от самия Microchip и е безплатен за изтегляне и използване. Моля, обърнете се към основните уроци, за да разберете основите на програмирането, по-долу са разгледани само трите важни функции, които са необходими за комуникация със сензора DHT11. Функциите са -
void dht11_init (); void find_response (); char read_dht11 ();
Първата функция се използва за стартовия сигнал с dht11. Както беше обсъдено по-горе, всяка комуникация с DHT11 започва със стартов сигнал, тук първоначално се променя посоката на щифта, за да се конфигурира пинът за данни като изход от микроконтролера. След това линията за данни се изтегля ниско и продължава да чака 18mS. След това отново линията се прави високо от микроконтролера и продължава да чака до 30us. След това време на изчакване, щифтът за данни се задава като вход към микроконтролера за получаване на данните.
void dht11_init () { DHT11_Data_Pin_Direction = 0; // Конфигуриране на RD0 като изход DHT11_Data_Pin = 0; // RD0 изпраща 0 до сензора __delay_ms (18); DHT11_Data_Pin = 1; // RD0 изпраща 1 до сензора __delay_us (30); DHT11_Data_Pin_Direction = 1; // Конфигуриране на RD0 като вход }
Следващата функция се използва за настройка на контролен бит в зависимост от състоянието на ПИН данни. Използва се за откриване на реакцията от сензора DHT11.
void find_response () { Check_bit = 0; __забавяне_us (40); ако (DHT11_Data_Pin == 0) { __delay_us (80); ако (DHT11_Data_Pin == 1) { Check_bit = 1; } __delay_us (50);} }
Накрая функцията за четене dht11; тук данните се четат в 8-битов формат, където данните се връщат, като се използва операция за смяна на битовете в зависимост от състоянието на ПИН данни.
char read_dht11 () { char данни, за_брои; for (for_count = 0; for_count <8; for_count ++) { while (! DHT11_Data_Pin); __забавяне_us (30); if (DHT11_Data_Pin == 0) { data & = ~ (1 << (7 - for_count)); // Изчистване на бит (7-b) } else { data- = (1 << (7 - за_брои)); // Задаване на бит (7-b) докато (DHT11_Data_Pin); } } връщане на данни; }
U
След това всичко се прави в основната функция. Първо, инициализацията на системата се извършва там, където LCD е инициализиран и посоката на порта на щифтовете на LCD е настроена на изхода. Приложението работи в основната функция
void main () { system_init (); докато (1) { __delay_ms (800); dht11_init (); find_response (); ако (Check_bit == 1) { RH_byte_1 = read_dht11 (); RH_byte_2 = read_dht11 (); Temp_byte_1 = read_dht11 (); Temp_byte_2 = read_dht11 (); Сумиране = read_dht11 (); ако (Сумиране == ((RH_byte_1 + RH_byte_2 + Temp_byte_1 + Temp_byte_2) & 0XFF)) { Влажност = Temp_byte_1; RH = RH_byte_1; lcd_com (0x80); lcd_puts ("Temp:"); // lcd_puts (""); lcd_data (48 + ((Влажност / 10)% 10)); lcd_data (48 + (влажност% 10)); lcd_data (0xDF); lcd_puts ("C"); lcd_com (0xC0); lcd_puts ("Влажност:"); // lcd_puts (""); lcd_data (48 + ((RH / 10)% 10)); lcd_data (48 + (RH% 10)); lcd_puts ("%"); } else { lcd_puts ("Грешка на контролната сума"); } } else { clear_screen (); lcd_com (0x80); lcd_puts ("Грешка !!!"); lcd_com (0xC0); lcd_puts ("Без отговор."); } __delay_ms (1000); } }
Комуникацията със сензора DHT11 се осъществява вътре в контура за време, където сигналът за старт се подава към сензора. След това се задейства функцията find_response . Ако Check_bit е 1, тогава се осъществява по-нататъшната комуникация, в противен случай LCD дисплеят ще покаже диалогов прозорец за грешка.
В зависимост от 40-битовите данни, read_dht11 се извиква 5 пъти (5 пъти x 8 бита ) и съхранява данните според формата на данните, предоставен в листа с данни. Състоянието на контролната сума също се проверява и ако бъдат открити грешки, той също ще извести на LCD дисплея. Накрая данните се преобразуват и предават на 16x2 символен LCD.
Пълният код за това PIC измерване на температура и влажност можете да изтеглите от тук. Също така проверете демонстрационното видео, дадено по-долу.
Надявам се, че сте разбрали проекта и сте се радвали да изградите нещо полезно. Ако имате въпроси, оставете ги в раздела за коментари по-долу или използвайте форумите ни за други технически въпроси.