В прошлой статье мы показали первую версию нашего дашборда: карточки с показаниями, графики, журнал и предупреждения. Пока числа в него вводятся вручную. Теперь пора подготовить следующий шаг — передачу данных от настоящей платы ESP32.
Плата у нас уже есть. Датчики ещё в пути, а прошивку на физической плате мы пока не проверяли. Поэтому сегодня не будем изображать работающую метеостанцию. Вместо этого разберёмся, как ESP32 будет общаться с уже готовым дашбордом, как повторить подключение и почему отсутствие измерения — это не ноль.
Один экран, два способа получить показания
В прошлый раз мы вводили значения через форму «Строка в журнал». В будущем ту же работу будет делать ESP32: считывать датчики и отправлять их показания программе станции.
Цепочка выглядит так:
Датчик → ESP32 → USB, Wi-Fi или Bluetooth → компьютер со станцией → журнал → карточки и графики дашборда.
Новый интерфейс создавать не нужно. Дашборду безразлично, ввёл ли человек температуру вручную или она пришла от платы: важны корректные поля измерения. Но есть принципиальная разница между подготовленной схемой передачи и уже проверенной передачей с реального устройства. Пока мы проверили приём данных программой, а не весь путь от физической ESP32.
Почему нельзя просто отправить число 23,4
Представим, что несколько человек собирают одинаковые стенды. Один датчик показывает 23,4 °C, другой — 23,8 °C. Чтобы сравнить результаты, мало записать сами числа. Нужно знать, какая станция их прислала, каким датчиком они получены, что измерялось и в каких единицах.
Поэтому каждая запись содержит пять основных полей:
| Поле | Пример | Что означает |
|---|---|---|
node_id |
station |
Идентификатор станции или узла |
sensor_id |
SHT40-A |
Идентификатор конкретного датчика |
quantity |
air_temperature |
Что измерено: например, температура воздуха |
unit |
celsius |
Единица измерения |
value |
1.4 |
Значение, действительно полученное от датчика |
В программе для температуры воздуха используется air_temperature и celsius, для относительной влажности — relative_humidity и percent_rh, для температуры опорного датчика — reference_temperature и celsius.
Температура, влажность и показание опорного Pt100 — это отдельные записи. Так проще сопоставлять разные датчики и не путать их результаты.
Вот как выглядит пример будущего настоящего показания:
{"node_id":"station","sensor_id":"SHT40-A","quantity":"air_temperature","unit":"celsius","value":1.4}
Это пример формата, не показание, снятое с нашей платы. Программа станции принимает такие записи через POST /api/readings. При необходимости к ним можно добавить название опыта и заметку. Если время не передано, важно понимать: время приёма на компьютере не обязательно совпадает с моментом измерения датчиком.
Если датчик молчит, это не ноль градусов
Представьте, что датчик в теплице перестал отвечать. Если программа нарисует на графике ноль, получится ложный сигнал о похолодании. Если оставит старые 22 °C без указания, что данные устарели, можно пропустить реальное изменение температуры.
Поэтому мы разделяем показание и сообщение о состоянии оборудования. Для отсутствия ответа предусмотрено, например, такое диагностическое сообщение:
{"event":"bus_empty","note":"на шине никто не ответил"}
Это не измерение, и в журнал показаний его записывать нельзя. Отсутствие ответа ещё не доказывает, что датчика нет: причиной могут быть питание, соединение, адрес или неисправность. В текущей схеме сообщение остаётся диагностикой, а не температурой на экране. Полноценный контроль устаревших данных и отдельный журнал ошибок — дальнейшие задачи.
Как ESP32 передаст данные в дашборд

Мы предусмотрели три варианта. Во всех случаях показания приходят в одну и ту же программу станции, которую уже запускали в предыдущей статье. Выбор зависит от того, где стоит стенд и какое оборудование есть под рукой.
1. USB: начинаем с кабеля
Для первых испытаний это самый простой путь: не нужно настраивать домашнюю сеть или сопряжение Bluetooth.
Откройте терминал в корне скачанного репозитория Fermozavr DIY и запустите станцию:
python3 station/server.py
Затем откройте в браузере http://127.0.0.1:8321. Это наш знакомый дашборд.
Когда прошивка будет загружена на ESP32, подключите её USB-кабелем и во втором терминале запустите мост последовательного порта:
python3 station/line_in.py /dev/ttyUSB0
В Linux порт может называться /dev/ttyACM0; на Windows и macOS имена будут другими. Мост нужен потому, что браузер сам по себе не читает USB-порт ESP32: отдельная программа принимает строки от платы и передаёт измерения локальному серверу.
Что должно произойти после подключения датчика: новое корректное показание появится в журнале станции; карточки и графики, настроенные на соответствующий датчик и параметр, смогут его показать. Пока датчиков нет, ждать настоящих чисел не следует.
2. Wi-Fi: без кабеля между платой и компьютером
Здесь ESP32 отправляет показания непосредственно на адрес компьютера, где работает станция. Например:
http://192.168.1.10:8321/api/readings
Адрес 192.168.1.10 — только пример. Нужно указать реальный IP-адрес своего компьютера. Адрес 127.0.0.1 в прошивке не подойдёт: для ESP32 он означает саму ESP32, а не ноутбук.
По умолчанию сервер принимает соединения только с самого компьютера. Чтобы разрешить приём из локальной сети, запустите его так:
FVZ_HOST=0.0.0.0 python3 station/server.py
Внимание: у этого экспериментального входа нет авторизации. Используйте его только в доверенной локальной сети; не открывайте порт в интернет и не запускайте такой режим в публичной Wi-Fi-сети. Пароль своей сети указывайте в локальном конфигурационном файле, а не публикуйте в репозитории.
3. Bluetooth: ещё один вариант для стенда
На исходных ESP32 с поддержкой Bluetooth Classic можно использовать последовательное Bluetooth-соединение. В подготовленной прошивке имя устройства — Fermozavr-TRH. Это не BLE.
После сопряжения компьютер получает последовательный порт, а дальше работает тот же мост line_in.py. На Linux это может быть /dev/rfcomm0; в других системах способ создания порта отличается.
Важно: ESP32-S3 и ESP32-C3 не поддерживают используемый здесь профиль Bluetooth Classic. Для них остаются USB и Wi-Fi. Подробности конфигурации и команды для вашей системы мы будем поддерживать в документации станции.
Где выбирать способ связи
Прошивка находится в каталоге firmware/fermozavr_recorder/. В одной сборке используется один путь передачи: USB, Wi-Fi или Bluetooth. Режим задаётся в config.h; пример настроек без секретов — config.example.h.
Для обычного ESP32 в Arduino IDE выбирается плата ESP32 Dev Module. Базовые компоненты Wire, WiFi и BluetoothSerial входят в соответствующее ядро ESP32 для Arduino, но доступность Bluetooth зависит от модели микроконтроллера.
В подготовленной конфигурации опрос намечен раз в десять секунд. Это не означает, что у нас уже есть десятисекундный ряд настоящих измерений. Когда датчики появятся, проверим работу драйверов и реальный интервал опроса. Ускоренный опрос во время испытаний росой — отдельный этап.
Как проверить соединение и не обмануть себя
Проверку удобно разделить на три части.
Сначала — дашборд. Запустите станцию и добавьте тестовое измерение через форму «Строка в журнал». Убедитесь, что оно появляется в журнале и соответствующей карточке или графике. Это проверка программы, не ESP32.
Затем — связь с платой. После загрузки прошивки убедитесь, что выбранный канал работает и диагностические строки доходят до компьютера или отображаются в последовательном мониторе. Если датчиков пока нет, программа может сообщить, что на шине никто не ответил. Такое сообщение не должно создавать температурную точку на графике.
Наконец — настоящее измерение. Только после подключения поддерживаемого датчика, добавления и проверки его драйвера можно ждать реального value в журнале. Именно этот этап мы пока не объявляем завершённым.
Если ничего не получилось, полезно записать модель ESP32, операционную систему, название порта, выбранный канал и точный текст ошибки. По этим данным искать причину гораздо проще, чем по сообщению «не работает».
Куда подключим датчики
Пока у нас есть предварительное назначение выводов для исходного ESP32, а не проверенная монтажная схема конкретных модулей:
| Сигнал | GPIO |
|---|---|
| I²C SDA, затем мультиплексор TCA9548A | 21 |
| I²C SCL | 22 |
| DS18B20, отдельная линия 1-Wire | 4 |
| MAX31865 CS | 5 |
| MAX31865 SCK | 18 |
| MAX31865 MISO | 19 |
| MAX31865 MOSI | 23 |
SHT40, SHT45, BME280 и AHT20 планируем подключать по I²C через мультиплексор: у части модулей совпадают адреса, и их нужно развести по каналам. DS18B20 использует отдельную линию 1-Wire, а опорный Pt100 подключается через MAX31865 по SPI.
Пока датчики не приехали, прошивка не измеряет температуру или влажность: она только готовит передачу данных и проверку доступности устройств. Ответ на I²C-адрес ещё не равен корректному измерению. Для Pt100 через MAX31865 нужен отдельный драйвер и проверка чтения преобразователя.
Сами датчики будем размещать примерно в 20–30 см от платы, чтобы тепло ESP32 меньше влияло на измерение температуры воздуха. Окончательную схему подключения опубликуем после проверки реальных модулей.
Что у нас есть на этом этапе
Теперь мы можем описать всю будущую цепочку — от датчика до графика — без предположений о том, какие числа якобы уже получены. Есть работающий локальный дашборд, формат записей, приём показаний через API и подготовленные варианты связи с ESP32. Но прошивка на нашей физической плате и получение данных от настоящих датчиков ещё требуют проверки.
Исходники и инструкции доступны в репозитории Fermozavr DIY. Если у вас уже есть ESP32, напишите, какая именно модель и какой способ подключения удобнее: USB, Wi-Fi или Bluetooth. Оставить ответ можно через страницу участия или по адресу info@fermozavr.ru. За короткими новостями о сборке следите в канале «Фермозавр».
Что дальше
Следующий шаг — залить прошивку на плату, проверить канал передачи и подключить первый настоящий датчик. Тогда вместо тестовых строк появятся измерения, которые можно будет сравнивать. После этого вернёмся к запланированным испытаниям: лёд из дистиллированной воды, комнатные условия, солевые точки и роса. Для опыта FVZ-EXP-001 нам важны не красивые цифры, а воспроизводимые результаты.
Fermozavr DIY — открытый проект. Исходный код и условия использования опубликованы в репозитории. Программное обеспечение предназначено для самостоятельного изучения и экспериментов; коммерческое использование регулируется лицензией проекта.






