На полке над столом у меня живут оба метеосенсора, подключённые к одной плате: DHT22 на выносе и BME280 на шине. Однажды я открыл два монитора бок о бок и не поверил: DHT22 говорил 22,6, BME280 — 24,1. Полтора градуса — это не «погрешность», это другая комната. Первый рефлекс был заказать третий датчик судьёй; второй — сесть и разобраться, кто из двоих врёт и за чей счёт. Разобрался — и теперь считаю тот вечер самым полезным в моём датчиковом хозяйстве.
Короткий ответ, портящий всю интригу: врать не врут оба. У каждого паспорт ±0,5 °C, и уже одна эта вилка легально разводит показания на целый градус. Остальное — не про точность кристаллов, а про то, где физически сидит сенсор и что его греет: плата, стабилизатор, соседний дисплей. Этот урок — про чтение паспортов вслух, про самонагрев, про поправку в полтора градуса и про честный ответ на вопрос, когда вместо обоих хватит DHT11 за сотню рублей. И заметьте: спор случился в комнате на двенадцать метров, где ни один сенсор не двигался неделями — место тут ни при чём.
Выбор между семействами мы уже делали в уроке про доплату за давление — там цена, ресурс и гибриды. Здесь я беру другой слой: не «что купить», а «почему они спорят на одной полке» и как заставить спорить честно. Если под рукой есть оба прибора, соберите схему из урока и повторите измерения: сверка двух сенсоров между собой и с эталоном — лучший способ узнать свои приборы, методика калибровки подойдёт без изменений.
Паспорта: три сенсора в одной таблице
| Свойство | DHT11 | DHT22 | BME280 |
|---|---|---|---|
| Температура | 0…+50 °C, ±2 °C | −40…+80 °C, ±0,5 °C | −40…+85 °C, ±0,5-1 °C |
| Влажность | 20-80 %, ±5 % | 0-100 %, ±2-5 % | 0-100 %, ±3 % |
| Шина и темп | 1 провод, 1 Гц | 1 провод, 0,5 Гц | I2C 0x76/0x77, 1-10 Гц |
| Давление и цена | нет; 1× | нет; 2-3× | 300-1100 гПа; 3-4× |
Скорость — самое недооценённое различие. BME280 в обычном режиме пересчитывает показания до десяти раз в секунду, DHT22 — раз в две. Для термостата и метеостанции обе цифры избыточны: воздух меняется на порядок медленнее. Но живой график при отладке вентилятора или фена рисует только I2C-сенсор: на десятке точек в секунду виден отклик крыльчатки за секунды, тогда как DHT22 рисует ту же историю ступенями с плоскими террасами. Механику темпа и его пол у DHT мы считали в уроке про интервал опроса.
Влажность на бумаге честнее у DHT22: ±2 % против ±3 % у BME280. Но паспорт — разброс нового прибора, а не судьба через три года. Влажностный элемент DHT — расходник: он деградирует от сухого воздуха и конденсата, и через два-четыре сезона прибор начинает заметно врать. Кристалл Bosch за стеклом с мембраной стареет несопоставимо медленнее, поэтому за BME280 я плачу не за сегодняшнюю влажность, а за то, что она останется такой же через пять лет.
И цена. Против синего DHT11 модуль BME280 стоит в три-четыре раза дороже, против DHT22 — примерно вдвое, корзину мы считали в уроке про выбор. Каждая цифра по отдельности ничего не решает; решает их сумма: темп выше на порядок, шина экономит пины, ресурс дольше — и всё это за двукратную доплату к белому сенсору. Теперь о том, почему два точных прибора на одной полке показывают разное.
Самонагрев: почему расходятся два правых прибора
BME280 сидит на плате рядом со стабилизатором и процессором, и кристалл греется от них, как от грелки: чип меряет не воздух комнаты, а воздух микроклимата платы. Даташит Bosch прямо требует выносить сенсор за пределы платы — off-chip, — но в самодельных проектах модуль чаще всего втыкают в макетку вплотную к Arduino, и полтора градуса самонагрева вписываются в результат гарантированно. DHT22 на выносе в двадцать сантиметров от платы этих градусов не видит — вот и вся тайна расхождения.
Отдельно про направление расхождения, потому что путаница здесь стоит дорого: греется BME280, значит завышает он, а не занижает DHT22. Секунда здравого смысла экономит вечер: поднесите оба прибора к открытому окну — оба поедут вниз, но кристалл с запаздыванием и с более высокой остановкой, он тёплый платой даже на морозе. Если после проветривания заниженным остался выносной DHT22 — вот тогда уже смотрите на его место установки: солнце, батарея или щель в стене рядом.
Примирять можно двумя путями, и они не исключают друг друга. Первый — механический: поднять модуль на проводах над платой или поставить в дальний угол макетки, куда не добирает тепло стабилизатора. Второй — арифметический: измерить смещение и вычесть его в коде. На моей полке поправка составила минус полтора градуса; для плотных плат обычно называют минус один — минус два. Это не взлом паспорта, а честная калибровка конкретной сборки: с DHT мы делали то же самое по эталонному термометру.
Подбирать поправку нужно при равных условиях, и вот здесь промахиваются чаще всего. Оба прибора обязаны простоять рядом минимум полчаса после включения: у DHT22 выход на режим — пара секунд, а самонагрев BME280 выходит на стационар десятками минут. Сравнивают в одной точке комнаты, вдали от окна и батареи, и берут не мгновение, а среднее за десять минут: мгновения гуляют на десятые доли у обоих. Кто врёт, так это мгновенный замер, а не сенсоры.
#include <Wire.h>#include <Adafruit_Sensor.h>#include <Adafruit_BME280.h>#include "DHT.h" DHT dht(2, DHT22); // воздух: вынос от платыAdafruit_BME280 bme; // климат платы: кристалл на шине const float CORR = -1.5; // поправка самонагрева: подобрать по эталонуconst unsigned long PERIOD = 2000;unsigned long lastPoll = 0; void setup() { Serial.begin(9600); dht.begin(); if (!bme.begin(0x76)) { // бывает 0x77 - сканер шины решит Serial.println("BME280 molchit: skaner shiny, pitanie 3.3V"); }} void loop() { if (millis() - lastPoll < PERIOD) return; lastPoll = millis(); float tDht = dht.readTemperature(); float hDht = dht.readHumidity(); float tBme = bme.readTemperature() + CORR; float hBme = bme.readHumidity(); float pmm = bme.readPressure() / 100.0F * 0.75006; Serial.print("dht t="); Serial.print(tDht, 1); Serial.print(" h="); Serial.print(hDht, 0); Serial.print(" | bme t="); Serial.print(tBme, 1); Serial.print(" h="); Serial.print(hBme, 0); Serial.print(" pmm="); Serial.print(pmm, 1); Serial.print(" delta="); Serial.println(tBme - tDht, 1);}Колонка delta в этом логе — главный индикатор сборки. Сразу после включения она уползёт вниз по мере прогрева кристалла: это не сенсор сходил с ума, а самонагрев выходит на стационар, подождите полчаса и записывайте. Стабильная дельта, скажем плюс полтора градуса, — то самое число, которое переезжает в константу CORR со знаком минус. Дельта, плавающая на градус туда-сюда, уже не про датчики: смотрите, не налетает ли сквозняк на вынос DHT22 и не включается ли рядом дисплей с подсветкой.
Темп опроса я оставил DHT-шный, две секунды, и для климата это честно. BME280 умеет быстрее на порядок, но смысл скорости возникает, когда вы отлаживаете не климат, а реакцию: обдув, открывание форточки, фен. Тогда период падает до ста-двухсот миллисекунд, и график из Serial Plotter показывает отклик системы в реальном времени — сюжет про плоттер собирает эту технику по шагам. DHT22 в такой роли бесполезен физически: никакая библиотека не заставит его обновляться чаще 0,5 Гц.
Поправка — свойство сборки, а не сенсора: на другой плате, с другим расположением модулей она другая, и переносить её между проектами нельзя. Я вписываю CORR в код одной константой с комментарием, где и как она снята — дата и прибор-эталон; через полгода это единственное, что отличит измеренную калибровку от числа с форума. Панель управления с ползунком поправки в постоянном приборе не нужна: отладили — зафиксировали.
Моё мнение с условиями, как обещал. Берите BME280 без раздумий, если верны хотя бы два пункта: нужны десятки точек в секунду для живого графика; пины на исходе, а шина уже крутится для дисплея или часов; прибор вешается на годы без обслуживания; давление нужно как данные, а не как бонус. Это не снобизм, а арифметика: каждая строка списка — та функция, за которую DHT не способен заплатить.
Противоположный случай, в котором я сам ставлю DHT11 и не жалею: учебный класс из двадцати макеток, термостат с окном в три градуса, задача «тепло или холодно». Паспорт с его ±2 °C здесь не помеха: окно автоматики на порядок шире погрешности, влажность нужна как факт, а корзина из двадцати сенсоров стоит как один BME280. Чек-лист из разбора пары DHT11 и DHT22 расширяется одним пунктом: если из списка выше не верно ничего — точный I2C не нужен, и это не экономия, а здравый смысл.
И финальный совет про полку. Если оба сенсора уже куплены, не выбрасывайте ни один: DHT22 на выносе меряет воздух комнаты, BME280 — давление и суточный тренд, и в связке они закрывают задачу целиком, как в гибриде датчика и барометра. Спор двух приборов на одной плате — не брак, а бесплатный диагностический инструмент: расхождение сверх полуградуса — первый сигнал, что в сборке что-то греется или гуляет сквозняком. За год такой пары я поймал два события: перегревшийся блок питания над макеткой и щель за шторой — оба раза вехи на полке сказали раньше, чем я почувствовал, а давление тем временем писал барометр в гибриде с DHT22.
- 1. DHT22 и BME280 в одной комнате расходятся на 1,4 °C. Первое объяснение?
- 2. Сколько раз в секунду умеет пересчитываться BME280?
- 3. Что советует даташит Bosch против самонагрева?
- 4. Как правильно измерить поправку самонагрева?
- 5. Задача: учебный термостат с окном в три градуса, двадцать макеток. Что берёте?
- Вилки паспортов ±0,5 °C у обоих легально разводят показания на градус — не всё расхождение есть вина сенсора.
- BME280: I2C 0x76/0x77, давление 300-1100 гПа, влажность ±3 %, темп 1-10 Гц против 0,5 Гц у DHT22.
- Самонагрев: off-chip размещение по даташиту или поправка -1...-2 °C, снятая после получасового прогрева.
- Поправку меряют средним за десять минут рядом с эталоном: мгновения гуляют на десятые у обоих.
- DHT11 остаётся правильным выбором для окон автоматики в три градуса и классов макеток.
Частые вопросы по теме урока
- DHT22 и BME280 в одной комнате расходятся на 1,4 °C. Первое объяснение?
- Два паспорта по ±0,5 °C уже дают вилку в градус, а самонагрев на плате добавляет ещё полтора. Брак — диагноз последним. Вилки паспортов плюс самонагрев кристалла на плате
- Сколько раз в секунду умеет пересчитываться BME280?
- BME280 в обычном режиме делает до десяти пересчётов в секунду против 0,5 Гц у DHT22 — живой график доступен только первому. До десяти — на порядок чаще DHT22
- Что советует даташит Bosch против самонагрева?
- Кристалл греется от соседей по плате. Даташит требует off-chip размещения; на плотной сборке смещение снимают поправкой. Выносить сенсор за пределы платы (off-chip) или вносить поправку -1...-2 °C
- Как правильно измерить поправку самонагрева?
- Самонагрев выходит на стационар десятками минут, а мгновения гуляют у обоих сенсоров. Честное число даёт только усреднение на прогретой паре. Через полчаса прогрева, средним за десять минут, рядом с эталоном
- Задача: учебный термостат с окном в три градуса, двадцать макеток. Что берёте?
- Окно автоматики в три градуса на порядок шире паспортных ±2 °C. Платить за темп, шину и давление в учебном классе незачем. DHT11: погрешность ±2 °C на порядок уже окна, а цена решает