Датчик влажности DHT22 – подключение к микроконтроллеру

Датчик влажности DHT22, подключение к микроконтроллеру
В этой статье я рассмотрю довольно популярный датчик влажности и температуры DHT22 (AM2302). Датчик измеряет влажность воздуха в пределах 0…99,9 % с погрешностью ±2 %, а также температуру от -40…80 °C с погрешностью ±0,5 °C. Напряжение питания может составлять 3,3…5,5 В, кроме этого датчик обладает низким энергопотреблением, в спящем режиме ток потребления составляет всего 15 мкА. Связь с датчиком осуществляется по однопроводной линии, протокол связи схож с 1-Wire, но более упрощенный. Датчик DHT22 отличается от своего предшественника DHT11 более широкими диапазоном измеряемых величин. Я заказывал датчик здесь.

Теперь рассмотрим подробней протокол связи, на следующем рисунке представлена диаграмма передачи данных с временными характеристиками:
DHT22–протокол передачи данных
Для инициализации передачи данных, ведущее устройство (микроконтроллер) должно послать стартовый сигнал, путем установки низкого логического уровня на шине данных (SDA), длительностью 0,8…20 мс (Tbe). После передачи стартового сигнала микроконтроллер должен освободить шину данных (перенастройка линии ввода/вывода на вход) и перейти к опросу ее состояния. В ответ на стартовый сигнал, датчик последовательно устанавливает низкий и высокий логические уровни на шине данных, длительность каждого из которых составляет 80 мкс (Trel, Treh). Далее датчик выдает 5 информационных байтов (40 бит), содержащих данные о влажности и температуре. Байты передаются стандартно, старшим битом вперед. Сначала передается старший байт влажности (Humidity high), затем младший байт влажности (Humidity low), далее старший (Temperature high) и младший (Temperature low) байты температуры, и последний байт содержит контрольную сумму (Parity bit). Таким образом влажность и температура представлены двухбайтными числами, для преобразования необходимо поделить эти числа на 10. Например, получили двухбайтное число 638, делим на 10 и получим искомое значение 63,8; данное преобразование справедливо для влажности и температуры. При отрицательной температуре старший бит в байте Temperature high устанавливается в 1.

Бит данных представляет собой последовательность низкого и высокого логических уровней имеющих фиксированную длительность. Бит “0” передается в виде последовательности низкого лог. уровня длительностью 50 мкс (Tlow) и высокого лог. уровня с длительностью 27 мкс (Th0). Бит “1” состоит из низкого и высокого лог. уровней с длительностями 50 (Tlow) и 70 мкс (Th1). Таким образом распознать значение бита можно по длительности высокого лог. уровня.

Минимальный интервал чтения данных с датчика должен составлять 2 секунды, при частом обращении увеличивается погрешность измерений. Максимальная длина соединительного кабеля составляет 30 метров при напряжении питания 5В, при напряжении в 3,3В длина кабеля не должна превышать 1 м.

Я подключил датчик DHT22 к микроконтроллеру PIC16F628A, для отображения значений температуры и влажности использовал модуль семисегментного индикатора на микросхеме MAX7219. Ниже приведена схема подключения:
Датчик DHT22, схема подключения
Линию данных SDA необходимо подтянуть к положительному полюсу источника питания через резистор номиналом 5,1 кОм, как это делается, например для 1-Wire или I2C.

Код программы для микроконтроллера PIC16F628A приведен ниже:

После настройки внутренних регистров микроконтроллера, вызывается подпрограмма инициализации драйвера цифрового табло init_lcd, затем вызывается подпрограмма вывода символов тире (signal_not), на индикаторы. Далее вызывается подпрограмма измерения температуры и влажности izm_datchik, в которой выполняется загрузка 4 байт данных от датчика, байт контрольной суммы принимается, но не сохраняется, полученные байты сохраняются в регистрах vlag_H, vlag_L, temp_H, temp_L. Если в процессе обмена данными датчик перестанет отвечать, устанавливается флаг ошибки flag,0 и выход из подпрограммы. После возвращения из подпрограммы izm_datchik, выполняется проверка флага ошибки, если обнаружена ошибка, вызывается подпрограмма вывода символов тире (signal_not) на индикаторы. В случае отсутствия ошибок вызывается подпрограмма вывода данных на индикаторы (vivod). В подпрограмме vivod двоичные значения влажности (vlag_H, vlag_L) и температуры (temp_H, temp_L) с помощью подпрограммы bin2bcd преобразуются в десятичные по разрядам (desiat, edin, drob), для дальнейшего вывода на индикаторы. Температура выводится на левой половине цифрового табло, а влажность на правой. После вывода следует пауза в 5 секунд и возврат на очередное измерение по круговому циклу.

Датчик DHT22 прост в подключении, обладает неплохой точностью, его можно использовать в автоматизированных системах контроля влажности и т.д.
Датчик DHT22, макетная плата

На следующем видеоролике можно увидеть датчик DHT22 в рабочем режиме:

У этой записи 12 комментариев

  1. Предлагаю такую идею, PIC +DHT+RGB Led-отображение влажности цветом красный-оранж…синий.Светодиод в прозрачную фигурку, индикатор температуры в подставу и
    не надо заморачиваться с процентами влажности, глянул на фигурку и все понятно. Как-то так…

    1. Да, неплохая идея, плавно менять цвета в зависимости от влажности, красному цвету высокую влажность, синему цвету низкую, середина (влажность 50%) придется на желто-зеленый участок.

  2. Может быть низкая влажность красн= оранж=желт, нормальная зелено=синяя, высокая фиолетовая.

  3. Пачему у меня при меделировании виходит што на диспее только 8.8.8.8.8.8.8.8.

    1. Я моделировать не пробовал, а что в Proteus есть модель светодиодного табло на MAX7219? Или вы по отдельности соединили все элементы?

      1. нет я по схеме собрал идикатор сам

        1. Пришлите мне на почту (указана на странице “Об авторе”) вашу модель, я посмотрю

            1. ну вы же в Proteus моделировали? файл проекта имеется в виду.

                1. У вас много ошибок в модели, неправильно выбран индикатор, нужен с общим катодом, а у вас с общим анодом. Неправильный порядок подключения выходов DIGX драйвера MAX7219 к разрядам индикатора (нужно соединять в обратном порядке DIG7 соответствует 1 индикатору и т.д.). В свойствах микроконтроллера неправильно указана частота и конфигурация, нужно 4МГц и конфигурацию 3F10. У меня в прошивке длительность стартового сигнала для инициализации DHT22 установлена 1.5мс, в свойствах модели датчика также необходимо изменить это значение на 1ms (параметр Time Select Low).

                  Но несмотря на это, мне не удалось запустить вашу модель, я заново собрал новый проект, который выложил в конце статьи, версия Proteus 8.1. В моей модели все работает, температура и влажность отображаются.

  4. рабочая схема, точность показаний датчика хорошая. сравнивал с домашним “механическим” прибором (влажность). автору большое спасибо. до этой делал две штуки на меге и тиньке. пришлось разобрать на запчасти, т.к. точность по влаге была “пол-потолок”. грешил на датчик, но судя по всему были ошибки в прошивках. здесь без проблем на том же датчике. температура тоже в норме. единственное пожелание нельзя ли сделать для удобства чтения сначала индикацию символа temp слева и hum справа, допустим 3сек индикации букв и 10сек – цифр.

Имя (обязательно)Email (обязательно)Веб-сайт

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