Первую неделю с двумя DHT22 я не мог отделаться от ощущения, что один из них врёт. Детская показывала 23,4, коридор — 24,1, при открытых дверях и единственном радиаторе на оба помещения. На прямой вопрос «которому верить» я честно ответил: не знаю. Ответ правильный, но держаться на нём долго нельзя: рано или поздно на показания кого-то из пары завяжется решение — порог проветривания, реле обогревателя, запись в журнал.
Сразу оговорка про архитектуру: два конструктора, два пина, по подтяжке 10 кОм у каждой линии — механика подключения и поочерёдный опрос разложены в уроке про несколько DHT на одной плате, повторять его не буду. Здесь следующий шаг, до которого там не дошло дело: не просто показывать две комнаты, а решать, кто из двух сенсоров сегодня честнее. Инструмент один — правильная выборка. Одиночная проба с DHT — лотерейный билет: паспортные ±0,5 °C относятся к серии измерений, а не к отдельно взятому числу на экране, и строить вердикты на одной пробе — всё равно что судить о датчике по одному кадру.
Пара слов о масштабе задачи. Один сенсор меряет одну точку, и все его слабости — допуск, выбросы, самонагрев — напрямую уезжают в решение порога. Пара меряет уже согласованную картину: расхождение становится прибором, который ловит движение воздуха между комнатами, но только если вы заранее знаете, сколько шума пара добавляет к истине. Эту цену мы сейчас посчитаем, а потом выжмем из пары максимум честности выборкой — и тогда решение, которому верить, перестанет быть вопросом веры.
Арифметика двух допусков
Расхождение двух исправных DHT22 в пределах градуса — не поломка, а арифметика. У каждого сенсора паспорт ±0,5 °C, и в худшем случае один уехал вверх на полградуса, второй вниз на полградуса — вилка в целый градус при одинаковом воздухе. Влажность расходится ещё смелее: ±2-5 % у каждого дают до десяти процентов разницы между парой, и это тоже формально исправно. Поэтому дельту между комнатами меньше единицы я давно не считаю событием — это шум двух сенсоров, из которого легко наделать себе ложных тревог и зря перезапускать вентиляцию. Той зимой я неделю преследовал мифический сквозняк, который «продувал детскую»: по одиночным пробам дельта скакала от нуля до полутора, а после переезда на медианы выяснилось, что стабильная вилка у пары — четыре десятых, и сквозняка никакого не было.
Волноваться стоит, когда вилка пробита устойчиво: расхождение держится несколько опросов и не гаснет при смене условий. Первая проверка стоит ноль рублей — поменяйте датчики местами. Вилка уехала вместе с сенсором — врёт он, и сверка с эталонным термометром покажет, насколько именно: я так однажды нашёл экземпляр с личным смещением минус полтора градуса. Вилка осталась на месте — врёт место: сквозняк у двери, поток от стояка, самонагрев о розетку за спиной датчика. Перестановка делит вину за полминуты, пока перенос обоих приборов на один стол занимает вечер.
| Расхождение пары DHT22 | Вердикт | Что делаю |
|---|---|---|
| до 0,3 °C | идеальная пара | ничего — собственный шум двух сенсоров |
| 0,3-1,0 °C | внутри паспортов: ±0,5 у каждого складываются | поправка смещения, если на показания завязан порог |
| 1-2 °C | кто-то стоит не там | перестановка местами: вилка уехала с сенсором — виноват он |
| больше 2 °C | один врёт всерьёз | эталонная сверка и проверка на подделку: фальшивки лгут именно так |
Выборка из пяти: медиана глушит выброс
Вторая причина не верить одиночной пробе — выбросы. Раз в сотню-другую чтений DHT22 отдаёт мусор: сквозняк прошёл мимо корпуса, наводка дёрнула длинную линию, пересчёт внутри сенсора поймали на середине. Среднее арифметическое этот мусор послушно тащит в итог: одна проба с плюсом три градуса в серии из пяти уводит среднее на шесть десятых — больше всей паспортной точности. Медиана делает с выбросом то, чего среднее не умеет в принципе: сортируем пять чисел, берём третье — улетевший замер оказывается крайним и в середину попасть не может. Он не участвует, и его даже не надо вылавливать вручную.
Проверка на пальцах: серия 23,1 / 23,2 / 23,0 / 26,1 / 23,2. Среднее — 23,72: полградуса вранья из-за одной пробы. Медиана — 23,2: сортировка отправила выброс в край, а четыре чистых значения собрали честную середину. Из пяти проб можно испортить хоть две — серединка всё равно сложится из чистых; серия из трёх спасает от одного выброса и не больше. Отсюда мой выбор размера: пять, а не три, а сверху — потолок здравого смысла: DHT22 пересчитывает показания раз в две секунды, и интервал опроса не даст уплотнить серию быстрее шага 2,1 с. Пять проб с этим шагом — десять секунд на сенсор: для климата мгновенно, для жёсткой сигнализации — долго, там медиана из трёх. Влажность проходит через тот же конвейер: те же пять проб, та же сортировка, в журнал уходят обе медианы. Отдельный бонус нечётного размера: медиана пяти всегда равна одному из реальных замеров — в журнале не появится числа, которого сенсор не отдавал.
Среднее не выбрасывайте — для ровного климата без выбросов оно совпадает с медианой до сотых. Разница между ними — сама по себе диагностика: медиана ушла от среднего заметно — в серии был выброс, и журнал об этом скажет без единой дополнительной строки кода. Я печатаю обе оценки рядом и раз в неделю бегло сверяю: медиана стабильно ниже среднего на две-три десятых — где-то рядом источник коротких тепловых пшиков. У меня им дважды оказывалась дверь кладовки в жаркий день, и оба раза сквозняк был не виден ни на графике температуры, ни в датчике движения. На графике разницу удобно держать отдельной колонкой: median-minus-mean, по десятку знаков в минуту, и чужой палец у датчика виден в логе как всплеск колонки, даже если сама температура успела выровняться.
#include "DHT.h" DHT dhtA(2, DHT22); // датчик А - детскаяDHT dhtB(3, DHT22); // датчик Б - коридор const int N = 5; // размер серииfloat series[N]; // сюда ложатся пробы // серия из N проб с шагом 2,1 с -> медианаfloat medianBurst(DHT &sensor) { for (int i = 0; i < N; i++) { series[i] = sensor.readTemperature(); delay(2100); // DHT22 пересчитывается раз в две секунды } for (int i = 1; i < N; i++) { // сортировка вставками float key = series[i]; int j = i - 1; while (j >= 0 && series[j] > key) { series[j + 1] = series[j]; j--; } series[j + 1] = key; } return series[N / 2]; // середина отсортированной серии} void setup() { Serial.begin(9600); dhtA.begin(); dhtB.begin(); Serial.println("sverka: mediany po 5 prob s kazhdogo");} void loop() { float tA = medianBurst(dhtA); // серия А: около 10 секунд float tB = medianBurst(dhtB); // серия Б: ещё около 10 секунд float delta = tA - tB; Serial.print("A="); Serial.print(tA, 1); Serial.print(" B="); Serial.print(tB, 1); Serial.print(" delta="); Serial.println(delta, 1); if (abs(delta) <= 1.0) { Serial.println("verdict: v vylke, oba ispravny"); } else if (abs(delta) <= 2.0) { Serial.println("verdict: kto-to stoit ne tam - perestavte mestami"); } else { Serial.println("verdict: odin vret vserez - etalonnaya sverka"); } delay(30000); // сверку повторяю раз в полминуты}Что делать с расхождением
У сверки три честных исхода. Первый — поправка: смещение экземпляра вписывается константой в шапку скетча, и для пары это выглядит как выравнивание обоих к общему знаменателю. Поправку я подписываю прямо на корпусе: малярный скотч, дата, минус 0,4 — через полгода в скетче две константы, и без наклейки не вспомнишь, которая чья. Второй — переезд: вилка оказалась вопросом позиции, и датчик съезжает от стены, от розетки, от потока батареи; правила установки при этом не меняются — монтаж и подтяжка описаны для одиночного сенсора и переносятся на пару как есть. Третий — примирение: если пара меряет дельту, абсолютная точность каждого не важна вовсе, и с вилкой внутри градуса спокойно живёт половина моих установок.
Медиану я после той зимы оставил в постоянных скетчах кухни и прихожей — там двери и сквозняки, и выбросы случаются по несколько за день. Спальня живёт со средним: климат ровный, а я люблю видеть в журнале сотые доли от скольжений. Оба журнала храню рядом, потому что история вилки полезнее истории температуры: она показывает, когда в доме что-то менялось, ещё до того, как заметили люди. Если же сверка показала, что второй сенсор принципиально честнее первого — возможно, дело не в экземпляре, а в классе прибора, и пора считать, что даст переезд на другой тип датчика. Этому расчёту — ценам, паспортам и шинам — посвящён следующий урок.
- Вилка двух исправных DHT22 — до 1,0 °C: паспортные ±0,5 складываются; влажность расходится до 10 % и это тоже норма.
- Один выброс +3 °C тянет среднее из пяти проб на +0,6, медиану — на ноль: сортировка отправляет выброс в край.
- Пять проб с шагом 2,1 с — рабочий размер серии: меньше трёх не спасает от двух выбросов, больше — трата минут.
- Перестановка датчиков местами делит вину: вилка уехала с сенсором — виноват он, осталась на месте — виновато место.
- Медиана и среднее в одном журнале — детектор выбросов: разошлись на 0,3 и больше — в серии был мусор.
- 1. Два исправных DHT22 в одной комнате показывают 23,2 и 24,0 °C. Главный вывод?
- 2. Один выброс +3 °C в серии из пяти проб уводит среднее на...
- 3. Почему пробы в серии разнесены на 2,1 секунды?
- 4. Чему равна медиана серии 23,1 / 26,1 / 23,0 / 23,2 / 23,2?
- 5. Датчики поменяли местами — вилка уехала вместе с одним из них. Виноват...
Частые вопросы по теме урока
- Два исправных DHT22 в одной комнате показывают 23,2 и 24,0 °C. Главный вывод?
- В худшем случае один сенсор уехал вверх на полградуса, второй вниз на полградуса — вилка в градус при одинаковом воздухе лежит внутри паспортов. Тревога — только при устойчивом выходе за вилку. Вилка до 1,0 °C складывается из двух паспортов ±0,5 — это исправность
- Один выброс +3 °C в серии из пяти проб уводит среднее на...
- 3,0 / 5 = 0,6 — одна испорченная проба стоит полградуса вранья в среднем значении. Медиана при этом не сдвигается вовсе: выброс после сортировки оказывается крайним. +0,6 °C — больше паспортной точности
- Почему пробы в серии разнесены на 2,1 секунды?
- Между пересчётами сенсор отдаёт то же число, и уплотнение серии только тратит время. Шаг 2,1 с гарантирует, что каждая проба — новое измерение, а пять проб занимают десять секунд. DHT22 пересчитывает показания раз в две секунды — чаще пробы дублируют одно значение
- Чему равна медиана серии 23,1 / 26,1 / 23,0 / 23,2 / 23,2?
- После сортировки ряд выглядит так: 23,0 / 23,1 / 23,2 / 23,2 / 26,1. Третий элемент — 23,2. Среднее той же серии — 23,72: разница и есть цена одного выброса. 23,2
- Датчики поменяли местами — вилка уехала вместе с одним из них. Виноват...
- Если расхождение путешествует вместе с прибором, врёт экземпляр — дальше эталонная сверка и поправка. Если вилка осталась на месте, врёт позиция: сквозняк, стояк, самонагрев. сам сенсор