- DHT11 - Технические характеристики и работа
- Связь с датчиком DHT11
- Необходимые компоненты
- Схема
- DHT11 с PIC MPLABX Описание кода
Измерение температуры и влажности часто полезно во многих приложениях, таких как домашняя автоматизация, мониторинг окружающей среды, метеостанция и т.д. Pi и многие другие платы для разработки. В этой статье мы узнаем, как связать этот DHT11 с PIC16F87A, который является 8-битным микроконтроллером PIC. Мы будем использовать этот микроконтроллер для считывания значений температуры и влажности с помощью DHT11 и отображения их на ЖК-дисплее. Если вы новичок в использовании микроконтроллеров PIC, вы можете использовать нашу серию руководств по PIC, чтобы узнать, как программировать и использовать микроконтроллеры PIC, при этом давайте начнем.
DHT11 - Технические характеристики и работа
Датчик DHT11 доступен в виде модуля или датчика. В этом руководстве мы используем датчик, единственная разница между ними заключается в том, что в модульной форме датчик имеет фильтрующий конденсатор и подтягивающий резистор, прикрепленный к выходному контакту датчика. Поэтому, если вы используете модуль, вам не нужно добавлять их извне. Датчик DHT11 показан ниже.
Датчик DHT11 имеет корпус синего или белого цвета. Внутри этого кожуха находятся два важных компонента, которые помогают нам определять относительную влажность и температуру. Первый компонент - пара электродов; электрическое сопротивление между этими двумя электродами определяется влагоудерживающей подложкой. Таким образом, измеренное сопротивление обратно пропорционально относительной влажности окружающей среды. Чем выше относительная влажность, тем ниже будет значение сопротивления, и наоборот. Также обратите внимание, что относительная влажность отличается от фактической. Относительная влажность измеряет содержание воды в воздухе по отношению к температуре воздуха.
Другой компонент - термистор NTC поверхностного монтажа. Термин NTC означает отрицательный температурный коэффициент, при увеличении температуры значение сопротивления будет уменьшаться. Выходной сигнал датчика откалиброван на заводе-изготовителе, и поэтому, как программисту, нам не нужно беспокоиться о калибровке датчика. Выход датчика, заданный по 1-Wire связи, давайте посмотрим на контакт и схему подключения этого датчика.
Изделие находится в 4-контактном однорядном корпусе. 1-й контакт подключен к VDD, а 4-й контакт подключен к GND. Второй контакт - это контакт данных, используемый для связи. Этот вывод данных требует подтягивающего резистора 5 кОм. Однако можно использовать и другие подтягивающие резисторы, например от 4,7 кОм до 10 кОм. 3-й пин ни с чем не связан. Так что это игнорируется.
В таблице данных представлены технические характеристики, а также информация о взаимодействии, которую можно увидеть в таблице ниже.
В приведенной выше таблице показаны диапазон и точность измерения температуры и влажности. Он может измерять температуру от 0 до 50 градусов Цельсия с точностью +/- 2 градуса Цельсия и относительную влажность от 20 до 90% с точностью +/- 5%. Подробную спецификацию можно увидеть в таблице ниже.
Связь с датчиком DHT11
Как упоминалось ранее, для чтения данных из DHT11 с помощью PIC мы должны использовать протокол однопроводной связи PIC. Подробности о том, как это сделать, можно понять из схемы взаимодействия DHT 11, которую можно найти в его техническом описании, то же самое приведено ниже.
DHT11 требуется сигнал запуска от MCU для начала связи. Таким образом, каждый раз MCU необходимо отправить сигнал запуска на датчик DHT11, чтобы запросить его отправку значений температуры и влажности. После завершения сигнала запуска DHT11 отправляет ответный сигнал, который включает информацию о температуре и влажности. Передача данных осуществляется по протоколу передачи данных с одной шиной. Полная длина данных составляет 40 бит, и датчик сначала отправляет более высокий бит данных.
Из-за подтягивающего резистора линия данных всегда остается на уровне VCC в режиме ожидания. MCU необходимо понизить это напряжение с высокого до низкого в течение минимального периода времени 18 мс. В это время датчик DHT11 обнаруживает сигнал запуска, а микроконтроллер устанавливает высокий уровень на линии данных на 20-40 мкс. Это время 20-40 мкс называется периодом ожидания, когда DHT11 начинает отвечать. По истечении этого периода ожидания DHT11 отправляет данные в блок микроконтроллера.
Формат данных датчика DHT11
Данные состоят из десятичной и целой частей, объединенных вместе. Датчик соответствует следующему формату данных -
8-битные интегральные данные RH + 8-битные десятичные данные RH + 8-битные интегральные данные T + 8-битные десятичные данные T + 8-битная контрольная сумма.
Проверить данные можно, сверив значение контрольной суммы с полученными данными. Это можно сделать, потому что, если все в порядке и если датчик передал правильные данные, контрольная сумма должна быть суммой «8-битных интегральных данных относительной влажности + 8-битных десятичных данных RH + 8-битных интегральных данных T + 8 битных десятичных данных T».
Необходимые компоненты
Для этого проекта требуются следующие вещи -
- Настройка программирования микроконтроллера PIC (8bit).
- Макетная плата
- Блок питания 5В 500мА.
- 4,7 кОм резистор 2 шт.
- Резистор 1к
- PIC16F877A
- Кристалл 20 мГц
- Конденсатор 33пФ 2 шт.
- ЖК-дисплей 16x2 символов
- Датчик DHT11
- Перемычки
Схема
Принципиальная схема взаимодействия DHT11 с PIC16F877A показана ниже.
Мы использовали ЖК-экран 16x2 для отображения значений температуры и влажности, которые мы измеряли с помощью DHT11. ЖК-дисплей работает в 4-проводном режиме, и датчик, и ЖК-дисплей питаются от внешнего источника питания 5 В. Я использовал макетную плату для выполнения всех необходимых подключений и использовал внешний адаптер на 5 В. Вы также можете использовать эту макетную плату блока питания для питания вашей платы напряжением 5 В.
После того, как схема будет готова, все, что нам нужно сделать, это загрузить код, указанный внизу этой страницы, и мы можем начать считывать температуру и влажность, как показано ниже. Если вы хотите узнать, как был написан код и как он работает, читайте дальше. Также вы можете найти полную работу этого проекта в видео внизу этой страницы.
DHT11 с PIC MPLABX Описание кода
Код был написан с использованием MPLABX IDE и скомпилирован с использованием компилятора XC8, оба из которых предоставляются самой Microchip и могут быть бесплатно загружены и использованы. Пожалуйста, обратитесь к базовым руководствам, чтобы понять основы программирования, ниже обсуждаются только три важные функции, которые необходимы для связи с датчиком DHT11. Функции -
void dht11_init (); void find_response (); char read_dht11 ();
Первая функция используется для сигнала запуска с dht11. Как обсуждалось ранее, каждая связь с DHT11 начинается с сигнала запуска, здесь направление вывода сначала изменяется, чтобы настроить вывод данных как вывод микроконтроллера. Затем на линии данных устанавливается низкий уровень, и она продолжает ждать 18 мс. После этого микроконтроллер снова делает линию высоким и продолжает ждать до 30 мкс. По истечении этого времени ожидания вывод данных устанавливается как вход для микроконтроллера для приема данных.
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; __delay_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); если (DHT11_Data_Pin == 0) { данные & = ~ (1 << (7 - for_count)); // Очистить бит (7-b) } else { data- = (1 << (7 - for_count)); // Установить бит (7-b) while (DHT11_Data_Pin); } } вернуть данные; }
Взаимодействие с другими людьми
После этого все делается в основной функции. Во-первых, инициализация системы выполняется, когда ЖК-дисплей инициализируется и направление порта выводов ЖК-дисплея устанавливается на выход. Приложение работает внутри основной функции
недействительным 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 ("Температура:"); // 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 + (относительная влажность% 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 раз по 8 бит) и сохраняет данные в соответствии с форматом данных, указанным в таблице данных. Статус контрольной суммы проверяется также и при обнаружении ошибок, он также уведомит на ЖК - дисплее. Наконец, данные преобразуются и передаются на ЖК-дисплей размером 16x2 символа.
Полный код для этого измерения температуры и влажности PIC можно скачать здесь. Также посмотрите демонстрационное видео, приведенное ниже.
Надеюсь, вы поняли проект и вам понравилось создавать что-то полезное. Если у вас есть какие-либо вопросы, оставьте их в разделе комментариев ниже или используйте наши форумы для других технических вопросов.