Уличная метеостанция на DHT22 с трёхметровым шлейфом жила от перезагрузки до перезагрузки: линия длинная, наводки, nan пачками, подтяжку я менял трижды. А когда понадобилось атмосферное давление для графика грозы, DHT развёл руками — не умеет. Так я познакомился с BME280 и заодно обнаружил, что два провода I2C умеют вешать на себя и датчик, и дисплей, и часы, — вместо отдельного шлейфа на каждый прибор.
Это экскурсия по трём популярным преемникам DHT: BME280, SHT31 и Si7021. Разберём, что каждый умеет, чем платите — в рублях, в вольтах и в головной боли с адресами, — где прячется подделка даже здесь, и когда старый добрый DHT остаётся лучшим выбором. В симуляторе — сравнительная таблица в Serial: при одном и том же климате смотрим, какие интервалы погрешности записал бы в журнал каждый сенсор и кто из них различит смену на пару десятых градуса.
Три кандидата: кто что умеет
BME280 от Bosch — многостаночник: температура, влажность и атмосферное давление на одном кристалле, шина I2C, адреса 0x76 или 0x77. Точность температуры паспортная ±0,5–1 °C — на бумаге хуже, чем у DHT22, потому что кристалл греется сам и своё тепло меряет охотнее, чем воздух вокруг. Влажность ±3 %. Главный подарок — давление: метеостанция с ним становится настоящей, а не температурно-влажностной, и грозу видно за часы до фронта.
SHT31 от Sensirion — аристократ: ±0,2 °C и ±2 % влажности, лучшая пара цифр в любительском сегменте. Адреса 0x44 и 0x45 — на одной шине живут два сенсора, комнатный и уличный, без всяких мультиплексоров. Платите за это примерно как за два DHT22. Зато и темп другой: SHT31 честно измеряет до десяти раз в секунду, против двух секунд на пересчёт у DHT22 — для отслеживания быстрого сквозняка разница принципиальная. Si7021 от Silicon Labs — золотая середина: ±0,4 °C и ±3 % по цене около DHT22, самонагрев почти незаметен, экземпляры живут годами без капризов.
Общее у всех троих — шина I2C: два провода данных вместо одного у DHT, зато на них же садятся дисплеи, часы и память. Шину по полочкам мы раскладывали в уроке про два провода I2C, а адреса устройств ищутся сканером I2C за секунду: пробегитесь им перед подключением — спор датчика с дисплеем из урока про термогигрометр на LCD лечится джампером на модуле, а механику адресов 0x27 и 0x3F мы трогали при подключении LiquidCrystal по I2C.
| Сенсор | Шина, адреса | Температура | Влажность | Бонус | Когда беру |
|---|---|---|---|---|---|
| DHT22 | 1 провод, без адресов | ±0,5 °C, −40…+80 | ±2–5 % | цена, один пин | быстрый макет, длинная линия без шины |
| BME280 | I2C 0x76/0x77, есть SPI | ±0,5–1 °C | ±3 % | давление | погода, барометр, высота |
| SHT31 | I2C 0x44/0x45 | ±0,2 °C | ±2 % | два на одной шине | теплица, инкубатор — где нужна доля градуса |
| Si7021 | I2C 0x40 | ±0,4 °C | ±3 % | низкий самонагрев | универсальная замена DHT22 |
Ловушка BMP280 и другие грабли переезда
Ловушка номер один — BMP280. Тот же Bosch, тот же корпус, треть цены — и никакой влажности: чистый барометр с температурой. Модули с маркировкой BME280, внутри которых сидит BMP280, — классика маркетплейсов. Проверка железная: чип отдаёт регистр идентификатора, у BME280 там 0x60, у BMP280 — 0x58; свежие версии библиотеки Adafruit_BME280 сами ругаются, что нашли не того. Мой ритуал — после покупки печатать ID в Serial: сомнения заканчиваются в первую минуту, возврат — тоже.
Вторая грабль — питание. Голые сенсоры Bosch и Sensirion живут от 3,3 В, и 5 В на ножку питания убивает их молча. Модульные платы двух пород: со стабилизатором и согласователем уровней — тогда 5 В допустимы и написаны на плате, — и «голый чип на платке», которому 5 В противопоказаны. Прежде чем втыкать, посмотрите на плату: нет стабилизатора — питайте от 3,3 В. Линии SDA/SCL от 5 В пинов Uno прощают, подтяжки на модулях уже стоят.
Третья грабль — иллюзия, что «сейчас всё будет точно». Переезд на I2C-сенсор не отменяет самонагрев, сквозняки и солнце на корпус — он лишь сужает паспортную ошибку. И не выбрасывайте DHT после переезда: датчик на отдельном пине спасает, когда шина занята чем-то капризным, а плата — ATtiny с парой свободных ног. Мой выбор по умолчанию для комнатного термостата — по-прежнему DHT из первого урока раздела, а расклад по моделям — в уроке про выбор между DHT11 и DHT22; BME280 едет туда, где нужно давление.
#include <Wire.h>#include <Adafruit_Sensor.h>#include <Adafruit_BME280.h> Adafruit_BME280 bme; void setup() { Serial.begin(9600); if (!bme.begin(0x76)) { Serial.println("bme ne naiden: adres? pitanie 3.3V?"); }} void loop() { float t = bme.readTemperature(); float h = bme.readHumidity(); float p = bme.readPressure() / 100.0 * 0.75006; // hPa -> mmHg Serial.print("t="); Serial.print(t); Serial.print(" h="); Serial.print(h); Serial.print(" p="); Serial.println(p); delay(2000);}Сравнительная таблица в Serial
Библиотеки Adafruit_BME280 и Adafruit_SHT31 дают готовые readTemperature и readHumidity — код переезда с DHT почти не меняется, правится шапка и вызовы begin. Пока железа нет, симулятор показывает главную мысль выбора: при одном и том же климате каждый сенсор записывает в журнал не число, а интервал — свои паспортные ±. Крутите потенциометром порог различимости и смотрите на вердикты: смену на 0,2–0,3 °C уверенно ловит только SHT31, остальные честно пишут net. Такой журнал я потом выгружаю в формат таблицы по уроку про таблицы данных в Serial.
Если переезд всё же случился, мой порядок такой: библиотека через Library Manager, сканер шины до подключения, питание 3,3 В, чтение ID, и только потом проект. И вопрос «какой из трёх взять сегодня» я отвечаю так: BME280 — когда давление действительно нужно, SHT31 — когда за точность платят заказчиком или теплицей, Si7021 — в остальных случаях, тихо и без сюрпризов. DHT22 остаётся там, где счёт идёт на минуты и рубли — и это честная роль для старого знакомого.
- 1. Чем BME280 отличается от BMP280?
- 2. Какой сенсор уверенно различит смену климата на 0,2 °C?
- 3. Чем питают голый BME280 без стабилизатора на плате?
- 4. Два SHT31 на одной шине возможны, потому что:
- 5. Когда DHT22 остаётся моим выбором по умолчанию?
- BME280 — когда нужно давление; проверяйте ID: 0x60 у BME против 0x58 у BMP.
- SHT31 — ±0,2 °C и ±2 %, два адреса 0x44/0x45 на одной шине; платите как за два DHT22.
- Si7021 — тихая середина: ±0,4 °C, ±3 %, самонагрев почти незаметен.
- Голые сенсоры — только 3,3 В; модуль со стабилизатором терпит 5 В.
- Один пин и копеечная цена — аргументы DHT; переезд не отменяет сквозняки и солнце на корпус.
Частые вопросы по теме урока
- Чем BME280 отличается от BMP280?
- BMP280 — барометр без влажности. В «BME280» с маркетплейса часто сидит именно он; по регистру ID: 0x60 у BME, 0x58 у BMP. BME280 умеет влажность, BMP280 — только температуру и давление
- Какой сенсор уверенно различит смену климата на 0,2 °C?
- У SHT31 интервал погрешности ±0,2 °C — самый узкий в любительском сегменте. DHT22 с его ±0,5 °C такую смену честно запишет как «неопределённо». SHT31 с его ±0,2 °C
- Чем питают голый BME280 без стабилизатора на плате?
- Голые чипы Bosch и Sensirion — строго 3,3 В. Модуль со стабилизатором и согласователем уровней терпит 5 В, «голый чип на платке» — нет. 3,3 В: чип живёт до 3,6 В и от 5 В умирает молча
- Два SHT31 на одной шине возможны, потому что:
- SHT31 имеет два адреса на выбор — разводкой ножки ADDR. Комнатный сенсор на 0x44, уличный на 0x45 — и опрашиваются оба по очереди. Адрес выбирается ножкой: 0x44 или 0x45
- Когда DHT22 остаётся моим выбором по умолчанию?
- Один пин вместо шины и копеечная цена — аргументы, с которыми DHT пока не проиграл. Давление он не умеет, точность 0,2 °C не тянет, минус сорок — у DHT11 тоже нет. Когда важны один цифровой пин и цена: шина занята или плата — ATtiny