Проект · I2C · Тест датчиков
Сравни четыре датчика I2C на одном дашборде ESP — и увидь расхождение
BME280, BMP280, AHT20 и HDC1080 сидят на одной шине I2C. У каждого — своё живое значение и график тренда, рядом, чтобы с одного взгляда видеть, какие датчики согласны, а какие нет. Без облака, без приложения. В этом прогоне HDC1080 показал влажность почти на 10% выше, чем BME280 в 5 мм от него.
Каждый датчик температуры/влажности заявляет в даташите свою погрешность, но честная проверка — это положить несколько штук в один и тот же воздух и прочитать в один и тот же момент. Этот проект ровно это и делает: четыре популярных чипа 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.
Железо
- ESP8266 (Wemos D1 mini) или ESP32 — ~$3–5
- BME280 (0x76), BMP280 (0x77), AHT20 (0x38), HDC1080 (0x40) — по паре долларов каждый
- Макетка и провода-перемычки
Подключение проще некуда: все датчики делят одни и те же четыре провода —
SDA, SCL, 3V3 и GND. В этом и весь смысл I2C. На ESP8266 шина — это
SDA = D2 (GPIO4), SCL = D1 (GPIO5); на ESP32 —
GPIO21 / GPIO22. Каждое устройство отвечает на своём адресе, так что конфликта нет,
пока два чипа не делят один — здесь все четыре разные.
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.