Перейти к содержанию

Почему DHT22 выдаёт NaN?

Обновлено Редакция GAW

DHT22 (он же AM2302) передаёт данные по своей однопроводной линии: микроконтроллер прижимает её к нулю, датчик отвечает и выдаёт 40 бит. Библиотеки возвращают NaN — «не число», — когда ответа нет или данные не прошли проверку: контрольная сумма — младшие 8 бит суммы четырёх байтов данных.

Частые причины

ПричинаЧто по даташиту AM2302 V1.2Что проверить
Опрос слишком частыйинтервал не меньше 2 сзадержка между чтениями
Чтение сразу после включенияпосле подачи питания ждать 2 спауза перед первым чтением
Нет подтяжкиподтяжка 5,1 кОм к питанию при кабеле до 30 мрезистор между DATA и VCC
Питание 3,3 В и длинный проводпри 3,3 В — не длиннее 100 смпитание 5 В или короткий провод
Сбит отсчёт временибит 0 — 22–30 мкс, бит 1 — 68–75 мкспрерывания во время чтения
Нет ответа вообщеесли линия всё время в единице, датчик не работаетраспиновку и питание

Внутри датчика по табл. 4 даташита только слабая подтяжка 30–60 кОм, поэтому Aosong ставит внешний подтягивающий резистор 5,1 кОм. На готовых модулях он бывает уже распаян — проверьте, прежде чем добавлять свой.

Порядок поиска

  1. Проверьте распиновку: 1 — питание, 2 — данные, 3 — не подключён, 4 — земля.
  2. Поставьте подтяжку на линию данных и конденсатор 100 нФ по питанию у датчика.
  3. Сделайте паузу 2 с после включения и опрашивайте не чаще раза в 2 с.
  4. Если провод длинный, питайте датчик от 5 В — сколько метров допустимо, рассказано в ответе «На какой длине провода работает DHT22».
  5. Если ошибки случайные, ищите прерывания, которые срабатывают во время чтения: таймеры, приём UART, вывод на адресную ленту.

Выводы, протокол и отличия от DHT11 собраны в карточке DHT11 и DHT22.

Похожие вопросы

Почему DHT22 показывает устаревшие данные?

Так он устроен: по даташиту AM2302 каждое чтение возвращает результат предыдущего измерения, а новое измерение запускается самим запросом. Если опрашивать редко, первое значение после паузы старое; Aosong советует прочитать дважды подряд с интервалом не меньше 2 с.

Можно ли питать DHT22 от 3,3 В?

Можно, диапазон питания по даташиту — 3,3–5,5 В. Но при 3,3 В Aosong ограничивает провод до датчика одним метром: на более длинном падение напряжения оставляет датчик без нормального питания, и чтения сбоят.

Почему DHT22 сбоит, когда в программе работают прерывания?

Нуль и единица отличаются только длительностью высокого уровня — около 26 и 70 мкс. Если во время чтения сработает прерывание на десятки микросекунд, программа неверно измерит импульс, и контрольная сумма не сойдётся. Поэтому чтение делают с запрещёнными прерываниями или аппаратным захватом времени.

Источники

  1. 广州奥松电子有限公司 (Aosong). AM2302 产品手册 (温湿度模块), V1.2-20180605 — текст в виде изображений, прочитан по рендеру; с. 1 — питание 3,3–5,5 В; с. 2, табл. 4 — внутренняя подтяжка 30–60 кОм, период опроса 2 с; с. 3, разд. 7.1 — подтяжка 5,1 кОм при кабеле короче 30 м, при питании 3,3 В кабель не длиннее 100 см, иначе падение на линии оставляет датчик без питания; опрос не чаще раза в 2 с, иначе неточность или сбой связи; каждое чтение возвращает результат предыдущего измерения; с. 5, табл. 6 — старт 0,8–20 мс (тип. 1 мс), ответ 80 мкс, бит 0 — высокий уровень 22–30 мкс (тип. 26), бит 1 — 68–75 мкс (тип. 70); после включения ждать 2 с
  2. Aosong Electronics. Digital-output relative humidity & temperature sensor/module DHT22 (DHT22 also named as AM2302) — ранний англоязычный документ производителя (копия на сайте SparkFun) — пакет из 40 бит: влажность и температура по 16 бит и 8 бит контрольной суммы, равной младшим 8 битам суммы четырёх байтов; если линия всё время в высоком уровне, датчик не работает — проверить подключение; конденсатор 100 нФ между питанием и землёй

Нашли ошибку?