О чём статья

Датчик 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- соблюдать строго.

Схема подключения
Схема подключения
Пояснение к схеме подключения
Пояснение к схеме подключения

Научная компенсация

Двухэтапная схема

  1. SensorCorrection — всегда включена: множитель + смещение для влажности, EC, температуры.

  2. 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.

Архитектура

  1. Modbus RTU (9600)

  2. modbus_sensor → SensorData (raw)

  3. SensorCorrection (slope/offset)

  4. CalibrationManager (CSV таблицы)

  5. SensorCompensationService (Rhoades, Nernst, Delgado)

  6. NutrientInteractionService (NPK антагонизм/синергизм)

  7. AdvancedFilters (Калман, медиана, outlier)

  8. CropRecommendationEngine (рекомендации)

  9. Выход: Веб-интерфейс | 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.

Репозиторий
Документация

Вопросы — в комментариях или Issues на GitHub.

Комментарии (8)


  1. LinkToOS
    22.03.2026 19:37

    Сомнительно что этот "датчик" можно вылечить правильными алгоритмами.


    1. Gfer Автор
      22.03.2026 19:37

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


  1. saege5b
    22.03.2026 19:37

    До чего наука дошла... в коммерции...

    Интересно было бы почитать научные обоснования, пощупать руками, и поискать НПК в растворе галита или в жидком стекле.


  1. NutsUnderline
    22.03.2026 19:37

    не очень понятно зачем засовывать все это в датчик. градусы есть градусы. расчеты это расчеты


  1. g992
    22.03.2026 19:37

    Я, конечно понимаю, что отформатировать текст с помощью GPT это ок, так как мы не все писатели, но вы хотя бы ссылки проверяйте, половина ведет на несуществующие статьи.
    Ну и форматирование формул, тоже имеет смысл подправить
    И неплохо было бы как то подтвердить весь сгенерированный код, что отдает нужные значения и калибровка выполняется корректно, все же датчики «7в1» обычно относят к формату показометров. Но может быть тут конечно исключение.


    1. Gfer Автор
      22.03.2026 19:37

      Спасибо за то что указали на ссылки. Поправил.

      Источник Правильный DOI / ссылка
      Rhoades et al., 1989 (EC) 10.2136/sssaj1989.03615995005300010009x
      Ross et al., 2008 (pH) 10.2136/sssaj2007.0219
      Delgado et al., 2020 (NPK) 10.1111/ejss.12950


  1. SmartTherm
    22.03.2026 19:37

    попробовал найти даташит на датчик. Даже нашел вебсайт производителя. Вместо даташита там фигвамы. Хоть какое-то описалово команд внезапно на Алибабе
    Как можно "научно" измерить 7 параметров пятью датчиками - неясно. Есть ли в пяти штырях пять датчиков - неясно. Та же температура - где измеряется? Сверху в коробочке? В штыре в самом низу? Черная коробочка сверху на солнце может легко нагреться (в теплице, в марте) до 50 градусов - и как оно прогреет эти штыри? А как температура коробочки влияет на схему измерения?


    Всё, что помимо датчика, сделано по красоте.
    Особо можно отметить, текст статьи для хабра на гитхабе, в md и с читабельными формулами.

    Но датчик всё портит. 7 в одном - что для качества воздуха, что для почвы - фуфломеры, которые как "научно" не улучшай, всё равно из г конфетку не сделать


    1. Gfer Автор
      22.03.2026 19:37

      Сылка на скан мануала https://github.com/Gfermoto/soil-sensor-7in1/blob/main/docs/manuals/JXCT Comprehensive Soil Sensor.pdf

      Датчик рекомендуют закапывать полностью.