DHT22 на улице: датчик зимой, защита от непогоды и монтаж
Первый уличный термометр я собрал на DHT11 и повесил за окно в октябре. До декабря цифры сходились с прогнозом, потом ударил мороз в минус семь — и вместо температуры стал приходить nan: паспорт DHT11 простирается от нуля до плюс пятидесяти, минусовую половину года он не видит в принципе. Замена на DHT22 с диапазоном −40…+80 °C честно ожила, но и он у меня умер за один сезон — не от холода, а от росы, ночами оседавшей на открытом сенсоре. Улица испытывает датчик тремя вещами сразу: морозом ниже нуля, влажностью до ста процентов и солнцем, которое греет тёмный корпус на пять-десять градусов сильнее воздуха.
Ниже — расклад, какой датчик реально живёт на стене: таблица DHT22 vs DHT11 рядом с DS18B20 и BME280, схема с подтяжкой на длинном проводе, два скетча с отсевом мусорных значений и таблица сценариев монтажа — от козырька до метеорологической высоты два метра. Распиновка, библиотека DHT и первый скетч разобраны в лендинге про подключение DHT22; здесь — уличная специфика: кожух, роса, иней и место на фасаде. Логику обоих скетчей можно прокрутить в симуляторе — DHT эмулируется там ползунками температуры и влажности, так что минус тридцать доступен и летом.
Почему уличная зима выносит не всякий датчик
Кажется, что главное на улице — мороз, и для него достаточно широкого диапазона. Реальных убийц три, и мороз в них не самый быстрый. Первый — роса: ночью относительная влажность доходит до ста процентов, влага оседает на самой холодной поверхности, и открытым сенсором оказывается сам DHT. Второй — переход через ноль: осевшая за ночь капля утром замерзает, и ёмкостный элемент в ледяной корке занижает показания, пока оттепель не снимет корку. Третий — солнце: тёмный корпус на прямом свете уходит на пять-десять градусов выше воздуха, и датчик честно пишет ерунду. Отсюда и таблица выбора: широкий диапазон без защиты от влаги улицу не выигрывает.
| Параметр | DHT11 | DHT22 | DS18B20 | BME280 |
|---|---|---|---|---|
| Диапазон температуры | 0…+50 °C | −40…+80 °C | −55…+125 °C | −40…+85 °C |
| Влажность | 20–80 %RH | 0–100 %RH | не меряет | 0–100 %RH |
| Точность | ±2 °C и ±5 %RH | ±0,5 °C и ±2 %RH | ±0,5 °C в коридоре −10…+85 °C | ±1 °C и ±3 %RH |
| Темп опроса | 1 Гц | 0,5 Гц | конверсия до 750 мс | десятки замеров в секунду |
| Линия и провод | 1 провод, пара метров | 1 провод, 2-5 м с подтяжкой у датчика | 1-Wire, витая пара тянет 10-30 м | I2C, короткие провода, 3,3 В |
| Цена модуля | около 100-150 ₽ | 250-400 ₽ | зонд 150-300 ₽ | 500-800 ₽ |
Расшифровка короткая. DHT11 — комнатный датчик: его 0…+50 °C на улице заканчиваются в первый мороз, зато за сотню-полторы рублей в квартире он незаменим. DS18B20 влажность не меряет вовсе, зато зонд в металлической гильзе выводится кабелем на десять-тридцать метров и не боится ни дождя, ни сугроба. BME280 добавляет к температуре и влажности атмосферное давление — по тренду давления самодельная метеостанция угадывает циклон раньше окна, но модуль требует 3,3-вольтовой логики и стоит как три DHT22. Мой выбор для стены дома — DHT22 в кожухе: уличная влажность нужна для точки росы и решения о проветривании, а точности ±0,5 °C хватает с запасом. Противостояние двух DHT по цифрам разобрано в уроке про выбор DHT11 против DHT22.
Схема: подтяжка и длина провода на улице
Базовая схема на три провода не меняется: VCC к пяти вольтам, DATA к любому цифровому пину, GND к земле, между DATA и питанием подтяжка 4,7-10 кОм. Уличная поправка — в размещении резистора: если кабель длиннее двух метров, подтяжка ставится вплотную к датчику, у конца линии, а не у платы. На трёх метрах витой пары со штатной подтяжкой модуля у меня чтения сыпались через раз; перенос резистора к сенсору вернул связь в тот же вечер. За пятью метрами добавьте конденсатор 100 нФ от питания к земле у датчика, а темп держите раз в две секунды: потолок 0,5 Гц прописан в паспорте, и его механика разобрана в уроке про интервал опроса.
#include <DHT.h> DHT dht(2, DHT22); // за окном: витая пара 3 м, подтяжка 5,1 кОм у сенсора float tMin = 100.0, tMax = -100.0;unsigned long lastPoll = 0; void setup() { Serial.begin(9600); dht.begin();} void loop() { if (millis() - lastPoll < 2000) return; // 0,5 Гц — паспортный потолок lastPoll = millis(); float t = dht.readTemperature(); float h = dht.readHumidity(); bool tReal = (t > -40.0) && (t < 80.0); // nan провалит обе проверки сам bool hReal = (h >= 0.0) && (h <= 100.0); if (!tReal || !hReal) { Serial.println("vyhod za granicu fiziki, propusk"); return; } if (t < tMin) tMin = t; if (t > tMax) tMax = t; Serial.print("t="); Serial.print(t, 1); Serial.print(" h="); Serial.print(h, 0); Serial.print(" % min="); Serial.print(tMin, 1); Serial.print(" max="); Serial.println(tMax, 1);}Сравнение с границами диапазона тут не украшение: nan, который приходит от сорвавшейся линии, проваливает обе проверки сам — nan не больше даже собственной границы, так что мусор отсекается без isnan(). Рекорды суток живут в памяти до первой перезагрузки, и этого хватает, чтобы за неделю понять, куда смотрит ваш фасад: на север с его ровным минусом или на юг с провалами на солнце. Сезонные минимумы и максимумы с записью в EEPROM — тема отдельного проекта; здесь цель одна — не кормить логику мусором.
Кожух и место: пять решений монтажа
Рабочий кожух собирается за вечер: белый пластиковый стакан вверх дном, стенки в перфорации, снизу свободный продув сантиметра на полтора. Дырки снизу не декоративны — тёплый влажный воздух поднимается, и конденсат уходит из корпуса, а не капает на сенсор. Белый цвет — вторая половина дела: он отражает излучение, от которого тёмная коробка уходит на пять-десять градусов выше воздуха. Конструкцию с проверкой «подышать через трубку» и проводом на длинной линии я разбирал в уроке про датчик за окном, крепление с пайкой и герметиком на вводе — в уроке про установку AM2302. Сводка решений — в таблице ниже.
| Решение | Как выглядит | Эффект |
|---|---|---|
| Навес или козырёк | полка сверху, боковины открыты, датчик не прижат к стене | капли и косой дождь мимо, но солнце и застой воздуха остаются |
| Перфорированный кожух | белый стакан с дырками вверх дном, продув снизу 1-2 см | цифры сходятся с теневой температурой до градуса, роса не задерживается |
| Северная стена | сторона без прямого солнца, 30-50 см от поверхности | стена не греет датчик зимой и не отдаёт своё тепло летом |
| Высота 1,5-2 м | крепление на уровне груди, выше снежного покрова | метеорологический стандарт: сугроб не глотает датчик, слой холода у земли не мешает |
| Петля кабеля на вводе | провод входит снизу и провисает петлёй до крепления | капли стекают по петле мимо кожуха, влага не поднимается к сенсору |
Решения из таблицы не конкурируют, а складываются: козырёк без перфорации ловит солнце, северная стена без кожуха всё равно ночует под росой, а кожух в сугробе меряет снег. Мой итоговый узел — кожух на северной стене на высоте груди, ввод кабеля с петлёй, крепление через резиновую прокладку, чтобы вибрация рамы не дорезала пайку. Если выбор места неочевиден, соберите два кожуха и повесьте рядом на неделю: расхождение в пару градусов между удачным и неудачным местом видно уже к третьему дню.
Мороз, иней и точка росы
// Точка росы по Магнусу: улица -2 °C при RH 96 % — воздух суше, чем кажется#include <DHT.h> DHT dht(2, DHT22); void setup() { Serial.begin(9600); dht.begin();} void loop() { delay(2000); // 0,5 Гц — паспортный потолок DHT float t = dht.readTemperature(); float h = dht.readHumidity(); if (!(t > -40.0 && t < 80.0) || !(h >= 0.0 && h <= 100.0)) return; float alpha = (17.27 * t) / (237.7 + t) + log(h / 100.0); float dew = (237.7 * alpha) / (17.27 - alpha); Serial.print("t="); Serial.print(t, 1); Serial.print(" rh="); Serial.print(h, 0); Serial.print(" % rosa="); Serial.println(dew, 1);}Проверка на живых числах: улица минус два при влажности 96 % даёт точку росы минус два-три — ниже неё в этом воздухе влага уже не выпадет, хотя сама цифра влажности пугает. Мороз при этом DHT22 не страшен: паспортует минус сорок, и после ночи в минус тридцать цифры обновляются ленивее, но остаются честными. Опасен переход через ноль — осевшая за влажную ночь капля утром застывает коркой на ёмкостном элементе, и показания плывут до оттепели. Странные числа после ледяной ночи сверяйте вторым сенсором, а стабильно молчащий датчик разбирайте по чек-листу диагностики nan. Формула Магнуса с коэффициентами и таблицей примеров — в уроке про точку росы.
Чек-лист перед первой зимой
- датчик для улицы — DHT22: DHT11 с диапазоном 0…+50 °C первый мороз встречает nan и после оттепели не оживает
- кожух дышит: перфорация, продув снизу, белый цвет; герметик — только на ввод кабеля, не рядом с сенсором
- провод длиннее двух метров — подтяжка 5-10 кОм вплотную к датчику; дальше пяти метров — плюс 100 нФ у сенсора
- опрос раз в две секунды, значения вне −40…+80 °C и 0-100 % игнорируются, рекорды и срывы чтений считаются с осени