Модульная система
мониторинга окружающей среды

Открытая IoT-экосистема на базе ESP32: сенсорные модули измеряют климат, микроконтроллер собирает данные, а приложение показывает всё в реальном времени.

🌡️
Сенсорные модули ESP32-C6
BME680 · BH1750 · UART
🧠
Главный контроллер ESP32-C3
Сбор · SD-карта · Веб-API
☁️
Сервер Node.js
Сигнальный сервер · MQTT
📱
Мобильное приложение Flutter
Графики · Аварии · Управление
—
устройств онлайн
—
аптайм сервера
5
типов метрик
100%
на Raspberry·VPS штатно
Метрики

Что измеряет система

Каждый сенсорный модуль передаёт данные по UART на главный контроллер, который публикует их в MQTT и сохраняет на SD-карту для истории.

🌡️Температура
BME680
💧Влажность
BME680
🎈Давление
BME680
🌫️Качество воздуха
BME680 · IAQ
🔆Освещённость
BH1750
Стек

Архитектура

Масштабируемая модульная конструкция: от одного датчика до десятков комнат.

🧠 Главный контроллерESP32-C3

  • Собирает данные с сенсорных модулей по UART
  • Публикует метрики в MQTT брокер
  • Сохраняет историю на microSD (CSV)
  • Веб-API: /api/v1/sensors, история, команды
  • WebSocket — live-поток данных

🌡️ Сенсорные модулиESP32-C6

  • BME680 — температура, влажность, давление, IAQ
  • BH1750 — освещённость
  • Регистрация и heartbeat по UART-протоколу
  • Автоопределение новых модулей (plug & play)

☁️ Серверная частьNode.js

  • Сигнальный сервер — реестр устройств
  • Mosquitto (MQTT) — транспортировка данных
  • Автономен: регистрирует и раздаёт ip:port
  • Сертификат Let's Encrypt — защищённый HTTPS

📱 КлиентFlutter

  • Дашборд устройств в реальном времени
  • Графики и статистика за 24ч – 30д
  • Настройка аварий по порогам
  • Direct connection к устройству + MQTT
Возможности

Почему это удобно

⚡

Модульность

Добавляйте сенсорные модули без перепрошивки — система сама их обнаружит по I²C/UART и зарегистрирует.

📡

Несколько транспортов

Данные идут по MQTT, WebSocket и REST одновременно. Приложение выбирает оптимальный канал.

💾

Сохранность данных

История пишется на SD-карту при каждом чтении. Даже при пропаже сети данные не теряются.

🔔

Аварии

Пороговые уведомления: температура выше нормы, влажность упала — приложение сразу покажет проблему.

📊

Графики

Режимы 1ч / 6ч / 24ч / 7д / 30д с минимальными, средними и максимальными значениями.

🔧

Удалённое управление

Команды re-scan, чтение сенсоров и перезагрузка устройства — прямо из мобильного приложения.

Инструкция

Сборка и подключение

Как прошить прошивку, настроить Wi-Fi и соединить модули между собой.

1Прошивка контроллеров

Код лежит в репозитории проекта, папка firmware/. Для каждого контроллера своя прошивка:

  • main_controller — главный контроллер на ESP32-C3 (Wi-Fi, MQTT, WebSocket, SD-карта, I²C-датчики)
  • sensor_module — сенсорный модуль на ESP32-C6 (читает датчики и шлёт их по UART на контроллер)

Среда сборки — PlatformIO. Из командной строки:

cd firmware/main_controller pio run -e esp32-c3 # сборка pio run -t upload --upload-port COM5 # прошивка на плату cd firmware/sensor_module pio run -e esp32-c6 # сборка pio run -t upload --upload-port COM6 # прошивка на плату

Или через мобильное/десктопное приложение: раздел «Прошивка» → выбрать папку, устройство, COM-порт (кнопка «Определить чип» покажет фактический ESP32-C3/C6) → «Собрать» → «Загрузить».

2Первое включение и настройка Wi-Fi

При первом старте главный контроллер поднимает точку доступа IoT-Setup-XXXX без пароля.

  • Подключитесь к сети IoT-Setup-XXXX
  • Откройте в браузере http://192.168.4.1
  • Укажите SSID и пароль вашей Wi-Fi сети и сохраните
  • Контроллер перезагрузится и подключится к вашему роутеру, данные появятся в приложении

Если нужно переподключить к другой сети — отправьте устройству команду переконфигурации через приложение (Wi-Fi → «Сброс Wi-Fi»), оно снова вернётся в режим точки доступа.

3Соединение модулей: UART

Сенсорный модуль (ESP32-C6) передаёт данные главному контроллеру (ESP32-C3) по UART 115200 бод. Пин TX каждого контроллера соединяется с RX другого (перекрёстно):

Главный контроллер · ESP32-C3Сенсорный модуль · ESP32-C6
GPIO5 (TX, Serial1)→GPIO4 (RX, Serial1)
GPIO4 (RX, Serial1)←GPIO5 (TX, Serial1)
GND—GND
5V / VIN—5V / VIN
  • TX → RX подключаются перекрёстно: C3.GPIO5 → C6.GPIO4 и C6.GPIO5 → C3.GPIO4; земля общая
  • Питание модулей — от USB или общего блока 5 В
  • Датчики на одной плате могут расширяться — см. шаг 4

4Подключение датчиков: I²C

Сенсоры BME680 (температура, влажность, давление, качество воздуха) и BH1750 (освещённость) подключаются к шине I²C: SDA, SCL, питание 3.3V и общий GND. Ниже раскладка отдельно для каждой платы.

📟 Плата отдельно: ESP32-C3 · главный контроллер
КонтактПин ESP32-C3Подключение
SDAGPIO6BME680 SDA · BH1750 SDA
SCLGPIO7BME680 SCL · BH1750 SCL
VCC3.3V (BME680, BH1750)
GNDобщий с платой

C3 работает и без сенсорного модуля C6: датчики на его собственной шине I²C, данные публикуются по Wi-Fi/MQTT, история — на SD-карту (CS — GPIO10).

📟 Плата отдельно: ESP32-C6 · сенсорный модуль
КонтактПин ESP32-C6Подключение
SDAGPIO6BME680 SDA · BH1750 SDA
SCLGPIO7BME680 SCL · BH1750 SCL
VCC3.3V (BME680, BH1750)
GNDобщий с платой

C6 сам Wi-Fi не использует — он передаёт метрики по UART главному контроллеру (шаг 3). Состояние показывает светодиод на GPIO8 (мигает при активной передаче).

  • Частота шины — 100 кГц; адреса: BME680 — 0x76, BH1750 — 0x23
  • Несколько датчиков подключаются параллельно (SDA→SDA, SCL→SCL); подтяжки обычно уже на модулях
  • Прошивка автосканирует шину при старте (plug & play) и публикует найденные датчики

5Сводная таблица пинов

ПинНазначениеESP32-C3 (главный)ESP32-C6 (модуль)
GPIO4UART RX (Serial1)✓✓
GPIO5UART TX (Serial1)✓✓
GPIO6I²C SDA✓✓
GPIO7I²C SCL✓✓
GPIO8Светодиод статуса—✓
GPIO10SD-карта (CS)✓—
⚠️ Перед пайкой/подключением убедитесь, что платы обесточены. Общая земля обязательна — при подключении разных блоков питания соединяйте их GND вместе, иначе UART/I²C будут работать нестабильно.

6Светодиод (GPIO8) и SD-карта (GPIO10)

💡 Светодиод на GPIO8 · сенсорный модуль ESP32-C6
ПодключениеПинДетали
GPIO8 → светодиодGPIO8уровень 3.3 В, ток ~12 мА макс.
Анод (через резистор)220–330 Омзащита светодиода от перегрузки по току
Катод → GNDGNDобщий с платой
  • На плате ESP32-C6-DevKitC-1 к GPIO8 уже подключён встроенный RGB-светодиод (WS2812)
  • В прошивке GPIO8 задан как STATUS_LED_PIN (config.h): светодиод мигает при передаче кадров по UART — по нему удобно проверять связь
  • Внешний светодиод подключайте обязательно через резистор — прямое включение без него выведет GPIO из строя
  • На главном контроллере (lolin C3 mini) встроенный LED аппаратно сидит на GPIO7 и прошивкой не используется; GPIO8 свободен
💾 SD-карта на GPIO10 · главный контроллер ESP32-C3
Контакт модуляПин ESP32-C3Детали
CSGPIO10задано в прошивке: SD_CS 10 (config.h)
SCKGPIO2SPI-шина платы по умолчанию
MOSI (DI)GPIO4SPI-шина платы по умолчанию
MISO (DO)GPIO3SPI-шина платы по умолчанию
VCC3.3Vмодули с преобразователем допускают 5V
GNDGNDобщий с платой
  • Прошивка вызывает SD.begin(SD_CS) — из кода задан только пин CS (GPIO10), линии данных берутся со стандартной SPI-шины платы
  • Карту форматируйте в FAT16/FAT32 — прошивка пишет историю показаний логами в CSV
  • Если SD-модуль работает нестабильно, уменьшите частоту шины или переназначьте пины в config.h
⚠️ На этой плате SPI по умолчанию (SCK=GPIO2, MOSI=GPIO4, MISO=GPIO3) пересекается с UART (GPIO4/GPIO5). Если SD-карта подключается одновременно с сенсорным модулем по UART, переназначьте шину в коде, например: SPI.begin(2, 3, 4) → SD.begin(10) — с учётом своих свободных пинов.

7Схемы подключения

Схема A — соединение главного контроллера и сенсорного модуля по UART (пины TX/RX подключаются перекрёстно):

ESP32-C3 главный контроллер GPIO5 · TX GPIO4 · RX GND 5V ESP32-C6 сенсорный модуль GPIO4 · RX GPIO5 · TX GND 5V TX → RX RX ← TX общий GND 5 В питание Serial1 · 115200 бод
Схема A · UART: ESP32-C3 ↔ ESP32-C6

Схема B — шина I²C: оба датчика висят на одних линиях SDA=GPIO6 и SCL=GPIO7:

Плата ESP32-C3/C6 GPIO6 → SDA GPIO7 → SCL SDA · GPIO6 SCL · GPIO7 BME680 I²C · адрес 0x76 BH1750 I²C · адрес 0x23 VCC → 3.3V · GND → общий · точка = соединение, пересечение без точки = не соединяется
Схема B · I²C: BME680 (0x76) и BH1750 (0x23) на одной шине
  • Датчики снимаются/подключаются только при выключенном питании
  • Линии UART и I²C делайте короткими, без скруток и вилок на лету

8Компоненты (BOM)

Что нужно для сборки: стартовый комплект на одну точку + один сенсорный модуль.

КомпонентКол-воГде используетсяПримечание / замена
ESP32-C3-DevKit (Lolin C3 mini)1Главный контроллерWi-Fi/MQTT, SD, I²C; подойдёт любой C3-devkit
ESP32-C6-DevKitC-11+Сенсорный модульПо одному на каждую комнату/модуль
Датчик BME680 (модуль)1+Температура, влажность, давление, IAQМодуль удобнее голого чипа: есть подтяжки и стабилизатор
Датчик BH1750 (модуль)1+ОсвещённостьI²C, адрес 0x23
Модуль microSD1История на главном контроллереCS → GPIO10
microSD-карта1Логи (CSV)FAT16/FAT32, от 1 ГБ
Светодиод + резистор 220–330 Ом1Индикация на C6Анод → GPIO8; на DevKit есть встроенный RGB
Провода Dupont (мама-мама / папа-мама)комплектСоединения GPIO~20 см, не тяните длинные линии
Питание 5 В: блок или USB-кабели1–2Платы и модулиОт 1 А на контроллер

Порядок закупки: платы → датчики → карта памяти → провода и питание. При расширении системы добавляется только нужное количество модулей C6 и датчиков — главный контроллер остаётся один.

9Диагностика неисправностей

Плата не отображается в списке COM-портов
  • Используйте USB-кабель с передачей данных, а не только питания
  • Установлены ли драйверы USB-моста: CH340 / CP210x / нативный USB (на Windows обычно ставятся автоматически)
  • Нажмите «Обновить список портов» в приложении и проверьте, что выбрана актуальная среда (esp32-c3 или esp32-c6)
  • На некоторых платах порт появляется только при удержании BOOT (режим загрузчика)
«Определить чип» не возвращает результат
  • По умолчанию esptool сам переводит плату в download-режим (DTR/RTS) — это работает на обычных devkit-ках
  • На самодельных платах без линий RTS/DTR задержите кнопку BOOT на время опроса (до «Chip is …»)
  • Убедитесь, что выбран именно тот порт, к которому подключена плата, и закройте другие программы, занимающие этот порт
Ошибка при прошивке: несовпадение чипа (chip mismatch)
  • Выбрана не та среда: код для ESP32-C3 пытаетесь загрузить на C6 или наоборот
  • Результат «Определить чип» автоматически сверяет фактический чип с выбранным устройством — добейтесь зелёного совпадения перед загрузкой
  • Проверьте, что порт соответствует нужной плате, если подключено несколько
Датчик не найден на шине I²C
  • Перепутаны SDA (GPIO6) и SCL (GPIO7)
  • Датчику не хватает питания: корректные адреса — BME680 0x76, BH1750 0x23
  • Нет общего GND между датчиком и платой, или провод длиннее ~20 см без подтяжки
  • После подключения перезапустите плату — сканирование шины идёт при старте
Данные не публикуются в приложение (нет MQTT)
  • Wi-Fi не настроен: при первом старте будет точка IoT-Setup-XXXX — пройдите шаг 2
  • Проверьте и повторите настройку Wi-Fi командой «Сброс Wi-Fi» из приложения
  • Убедитесь, что сервер доступен: статус-индикатор на странице spe4naz.online
Данных от сенсорного модуля C6 нет
  • TX/RX подключены не перекрёстно: C3 GPIO5 → C6 GPIO4, C6 GPIO5 → C3 GPIO4
  • Скорость UART — строго 115200; проверьте общий GND между платами
  • Обе прошивки собраны: модуль — esp32-c6, контроллер — esp32-c3
  • Светодиод на GPIO8 модуля должен мигать при передаче кадров