- DHT11 - Технічні характеристики та робота
- Спілкування з датчиком DHT11
- Необхідні компоненти
- Схематична
- DHT11 із поясненням коду PIC MPLABX
Вимірювання температури та вологості часто корисно в багатьох додатках, таких як автоматизація будинків, моніторинг навколишнього середовища, метеостанція тощо. Найпопулярнішим датчиком температури поруч із LM35 є DHT11, ми раніше створили багато проектів DHT11, взаємодіючи з Arduino та Raspberry Pi та багато інших плат розвитку. У цій статті ми дізнаємося, як взаємодіяти цей DHT11 з PIC16F87A, який є 8-розрядним мікроконтролером PIC. Ми будемо використовувати цей мікроконтролер для зчитування значень температури та вологості за допомогою DHT11 та відображення на РК-дисплеї. Якщо ви зовсім новачок у використанні мікроконтролерів PIC, ви можете скористатися нашою серією навчальних посібників з PIC, щоб навчитися програмувати та використовувати мікроконтролер PIC, що вже було сказано, давайте почнемо.
DHT11 - Технічні характеристики та робота
Датчик DHT11 доступний як у формі модуля, так і у формі датчика. У цьому підручнику ми використовуємо датчик, єдина відмінність між ними полягає в тому, що у формі модуля датчик має фільтруючий конденсатор і підтягуючий резистор, приєднаний до вихідного штифта датчика. Отже, якщо ви використовуєте модуль, вам не потрібно додавати їх зовні. DHT11 у формі датчика показаний нижче.
Датчик DHT11 постачається з синім або білим кольоровим корпусом. Всередині цього корпусу ми маємо два важливі компоненти, які допомагають нам відчути відносну вологість та температуру. Перший компонент - пара електродів; електричний опір між цими двома електродами визначається вологоутримуючою основою. Отже, виміряний опір обернено пропорційний відносній вологості навколишнього середовища. Чим вище відносна вологість, тим нижчим буде значення опору і навпаки. Також зверніть увагу, що відносна вологість повітря відрізняється від фактичної вологості. Відносна вологість вимірює вміст води в повітрі відносно температури в повітрі.
Іншим компонентом є наземний терморезистор NTC. Термін NTC позначає негативний температурний коефіцієнт, для підвищення температури значення опору зменшиться. Вихід датчика калібрується на заводі, і тому, як програміст, нам не потрібно турбуватися про калібрування датчика. Вихід датчика, який надається за допомогою 1-Wire зв'язку, давайте подивимося контакт і схему підключення цього датчика.
Виріб знаходиться в однорядній упаковці на 4 шпильки. Перший штифт підключений через VDD, а четвертий штифт - через GND. Другий штифт - це шпилька даних, що використовується для комунікаційних цілей. Для цього штифта даних потрібен підтягуючий резистор 5k. Однак інші підтягуючі резистори, такі як 4.7k до 10k, також можуть бути використані. 3-й штифт ні з чим не пов'язаний. Тож це ігнорується.
Таблиця містить технічні характеристики, а також інформацію про взаємозв'язок, яку можна побачити в таблиці нижче -
У наведеній вище таблиці наведено діапазон та точність вимірювання температури та вологості. Він може вимірювати температуру від 0-50 градусів за Цельсієм з точністю +/- 2 градуси Цельсія та відносну вологість від 20-90% відносної вологості з точністю до +/- 5% відносної вологості. Детальну специфікацію можна переглянути в таблиці нижче.
Спілкування з датчиком DHT11
Як згадувалося раніше, для зчитування даних з DHT11 за допомогою PIC ми повинні використовувати PIC- протокол зв'язку. Детально про те, як це зробити, можна зрозуміти з діаграми взаємодії DHT 11, яку можна знайти в його технічному паспорті, те саме наведено нижче.
DHT11 потребує сигналу запуску від MCU для запуску зв'язку. Тому кожного разу, коли MCU потрібно надіслати сигнал запуску на датчик DHT11, щоб попросити його надіслати значення температури та вологості. Після завершення сигналу запуску DHT11 надсилає сигнал відповіді, який включає інформацію про температуру та вологість. Передача даних здійснюється за допомогою єдиного протоколу передачі даних по шині. Повна довжина даних становить 40 біт, і датчик спочатку надсилає більший біт даних.
Завдяки підтягувальному резистору лінія передачі даних завжди залишається на рівні VCC в режимі очікування. MCU повинен знизити цю високу напругу до мінімальної протягом мінімального інтервалу 18 мс. Протягом цього часу датчик DHT11 виявляє сигнал запуску, а мікроконтролер підвищує лінію передачі даних на 20-40us. Цей час 20-40us називається періодом очікування, коли DHT11 починає відповідати. Після цього періоду очікування DHT11 надсилає дані в блок мікроконтролера.
DHT11 Формат даних датчика
Дані складаються з десяткової та невід’ємної частин, об’єднаних разом. Датчик відповідає наведеному нижче формату даних -
8-бітові інтегральні дані RH + 8-бітні десяткові дані RH + 8-бітні інтегральні дані T + 8-бітні десяткові дані T + 8-бітна контрольна сума.
Можна перевірити дані, перевіривши значення контрольної суми з отриманими даними. Це можна зробити, оскільки, якщо все належним чином і якщо датчик передав належні дані, тоді контрольна сума повинна бути сумою “8-бітові інтегральні дані RH + 8-бітні десяткові дані RH + 8-бітні інтегральні дані T + 8-бітні десяткові дані T”.
Необхідні компоненти
Для цього проекту нижче потрібні речі -
- Налаштування програмування мікроконтролера PIC (8 біт).
- Макет
- Блок живлення 5 В 500 мА.
- 4.7k резистор 2шт
- 1k резистор
- PIC16F877A
- Кристал 20 мГц
- Конденсатор 33pF 2 шт
- РК-дисплей 16x2 символів
- Датчик DHT11
- Провід перемички
Схематична
Принципова схема для взаємодії DHT11 з PIC16F877A показана нижче.
Ми використовували РК-дисплей 16x2 для відображення значень температури та вологості, які ми вимірюємо від DHT11. РК-дисплей взаємодіє в 4-провідному режимі, і сенсор, і РК-дисплей живляться від зовнішнього джерела живлення 5 В. Я використав макет для встановлення всіх необхідних з'єднань і використав зовнішній адаптер 5 В. Ви також можете використовувати цю плату живлення, щоб живити вашу плату на 5 В.
Після того, як схема готова, нам залишається лише завантажити код, наведений внизу цієї сторінки, і ми можемо почати читати температуру та вологість, як показано нижче. Якщо ви хочете знати, як був написаний код і як він працює, читайте далі. Також ви можете знайти повну роботу цього проекту у відео, поданому внизу цієї сторінки.
DHT11 із поясненням коду PIC MPLABX
Код був написаний за допомогою MPLABX IDE і скомпільований за допомогою компілятора XC8, який надається самим Microchip, і його можна безкоштовно завантажити та використовувати. Будь ласка, зверніться до основних посібників, щоб зрозуміти основи програмування, лише три важливі функції, необхідні для спілкування з датчиком DHT11, розглядаються нижче. Функції -
порожнеча dht11_init (); void find_response (); char read_dht11 ();
Перша функція використовується для сигналу запуску з dht11. Як вже обговорювалося раніше, кожен зв’язок з DHT11 починається з сигналу запуску, тут спочатку змінюється напрямок виводу, щоб налаштувати вивід даних як вихід з мікроконтролера. Потім рядок даних затягується і продовжує чекати 18 мС. Після цього мікроконтролер знову піднімає лінію і продовжує чекати до 30us. Після цього часу очікування штифт даних встановлюється як вхідний сигнал для мікроконтролера для отримання даних.
порожнеча 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_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 - for_count)); // Очистити біт (7-b) } else { data- = (1 << (7 - for_count)); // Встановити біт (7-b) while (DHT11_Data_Pin); } } повернути дані; }
U
Після цього все робиться в основній функції. По-перше, ініціалізація системи виконується там, де РК-дисплей ініціалізується, і напрямок порту штифтів РК-дисплея встановлюється на вихід. Додаток працює всередині основної функції
void main () { system_init (); while (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 ("Помилка контрольної суми"); } } ще { clear_screen (); lcd_com (0x80); lcd_puts ("Помилка !!!"); lcd_com (0xC0); lcd_puts ("Без відповіді."); } __delay_ms (1000); } }
Зв'язок з датчиком DHT11 робиться всередині в той час як цикл, в якому сигнал пуску представляється до датчика. Після цього запускається функція find_response . Якщо Check_bit дорівнює 1, то подальший зв'язок здійснюється, інакше на РК-дисплеї з'явиться діалогове вікно помилки.
Залежно від 40-бітних даних, read_dht11 викликається 5 разів (5 разів x 8 біт ) і зберігає дані відповідно до формату даних, представленого в таблиці даних. Статус контрольної суми перевіряється також і при виявленні помилок, він також повідомить на ЖК - дисплеї. Нарешті, дані перетворюються та передаються на РК-дисплей 16x2 символів.
Повний код цього PIC вимірювання температури та вологості можна завантажити звідси. Також перевірте демонстраційне відео, подане нижче.
Сподіваюся, ви зрозуміли проект і сподобалось будувати щось корисне. Якщо у вас виникли запитання, залиште їх у розділі коментарів нижче або використовуйте наші форуми для інших технічних питань.