RisalDash RisalDash

Проект · I2C · Тест датчиков

Сравни четыре датчика I2C на одном дашборде ESP — и увидь расхождение

BME280, BMP280, AHT20 и HDC1080 сидят на одной шине I2C. У каждого — своё живое значение и график тренда, рядом, чтобы с одного взгляда видеть, какие датчики согласны, а какие нет. Без облака, без приложения. В этом прогоне HDC1080 показал влажность почти на 10% выше, чем BME280 в 5 мм от него.

BME280BMP280AHT20HDC1080I2CESP32 + ESP8266
Дашборд RisalDash Sensor Compare — BME280, BMP280, AHT20 и HDC1080 рядом, у каждого LED online, живые температура, влажность и давление, и график тренда температуры
Четыре датчика, одна шина, одна страница — отдаёт сам ESP, вживую по WebSocket.

Каждый датчик температуры/влажности заявляет в даташите свою погрешность, но честная проверка — это положить несколько штук в один и тот же воздух и прочитать в один и тот же момент. Этот проект ровно это и делает: четыре популярных чипа I2C — BME280, BMP280, AHT20 и HDC1080 — на одной шине, один ESP32 или ESP8266 и один веб-дашборд, который показывает их все сразу.

Собрано на RisalDash — open-source библиотеке для Arduino, которая из нескольких вызовов dash.metric(...) / dash.chart(...) делает адаптивный живой дашборд, отдаваемый прямо с платы по WebSocket.

Что сказали цифры

Все четыре вышли на связь вместе. Температуры были плотными — в пределах полуградуса. Интересной оказалась влажность:

Датчик Адрес Темп. Влажн. Давление
BME280 0x76 28.5 °C 30.3 % 967 hPa
BMP280 0x77 29.0 °C 968 hPa
AHT20 0x38 28.6 °C 32.3 %
HDC1080 0x40 28.7 °C 39.7 %

BME280, BMP280 и AHT20 сгруппировались около 30–32% относительной влажности. HDC1080 сел на 39.7% — почти на десять пунктов выше. Ни один не «неправ» очевидно: это ровно тот межэкземплярный сдвиг, который ловишь, только сравнивая датчики в одном воздухе. И это хороший аргумент за калибровку по эталону, а не за доверие одному голому модулю. Два датчика давления (BME280 vs BMP280) сошлись в пределах 1 hPa.

Железо

Четыре платы-брейкаута датчиков I2C на макетке — фиолетовые модули BME280, BMP280 и AHT20 плюс HDC1080, все подключены к небольшой плате ESP по общим SDA/SCL
Все четыре модуля делят одни и те же линии SDA, SCL, 3V3 и GND на макетке.

Подключение проще некуда: все датчики делят одни и те же четыре провода — SDA, SCL, 3V3 и GND. В этом и весь смысл I2C. На ESP8266 шина — это SDA = D2 (GPIO4), SCL = D1 (GPIO5); на ESP32GPIO21 / GPIO22. Каждое устройство отвечает на своём адресе, так что конфликта нет, пока два чипа не делят один — здесь все четыре разные.

Крупный план фиолетового брейкаута датчика влажности I2C с шелкографией SI7021 / HTU21D / SHT21 / SHT20 / HDC1080 — одна плата под любой из этих чипов; здесь это HDC1080 на адресе 0x40
Одна плата, пять имён. На этих фиолетовых брейкаутах шелкография SI7021 / HTU21D / SHT21 / SHT20 / HDC1080 — здесь это HDC1080 на 0x40.

Эта шелкография — классическая ловушка: одну и ту же плату продают с любым из пяти разных чипов, а у них разные драйверы. Если не уверен, что у тебя стоит, соседний пример I2C Scanner печатает каждый адрес на шине с догадкой о чипе — воткни плату, и он скажет.

Код

Дашборд декларативный. Каждый датчик — небольшой блок: LED online, пара метрик и график тренда, — а RisalDash раскладывает их и стримит значения вживую:

#include <RisalDash.h>
#include <Wire.h>
#include <Adafruit_BME280.h>
#include <Adafruit_BMP280.h>
#include <Adafruit_AHTX0.h>
#include <ClosedCube_HDC1080.h>

RisalUI dash("Sensor Compare");

void setup() {
  Wire.begin();                       // ESP8266: D2/D1  ·  ESP32: 21/22
  bmeOK = bme.begin(0x76);            // авто-детект: воткнул — вышел на связь
  bmpOK = bmp.begin(0x77);
  ahtOK = aht.begin();                // 0x38
  hdcOK = i2cPresent(0x40);

  dash.separator("BME280 · 0x76");
  dash.led("BME280 online", &bmeOK);
  dash.metric("BME280 temp", &bmeT, "°C").decimals(1);
  dash.chart("BME280 temp trend", &bmeT, "°C");
  dash.metric("BME280 humidity", &bmeH, "%").decimals(1);
  // ...ещё три блока: BMP280, AHT20, HDC1080

  dash.enableOTA();
  dash.apName("SensorCompare");
  dash.begin();                       // captive portal, затем подключается к твоему Wi-Fi
}

Датчики определяются автоматически: begin() возвращает, ответил ли чип, и этот же булев флаг управляет LED «online» на карточке. Сними датчик с шины — его карточка просто покажет offline, остальные работают дальше. Читай значения каждые две секунды в loop() с проверками isnan(), и каждый открытый браузер обновится разом.

Настройка Wi-Fi — как в любом проекте RisalDash

Ничего не нужно зашивать в код. При первом включении плата не находит сохранённую сеть и поднимает точку доступа с captive-порталом под именем SensorCompare. Подключи телефон к ней — страница настройки откроется сама, выбираешь домашний Wi-Fi и вводишь пароль. ESP сохраняет данные, перезагружается и с этого момента подключается к твоей сети сам — дашборд ждёт по своему IP в локальной сети. Всё отдаёт само устройство; ничто не уходит в облако, и твои показания не покидают сеть.

Так как dash.enableOTA() включён, дальнейшие прошивки идут по воздуху из браузера — никакого USB-кабеля после первой заливки.

Зачем вообще сравнивать?

Если ты логируешь теплицу, серверную или террариум, сдвиг влажности в 10% — это разница между «норма» и «тревога». Наблюдение за несколькими датчиками сразу говорит, какому доверять, дрейфует ли модуль и насколько свежая деталь расходится с той, что работает уже год. Это самая дешёвая проверка калибровки — и по-настоящему приятный живой дашборд.

Полный, собранный и проверенный исходник для ESP32 & ESP8266.