Подключение датчика температуры и влажности DHT11 к микроконтроллеру PIC16F877A


Измерение температуры и влажности окружающего воздуха в настоящее время востребовано во многих проектах: системах умного дома, мониторинга окружающей среды, станциях погоды и т.д. Одним из самых популярных датчиков температуры является LM35, но он аналоговый, а в ряде случаев необходимо иметь цифровой датчик температуры – на эту роль отлично подходит датчик DHT11. В данной статье мы рассмотрим его подключение к микроконтроллеру PIC16F877A. Измеряемые значения температуры и влажности мы будем выводить на экран ЖК дисплея 16х2.

Также на нашем сайте мы рассматривали подключение датчика температуры и влажности DHT11 к другим микроконтроллерам (платам):

Необходимые компоненты

  1. Микроконтроллер PIC16F877A (купить на AliExpress).
  2. Датчик температуры и влажности DHT11 (купить на AliExpress).
  3. Программатор PICkit 3 (купить на AliExpress).
  4. ЖК дисплей 16х2 (купить на AliExpress).
  5. Кварцевый генератор 20 МГц (купить на AliExpress).
  6. Конденсаторы 33 пФ (2шт.) (купить на AliExpress).
  7. Резистор 4,7 кОм – 2 шт. (купить на AliExpress).
  8. Источник питания 5V 500mA.
  9. Макетная плата.
  10. Соединительные провода.

Принципы работы датчика DHT11

Датчик DHT11 можно приобрести как в форме модуля, так и в форме датчика. Отличие между ними заключается лишь в том, что в форме модуля датчик содержит фильтрующий конденсатор и подтягивающий резистор, подключенные к выходному контакту датчика. Если же вы купили его в форме датчика, то их можно добавить внешним способом. Внешний вид датчика температуры и влажности DHT11 показан на следующем рисунке.

Внешний вид датчика температуры и влажности DHT11

Датчик DHT11 поставляется в корпусе синего или белого цвета. Внутри корпуса находятся два компонента, которые используются для измерения температуры и влажности. Одним из этих компонентов является пара электродов – их электрическое сопротивление зависит от состояния влажного вещества, помещенного между ними. Таким образом, их сопротивление обратно пропорционально влажности окружающего воздуха. Чем больше относительная влажность, тем меньше значение сопротивления проводников, и наоборот. Но помните о том, что относительная влажность и фактическая влажность – это не одно и тоже. Относительная влажность показывает содержание воды в воздухе по отношению к его температуре.

Вторым компонентом датчика является терморезистор (термистор) NTC датчика. Термин NTC (Negative temperature coefficient) означает отрицательный температурный коэффициент, то есть повышение температуры приводит к уменьшению сопротивления терморезистора. Более подробно про принципы измерения температуры с помощью терморезистора можно прочитать в этой статье.

Выход датчика DHT11 откалиброван на его заводе изготовителе, поэтому нам в программе не стоит беспокоиться о его калибровке. На выход датчика информация передается по протоколу 1-Wire. Распиновка и схема подключения датчика DHT11 к микроконтроллеру показаны на следующем рисунке.

Распиновка и схема подключения датчика DHT11 к микроконтроллеру

Всего у датчика DHT11 4 контакта. 1-й контакт (VDD) используется для подачи питания на датчик, 4-й контакт используется для подключения к общему проводу схемы/земле (GND). 2-й контакт является контактом данных, для его подключения необходим подтягивающий резистор сопротивлением 5 кОм, однако резисторы сопротивлением 4,7 и 10 кОм также подойдут. 3-й контакт датчика никуда не подключается – его мы просто игнорируем.

Технические характеристики датчика DHT11 можно узнать в даташите на него.

Основные технические характеристики датчика DHT11

Как видно из представленной таблицы, датчик DHT11 может измерять температуру в диапазоне 0-50 градусов Цельсия с точностью +/- градуса и относительную влажность (RH) в диапазоне 20-90% с точностью +/- 5%RH. Более подробные технические характеристики датчика DHT11 приведены в следующей таблице.

Технические характеристики датчика DHT11

Обмен данными с датчиком DHT11

Как уже было указано, для обмена данными между датчиком DHT11 и микроконтроллером PIC нам необходимо использовать протокол 1-Wire. Более детально эти процессы показаны на следующем рисунке.

Принципы передачи данных в протоколе 1-Wire

Первым делом датчику DHT11 от микроконтроллера необходим сигнал начала передачи (start signal) чтобы начать процесс обмена данными. Этот сигнал начала передачи микроконтроллер должен передавать на датчик DHT11 каждый раз когда ему необходимо запросить данные температуры и влажности. После завершения этого сигнала датчик DHT11 передает сигнал ответа (response signal), который включает в себя информацию о температуре и влажности. Все данные передаются по одной линии (проводу). Полная длина данных составляет 40 бит, первыми передаются старшие биты.

Структура данных, передаваемых датчиком DHT11

Из-за наличия подтягивающего резистора уровень напряжения на линии данных всегда находится на уровне VCC в течение холостого/незанятого режима (idle mode). Микроконтроллеру необходимо опустить этот уровень напряжения с high до low на промежуток как минимум 18 мс. В течение этого времени датчик DHT11 обнаруживает сигнал начала передачи и микроконтроллер подает уровень high на линию на 20-40 мкс. Эти 20-40 мкс называются периодом ожидания, после которого датчик DHT11 начинает передачу данных.

Формат данных датчика DHT11

Данные датчика DHT11 состоят из десятичной и интегральной частей, объединенных вместе. Формат этих данных выглядит следующим образом:

На приеме можно проверить корректность принятых данных с помощью проверки значения контрольной суммы (checksum value). В случае успешной передачи значение контрольной суммы должно представлять собой сумму слагаемых “8bit integral RH data+8bit decimal RHdata+8bit integral T data+8bit decimal T data”.

Схема проекта

Схема подключения датчика DHT11 к микроконтроллеру PIC16F877A представлена на следующем рисунке.

Схема подключения датчика DHT11 к микроконтроллеру PIC16F877AДля отображения принятых от датчика DHT11 значений температуры и влажности мы будем использовать ЖК дисплей 16х2, который подключим к микроконтроллеру PIC в 4-х проводном режиме. И датчик DHT11, и ЖК дисплей 16х2 будут запитываться от внешнего источника питания напряжением 5V (адаптер на 5V).

Внешний вид собранной конструкции проекта (без ЖК дисплея) показан на следующем рисунке.

Внешний вид собранной конструкции проекта

После сборки программы и загрузки программы (ее код приведен далее) в микроконтроллер PIC вы можете приступить к тестированию работы проекта. Более подробно работу проекта вы можете посмотреть на видео, приведенном в конце статьи.

Объяснение программы для микроконтроллера PIC

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Код программы мы разработали с помощью среды MPLABX IDE и скомпилировали ее с помощью компилятора XC8. Оба эти программных инструмента поставляются компанией Microchip совершенно бесплатно. Более подробно об их использовании вы можете прочитать в этой статье. Для работы с датчиком DHT11 нам необходимо будет запрограммировать следующие три функции:

Первая функция будет заключаться в подаче сигнала начала передачи (start signal) на датчик DHT11 – как мы рассматривали ранее, с него должен начинаться любой процесс обмена данными с датчиком DHT11. В этой функции нам сначала необходимо сконфигурировать контакт RD0 для работы на вывод данных. Затем на линию данных подается уровень low на время 18 мс. Затем на линию снова подается уровень high и в этом состоянии микроконтроллер удерживает данную линию в течение 30 мкс. После этого времени ожидания контакт RD0 конфигурируется в режим работы на ввод данных.

Функция find_response() используется для установки бита проверки (check bit) в зависимости от состояния контакта данных. Это используется для обнаружения ответа от датчика DHT11.

И, наконец, в функции read_dht11() мы будем считывать данные от датчика в 8-битном формате с помощью операции сдвига.

В основной функции программы main мы сначала будем вызывать функцию инициализации, в которой будет инициализироваться ЖК дисплей и режим работы контактов для обмена данными с ним будет устанавливаться на вывод данных. После этого мы будем считывать данные температуры и влажности с датчика DHT11 и выводить их на экран ЖК дисплея 16х2.

Сначала в цикле мы будем подавать сигнал начала передачи данных на датчик, после этого вызывать функцию find_response. Если Check_bit равен 1, то начинается процесс считывания данных температуры и влажности с датчика.

Поскольку длина данных у нас составляет 40 бит, то функция read_dht11 будет вызываться 5 раз (5 раз х 8 бит = 40 бит). Считываемые данные будут сохраняться в соответствующих переменных. Также будет проверяться значение контрольной суммы (checksum) и при обнаружении ошибки передачи будет выводиться соответствующее сообщение на экран ЖК дисплея.

Исходный код программы

Видео, демонстрирующее работу проекта

(Проголосуй первым!)
Загрузка...
975 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *