
О чём статья
Датчик JXCT 7-в-1 по Modbus RTU даёт сырые значения. Без компенсации температура и влажность сильно искажают EC, pH и NPK. В статье — как устроена open-source прошивка с научно обоснованной компенсацией (Rhoades, Нернст, Delgado), точная схема подключения ESP32 → SP3485E → датчик, интеграции с MQTT, Home Assistant и ThingSpeak, REST API, OTA 2.0, калибровка через CSV, рекомендации по 24 культурам и 13 типам почв.
Что измеряет датчик
Параметр | Диапазон | Точность |
|---|---|---|
Температура | -45…115°C | ±0.5°C |
Влажность | 0–100% | ±3% (0–53%), ±5% (53–100%) |
EC | 0–10000 µS/cm | ±5% |
pH | 3–9 | ±0.3 |
N, P, K | 0–1999 мг/кг | 2% F.S. |
Датчик: Modbus RTU, 9600 bps. Питание датчика: 12–24 В (отдельный блок). ESP32 и SP3485E — от 3.3 В.
Схема подключения (из проекта)
ESP32 общается с датчиком через RS485. Нужен трансивер SP3485E (3.3 V).
ESP32 → SP3485E:
ESP32 GPIO | SP3485E Pin | Функция |
|---|---|---|
GPIO16 | RO | Receive Output (UART RX) |
GPIO17 | DI | Data Input (UART TX) |
GPIO4 | DE | Driver Enable |
GPIO5 | RE | Receiver Enable |
GND | GND | Общий провод |
3.3V | VCC | Питание SP3485E |
SP3485E → JXCT (линия RS485):
SP3485E | JXCT | Функция |
|---|---|---|
A+ | A+ (жёлт.) | RS485 Data+ |
B- | B- (син.) | RS485 Data- |
Питание датчика (отдельное):
Источник 12–24 V DC | JXCT Pin | Функция |
|---|---|---|
V+ | VCC | Питание датчика |
GND | GND | Общий минус |
Важно: GND ESP32, SP3485E и блока питания датчика — общий. На длинных линиях RS485 — терминатор 120 Ом между A и B. Полярность A+/B- соблюдать строго.


Научная компенсация
Двухэтапная схема
SensorCorrection — всегда включена: множитель + смещение для влажности, EC, температуры.
SensorCompensationService — научные формулы, включается в настройках.
EC — Rhoades et al. (1989)
$$\text{EC}{\text{comp}} = \text{EC}{\text{raw}} \times (1 + 0.021 \times (T - 25))$$
При +1°C EC растёт примерно на 2.1%. Источник: Rhoades et al., SSSAJ, 1989.
pH — уравнение Нернста (Ross et al., 2008)
$$\text{pH}{\text{comp}} = \text{pH}{\text{raw}} - 0.003 \times (T - 25)$$
При +1°C pH снижается на 0.003. Источник: Ross et al., SSSAJ, 2008.
NPK — Delgado et al. (2020)
Учёт температуры и влажности, коэффициенты по типу почвы:
$$\text{N}{\text{comp}} = \text{N}{\text{raw}} \times e^{\delta_N(T-20)} \times (1 + \varepsilon_N(\theta-30))$$
Аналогично для P и K. Коэффициенты δ и ε зависят от типа почвы (песок, суглинок, глина, торф и др.). Источник: Delgado et al., European Journal of Soil Science, 2020.
NutrientInteractionService
Учитывает антагонизмы и синергизмы NPK:
Антагонизмы: N↔K, K↔Mg, P↔Zn, P↔Ca (pH-зависимость).
Синергизмы: N+S, Ca+B.
24 культуры и 13 типов почв
CropRecommendationEngine — рекомендации по 24 культурам.
Овощи: томат, огурец, перец, салат, шпинат, капуста, картофель, морковь.
Ягоды: клубника, малина, смородина, черника, ежевика.
Плодовые: яблоня, груша, вишня, виноград.
Специальные: газон, хвойные, базилик, пшеница, соя.
Generic — универсальный профиль.
Для каждой культуры заданы оптимальные диапазоны: температура, влажность, EC, pH, N, P, K.
Корректировки: сезон (весна/лето/осень/зима), тип среды (открытый грунт, теплица, помещение).
Типы почв (13): песок, суглинок, глина, торф, песчано-торфяная смесь, иловая, глинистый суглинок, органическая, песчанистый суглинок, иловатый суглинок, суглинистая глина, засоленная, щелочная.
Калибровка
Лабораторная (CSV)
Загрузка CSV через веб-интерфейс (/readings → загрузка файла). Профили: SAND, LOAM, PEAT. Линейная интерполяция по парам (raw, corrected).
API калибровки
GET /api/calibration/status — статус, количество точек.
POST /api/calibration/temperature, /api/calibration/humidity, /api/calibration/ec, /api/calibration/ph, /api/calibration/npk — добавление точек.
POST /api/calibration/reset — сброс.
GET /api/calibration/export, POST /api/calibration/import — экспорт/импорт.
Коррекция (множитель + смещение)
/api/correction/settings, /api/correction/factors — настройка slope/offset для влажности, EC, температуры.
/api/correction/reset — сброс.
Веб-интерфейс
Встроенный веб-сервер: WiFi/MQTT/ThingSpeak, показания в реальном времени, цветовая индикация (норма / внимание / предупреждение / критично), стрелки изменений после компенсации, AJAX-обно��ление (по умолчанию каждые 5 с), CSRF-защита.
Путь | Назначение |
|---|---|
/ | Настройки WiFi, MQTT, ThingSpeak |
/readings | Показания (RAW, компенс., рекомендации), загрузка CSV калибровки |
/intervals | Интервалы опроса, дельта-фильтр |
/updates | OTA обновления |
/service | Диагностика, перезагрузка, сброс |
/config_manager | Импорт/экспорт конфигурации |
Адаптивная вёрстка (mobile/tablet/desktop).
Скриншоты веб-интерфейса:




REST API
Версионированный API v1 (см. include/jxct_strings.h).
Метод | Путь | Описание |
|---|---|---|
GET | /api/v1/sensor | Данные датчика (JSON) |
GET | /api/v1/system/health | Диагностика |
GET | /api/v1/system/status | Статус сервисов |
POST | /api/v1/system/reset | Сброс настроек |
POST | /api/v1/system/reboot | Перезагрузка |
GET | /api/v1/config/export | Экспорт конфигурации |
POST | /api/config/import | Импорт конфигурации |
Отчёты: /api/reports/test-summary, /api/reports/technical-debt, /api/reports/full.
MQTT
Топики публикации: {prefix}/temperature, {prefix}/humidity, {prefix}/ec, {prefix}/ph, {prefix}/nitrogen, {prefix}/phosphorus, {prefix}/potassium, {prefix}/status.
Команды: jxct/command — reboot, reset, publish_test.
{prefix}/ota/command — check, install.
Интервалы: 1–60 мин (по умолчанию 30 мин).
Дельта-фильтр: публикация только при значимых изменениях.
Home Assistant
MQTT Discovery включён. Настройте брокер в web UI — датчик появляется в HA автоматически. Топики конфигурации: homeassistant/sensor/{device_id}_temperature/config и аналогично для остальных параметров.
ThingSpeak
Поля Field1–7: температура, влажность, EC, pH, N, P, K.
Интервал: 5–120 мин (по умолчанию 1 мин).
Валидация: NaN/Inf, диапазоны. Блокировка при серии ошибок, повторные попытки.
OTA 2.0
Манифест: https://github.com/Gfermoto/soil-sensor-7in1/releases/latest/download/manifest.json.
Проверка раз в час (или по команде).
Двухэтапная схема: проверка → установка через веб.
SHA256 проверка.
Локальная загрузка: /ota/upload — загрузка .bin через веб.
MQTT: {prefix}/ota/command — check, install.
Дополнительные возможности
Дельта-фильтр — публикация MQTT только при значимых изменениях.
Детектор полива — порог irrigationSpikeThreshold, удержание irrigationHoldMinutes.
Сезонные поправки — по широте/долготе.
NTP — синхронизация времени.
Фильтры — Калман, медиана, outlier.
Watchdog — 30 с (60 с при OTA).
Кнопка сброса — удержание 5 с.
Тесты — pytest, native unit tests, ~70% покрытие.
CI/CD — GitHub Actions.
Архитектура
Modbus RTU (9600)
modbus_sensor → SensorData (raw)
SensorCorrection (slope/offset)
CalibrationManager (CSV таблицы)
SensorCompensationService (Rhoades, Nernst, Delgado)
NutrientInteractionService (NPK антагонизм/синергизм)
AdvancedFilters (Калман, медиана, outlier)
CropRecommendationEngine (рекомендации)
Выход: Веб-интерфейс | REST API | MQTT | ThingSpeak
Быстрый старт
git clone https://github.com/Gfermoto/soil-sensor-7in1.git
cd soil-sensor-7in1
pip install -r requirements.txt
pio run -t upload
pio run -t uploadfs
После загрузки — точка доступа ESP32, настройка WiFi, веб по http://<IP>.
Стек
C++17, PlatformIO, Arduino, Modbus RTU (9600), CSRF, 90+ тестов, AGPL-3.0.
Репозиторий: github.com/Gfermoto/soil-sensor-7in1
Документация: gfermoto.github.io/soil-sensor-7in1
Вопросы — в комментариях или Issues на GitHub.
