Мой первый уличный DHT22 прожил на окне трое суток. Я вынес его за раму на четырёх проводах от старого шлейфа, повесил на скотче под козырьком — и первые ночи получал честные данные, а к утру в мониторе росла доля nan, и к восьми часам датчик замолкал полностью. Днём оживал, к утру умирал. Диагноз оказался двухэтажным: утренний конденсат на холодном корпусе плюс четыре метра тонкого провода, по которым импульсы обмена доходили как попало. Обе проблемы лечатся за копейки, но до них надо догадаться — поэтому этот урок про установку, а не про подключение. Если вы ещё не проходили базовую схему с подтяжкой и чек-лист монтажа, начните с урока про подключение DHT11 — здесь я отталкиваюсь от него и не пересказываю азы.
Подключение DHT22 мы уже прошли: те же три провода, что у DHT11, и подтяжка. Разница всплывает, когда сенсор уезжает от Arduino на метры, на улицу, в сырой воздух. Здесь три темы: кабель и его сопротивление, конденсат и как дать ему стекать, и размещение корпуса, чтобы данные означали погоду, а не температуру подоконника.
AM2302: тот же DHT22, но в монтажном исполнении
AM2302 — это DHT22 в другом сарафане: тот же сенсор Aosong внутри, но корпус с проушинами под саморезы и провода, уже заведённые на платку. В коде различие исчезает: константа AM2302 в библиотеке равна DHT22, и скетч не меняется. Если заказываете датчик для улицы — берите именно AM2302 с проводами: проушины экономят час возни с креплением, а заводские пайки надёжнее скруток на холоде. У большинства версий провода три — питание, данные и земля, подтяжка уже на платке; проверьте чип 103 глазами, как учил урок про подключение и первые данные: пустая позиция под резистором встречается и в монтажных исполнениях.
Если выбор между братьями вы ещё не сделали — рамка решения собрана в уроке про отличия DHT11 и DHT22. Два свойства DHT22, которые диктуют монтаж. Первое: сенсор просыпается медленно — после подачи питания первому честному чтению нужно около двух секунд, поэтому dht.begin() в setup() с задержкой перед первым опросом не перестраховка, а часть протокола. Питание при этом оставьте на 5 В: на длинной линии к 3,3 В добавится просадка на сопротивлении провода, и в моменты опроса сенсор начнёт проваливаться ниже допустимого. Второе: частота обмена — раз в две секунды, и каждая попытка чтения на 4–5 миллисекунд блокирует скетч. Для уличной метеостанции с опросом раз в минуту это неважно, но в loop, где живут ещё сервы и светодиоды, честнее перевести опрос на millis — как в уроке про millis вместо delay.
Кабель: где кончается честность 10 кОм
Протокол DHT — это 40 импульсов с таймингами порядка десятков микросекунд: примерно 27 микросекунд высокого уровня для нуля и 70 для единицы. Библиотека отмеряет эти длительности, и любая размазанность фронта ломает счёт. Длинный провод добавляет сопротивление и ёмкость, ловит наводки — фронты плывут, и там, где метровый шлейф читался идеально, четырёхметровый даёт nan через раз. Прикиньте масштаб: четыре метра тонкого шлейфа — это единицы ом сопротивления плюс ёмкость между жилами, которая для импульса в 27 микросекунд работает как фильтр. Моя история с окном началась именно с этого.
Практика с границами: до пяти метров работает почти любой провод с подтяжкой 10 кОм — мой рекорд был четыре метра витой пары без единого сбоя. От пяти до двадцати метров включается правило: витая пара или экранированный кабель, а подтяжку ужесточаем до 4,7 кОм и ставим её у самого сенсора, а не у Arduino — резистор должен прижимать линию там, где она реально висит. Дальше двадцати метров я DHT уже не тащу: шансов больше нет, честнее взять сенсор с шиной RS-485 или I2C-удлинитель. Экран кабеля, если берёте экранированный, земле — только с одной стороны, у Arduino. И приём напоследок: прежде чем прятать линию в кабель-канал, погоните датчик на новой длине час-другой на столе — если за час не выпало ни одного fail, можно монтировать навсегда.
| Длина линии | Кабель | Подтяжка и её место |
|---|---|---|
| До 1 м | макетный шлейф | 10 кОм, можно на плате модуля |
| 1–5 м | витая пара или шлейф | 10 кОм, лучше у сенсора |
| 5–20 м | витая пара, экранированный | 4,7 кОм у сенсора |
| Более 20 м | другой интерфейс | DHT не предназначен для таких длин |
Конденсат: убить датчик тёплой ночью
Конденсат — главный убийца уличных сенсоров влажности, и работает он так: ночью корпус остывает, влажный воздух касается холодной поверхности, и влага выпадает каплей прямо на решётку сенсора. Ёмкостному элементу капля не смертельна сразу, но обмен рвётся — отсюда утренние nan из моей истории, — а за сезон в капле живёт грязь, и сенсор плывёт навсегда. Лечится не укрытием, а воздухом: датчику нужен объём, где он уравнивается с улицей, но капля сверху не достаёт.
Мой рецепт после двух убитых сенсоров. Корпус — любой коробочек с сетчатыми стенками или просто экран-крыша сверху и открытые бока снизу: капля стекает мимо, воздух гуляет. Классика метеорологов — жалюзийная будка Стивенсона — в домашнем исполнении вырождается в коробочку из пластиковых линеек с щелями между рейками: скучно, но работает на удивление хорошо. Решётку сенсора направить вниз — конденсату проще стечь, чем собираться. Полиэтиленовые пакеты и термоусадку запретить сразу: в герметичном чехле датчик измеряет климат внутри чехла, а он не совпадает с улицей. И главное — не заливать место пайки термоклеем наглухо: пар должен выходить, иначе вы построите теплицу для собственной платы. Заодно имейте в виду: мокрый сенсор врёт в сторону завышения влажности — если после дождя показания подпрыгнули к 95 % при сухом воздухе, датчик уже плывёт.
Скетч: опрос по millis с записью минимума и максимума
Для выносного датчика я держу скетч, который опрашивает сенсор раз в две секунды без delay, печатает пары t= и h= и ведёт суточные минимум-максимум. Данные в таком виде уже годятся для графика или для логирования на SD-карту — останется добавить часы реального времени и писать строки в файл.
Строка if (millis() - last < 2000) return; — весь секрет: loop крутится свободно, а чтение происходит по расписанию. Утренние nan в таком скетче видно сразу как серию fail — и это диагноз не кода, а конденсата или кабеля, вернитесь к двум разделам выше; на графике в Serial Plotter провалы видны ещё нагляднее. Что делать с данными дальше — решать вам: термостат с гистерезисом закроет вопрос управления теплом, а если датчик встанет в теплицу, те же числа лягут в Telegram-бота через ESP32. Главное, что сенсор теперь установлен так, что им можно верить.
#include <DHT.h> DHT dht(2, AM2302); unsigned long last = 0;float tMin = 100.0, tMax = -100.0; void setup() { Serial.begin(9600); dht.begin();} void loop() { if (millis() - last < 2000) return; last = millis(); float t = dht.readTemperature(); float h = dht.readHumidity(); if (t > 80.0 || t < -40.0 || h < 0.0 || h > 100.0) { Serial.println("fail: svjaz rvetsya"); return; } if (t < tMin) tMin = t; if (t > tMax) tMax = t; Serial.print("t="); Serial.print(t); Serial.print(" h="); Serial.print(h); Serial.print(" min="); Serial.print(tMin); Serial.print(" max="); Serial.println(tMax);}- 1. Чем AM2302 отличается от DHT22 в коде?
- 2. Кабель до датчика вырос с одного метра до двенадцати, появились редкие nan. Что сделать первым?
- 3. Почему нельзя заливать сенсор и его платку термоклеем или убирать в герметичный пакет?
- 4. К утру уличный датчик регулярно выдаёт nan, днём работает. Главный подозреваемый?
- 5. Зачем в скетче урока проверка if (millis() - last < 2000) return;?
- AM2302 = DHT22 в монтажном корпусе: провода, проушины, в коде константа AM2302.
- До 5 м хватит 10 кОм; 5–20 м — витая пара и подтяжка 4,7 кОм у сенсора; дальше — другой интерфейс.
- Конденсат убивает по утрам: решётка вниз, крыша-экран, вентиляция, никаких герметичных чехлов и наглухо залитого термоклея.
- Размещение: 1,5–2 м от земли, 15–20 см от стены, под козырьком, в стороне от труб и форточек.
- Опрос раз в две секунды держите на millis: loop остаётся свободным, а fail-серии сразу показывают рваную связь.
Частые вопросы по теме урока
- Чем AM2302 отличается от DHT22 в коде?
- AM2302 — тот же сенсор в монтажном корпусе с проводами и проушинами. В библиотеке AM2302 — просто другое имя для DHT22, а число 22 — код модели, а не частота опроса. Ничем: константа AM2302 равна DHT22, скетч тот же
- Кабель до датчика вырос с одного метра до двенадцати, появились редкие nan. Что сделать первым?
- Длинная линия размазывает фронты импульсов. Лечится кабелем получше и более жёсткой подтяжкой, поставленной у сенсора. Более частый опрос только добавит nan, а 47 кОм ослабят линию до полной потери сигнала. Поставить витую пару и подтяжку 4,7 кОм у самого сенсора
- Почему нельзя заливать сенсор и его платку термоклеем или убирать в герметичный пакет?
- Ёмкостному сенсору нужен доступ влажного воздуха. В герметичном чехле он честно измерит климат чехла, который совпадает с улицей только первые минуты. Датчику нужен обмен с воздухом, а герметичный чехол измеряет свой внутренний климат
- К утру уличный датчик регулярно выдаёт nan, днём работает. Главный подозреваемый?
- Ночью корпус остывает, влажный утренний воздух выпадает каплей на решётку и рвёт обмен. Решётка вниз, крыша-экран и вентиляция решают; заодно осмотрите сенсор на мошек и серый налёт внутри решётки. Конденсат на остывающем корпусе
- Зачем в скетче урока проверка if (millis() - last < 2000) return;?
- Таймер на millis держит частоту опроса в рамках даташита, не останавливая остальной код — в loop спокойно живут сервы, экраны и кнопки. Чтобы loop не блокировался delay, а опрос шёл по расписанию раз в две секунды