Весь прошлый сезон я вёл журнал погреба в блокноте: 22 °C и 71 % — вроде нормальные цифры, я даже гордился стабильностью. Пока в июле не открыл ящик с банками и не увидел белую плёнку плесени на крышках. Датчик не врал: 22 градуса и 71 процент были честными. Просто эти два числа не отвечают на вопрос, который меня волновал: «выпадет ли влага на холодной банке?». А третья величина — точка росы — отвечала бы сразу: при 22 °C и 71 % она равна 16,8 °C, то есть любая поверхность холоднее 17 градусов стоит покрытая плёнкой воды.
Точка росы — это одна строка математики поверх данных DHT, и она превращает «температура плюс влажность» в понятное решение: проветривать, осушать или спать спокойно. В этом уроке выведем формулу Магнуса в код на две строки, проверим её контрольными значениями, поймём, где она врёт и на сколько, и соберём скетч, который сам поднимает тревогу, когда до конденсата остаётся три градуса.
Физика на полстакана: откуда берётся конденсат
Относительная влажность — это доля водяного пара в воздухе по отношению к максимуму при текущей температуре. Ключевое — «при текущей»: охладите воздух, и максимум упадёт, а доля вырастет. Продолжайте охлаждать — доля дойдёт до ста процентов, и дальше лишний пару некуда девать: он начнёт оседать жидкостью на ближайшей холодной поверхности. Само количество пара в кубометре при этом не менялось — изменился потолок насыщения, и точка росы просто переводит «сколько пара уже есть» в температуру, при которой этот потолок будет достигнут.
Точка росы — это та самая температура, при которой влажность доходит до ста процентов. Если какая-то поверхность в комнате холоднее точки росы — на ней будет конденсат, без вариантов. Пример из жизни: в комнате 24 °C и 55 %, точка росы около 14,4 °C. Зимой стекло с внутренней стороны остывает до 10–12 градусов — и оно холоднее точки росы, вот вам капли на окне. Датчик показывает одни числа, физика считает другие, и именно третья величина объясняет, почему запотевает стена за шкафом, а не стена у батареи.
Формула Магнуса: две строки кода
Точную зависимость давления насыщенного пара от температуры аналитически не записывают — она громоздкая. Метеорологи сто лет пользуются аппроксимацией Магнуса-Тетенса, и для бытовых задач её хватает с запасом. Считается в два приёма: сначала промежуточная величина альфа по температуре и влажности, потом сама точка росы из альфы:
alpha = ln(RH / 100) + (a * T) / (b + T), затем Td = (b * alpha) / (a - alpha), где a = 17.27, b = 237.7. Константы подобраны для воздуха примерно от нуля до 60 °C — как раз диапазон даташита DHT11, — и в этом коридоре ошибка формулы порядка ±0,4 °C, то есть заметно меньше погрешности самого датчика. За границей диапазона — мороз под −30 или сауна за 80 — берут другие наборы констант, но у DHT туда дороги всё равно нет. Для прикидок в голове полезно грубое правило: вблизи 20 °C каждый градус охлаждения поднимает относительную влажность примерно на шесть процентов — так видно, как быстро сырой воздух подбирается к насыщению.
Одна защита обязательна: при RH = 0 логарифм уходит в минус бесконечность, и точка росы улетает за пределы разумного. DHT11 физически не выдаёт ноль при живом воздухе, но nan или мусорное чтение — может, поэтому в коде ставлю проверку: влажность ниже одного процента — функцию не звать.
#include "DHT.h" DHT dht(2, DHT11); // датчик на пине D2 float dewPoint(float t, float h) { float a = 17.27; float b = 237.7; float alpha = log(h / 100.0) + (a * t) / (b + t); return (b * alpha) / (a - alpha);} void setup() { Serial.begin(9600); dht.begin();} void loop() { float t = dht.readTemperature(); float h = dht.readHumidity(); if (h < 1.0) { Serial.println("humidity fail: точку росы не считаю"); } else { float td = dewPoint(t, h); Serial.print("t = "); Serial.print(t); Serial.print(" h = "); Serial.print(h); Serial.print(" td = "); Serial.println(td); if (t - td < 3.0) { Serial.println("risk: до конденсата меньше 3 градусов"); } } delay(2500);}Три места в коде, где я спотыкался лично. Первое: log() в Arduino — натуральный логарифм, тот самый ln из формулы; десятичный называется log10(), и перепутать их — классика, история в блоке ниже. Второе: деление h / 100.0 — именно с точкой, потому что h float, но привычка ставить 100.0 в формулах спасает от целочисленных сюрпризов, если однажды смените тип переменной. Третье: печать парами t =, h =, td = — её без переделок понимает Serial Plotter, и точка росы ложится на график четвёртой линией под температурой. Обе величины — float из функций чтения DHT, округление до двух знаков делает сам Serial.print.
Порог три градуса — не магия, а рабочий компромисс. Если воздух всего на три градуса теплее точки росы, конденсат появляется на любых слегка холодных поверхностях: труба у наружной стены, объектив в коробке, крышка банки в погребе. При разнице в пять-шесть градусов влага живёт только на по-настоящему холодных предметах. Порог можно поднять до пяти, если вы перестраховываетесь, — скажем, для зимней дачи, куда едут раз в месяц, — или опустить до двух, если контроль у вас автоматический: осушитель с гистерезисом успеет отработать раньше, чем плесень заметит.
Как пользоваться скетчем в жизни: повесьте датчик в объём, а вторым термометром — хоть мультиметром с термопарой — проверьте температуру самой холодной поверхности: стены за шкафом, пола в углу. Если она ниже td из монитора — конденсат уже идёт, как бы ни был хорош воздух в центре комнаты. Зимой формула работает и в квартире: 24 °C при 30 % дают точку росы около 5,3 °C, то есть конденсат живёт только на стекле, которое касается мороза. А рост влажности зимой — повод искать источник: готовка без вытяжки, сушка белья у батареи.
| t, °C | RH, % | Точка росы, °C | Что это значит на практике |
|---|---|---|---|
| 15 | 85 | 12,5 | сырой подвал: почти любая стена холоднее и потому мокрая |
| 20 | 50 | 9,3 | сухая комната: конденсат только на по-настоящему морозном стекле |
| 20 | 80 | 16,4 | сырая квартира: плесень расцветает в холодных углах |
| 25 | 70 | 19,1 | теплица в июле: пора проветривать, стекла потеют снаружи |
| 30 | 60 | 21,4 | лето перед дождём: душно, но капать начнёт лишь на холодном |
Сколько верить полученному числу
Формула точнее датчика, и это надо честно признать. Ошибка Магнуса — порядка ±0,4 °C, но на вход она получает данные DHT11 с точностью ±2 °C по температуре и ±5 % по влажности, и погрешность входа протаскивается на выход: точка росы по DHT11 честно верна с разбросом ±2–3 °C. С DHT22, у которого ±0,5 °C и ±2 %, итоговый разброс укладывается примерно в ±1 °C. Именно поэтому разница датчиков важна не только на морозе — сравнение DHT11 и DHT22 мы делали по этому же принципу.
Отсюда моё правило печати: точку росы округляю до десятых, но никогда не печатаю сотые — сотые доли в числе, у которого погрешность в градусы, это самообман и места в логе. Решения принимаю не по абсолюту, а по порогу с запасом: «меньше трёх градусов — проветрить» работает у меня в погребе уже второй сезон, и запас перекрывает ошибку датчика, поэтому ложных тревог за это время не было ни одной. А для журнала точка росы удобнее обоих сырых чисел: одна колонка в логе на SD-карте отвечает на вопрос, за которым раньше ходили с двумя.
Кстати, работа с формулой и константами — тот же приём, что в уроке про термистор NTC и уравнение Стейнхарта-Харта: там из сопротивления получали температуру через логарифм, здесь из влажности — точку росы. А сама функция dewPoint() собрана по канонам урока про свои функции в скетче: на входе два float, на выходе один, никаких глобальных переменных — переносите в любой проект без правок. Имя переменной td я везде держу одинаковым — при переносе между проектами не путаюсь, где температура, а где точка.
- 1. Что такое точка росы одним предложением?
- 2. Какие константы в формуле Магнуса из этого урока?
- 3. Какая функция считает натуральный логарифм в Arduino?
- 4. DHT11 меряет с точностью ±2 °C и ±5 %. С каким разбросом верна точка росы?
- 5. Скетч напечатал t − td = 2,4 °C. Ваши действия?
- Точка росы отвечает на вопрос «будет ли конденсат»: поверхность холоднее Td — влага появится обязательно.
- Формула Магнуса: alpha = ln(RH/100) + 17.27·T/(237.7+T), Td = 237.7·alpha/(17.27−alpha) — две строки кода.
- log() в Arduino — натуральный логарифм; log10() — десятичный, перепутаете — получите минус сорок.
- По DHT11 точка росы верна с разбросом ±2–3 °C, по DHT22 — около ±1 °C: печатайте десятые, решения принимайте по порогу с запасом.
- Разница t − td меньше трёх градусов — сигнал проветрить или включить осушитель до того, как поплывут крышки.
Частые вопросы по теме урока
- Что такое точка росы одним предложением?
- Охлаждая воздух до точки росы, мы доводим относительную влажность до ста процентов. Любая поверхность холоднее — мокрая. Температура, при которой воздух насыщен влагой на 100 % и начинается конденсат
- Какие константы в формуле Магнуса из этого урока?
- Для бытового диапазона 0–60 °C стандартный набор — a = 17.27, b = 237.7. Ошибка формулы при этом порядка ±0,4 °C. a = 17.27 и b = 237.7
- Какая функция считает натуральный логарифм в Arduino?
- В C++ log() — натуральный логарифм ln, а log10() — десятичный. Перепутаете — точка роса уедет в минус сорок. log()
- DHT11 меряет с точностью ±2 °C и ±5 %. С каким разбросом верна точка росы?
- Погрешность входа протаскивается на выход: по DHT11 точка росы верна с разбросом ±2–3 °C, по DHT22 — примерно ±1 °C. Сотые в печати — самообман. Порядка ±2–3 °C
- Скетч напечатал t − td = 2,4 °C. Ваши действия?
- Разница меньше трёх градусов — зона риска: конденсат уже появляется на холодных поверхностях. Порог тревоги из скетча как раз на этот случай. До конденсата рукой подать: проветрить, осушить, проверить холодные поверхности