JXCT Soil Sensor 7-in-1 v3.4.9 (June 2025)
Professional IoT soil monitoring system with ESP32, Modbus RTU, MQTT, and advanced compensation algorithms
Загрузка...
Поиск...
Не найдено
Файл modbus_sensor.cpp

Работа с Modbus-датчиком JXCT. Подробнее...

#include <Arduino.h>
#include "modbus_sensor.h"
#include "jxct_device_info.h"
#include "jxct_config_vars.h"
#include "debug.h"
#include "logger.h"
#include "jxct_constants.h"
#include "sensor_compensation.h"
#include "calibration_manager.h"

См. исходные тексты.

Функции

void debugPrintBuffer (const char *prefix, uint8_t *buffer, size_t length)
 
void testSP3485E ()
 Тестирование работы SP3485E.
 
void setupModbus ()
 Инициализация Modbus и SP3485E.
 
uint16_t calculateCRC16 (uint8_t *data, size_t length)
 
bool validateSensorData (SensorData &data)
 
bool getCachedData (SensorData &data)
 
bool readFirmwareVersion ()
 
bool readErrorStatus ()
 
bool changeDeviceAddress (uint8_t new_address)
 
bool testModbusConnection ()
 
bool readSingleRegister (uint16_t reg_addr, const char *reg_name, float multiplier, void *target, bool is_float)
 Чтение одного регистра с обработкой ошибок
 
int readBasicParameters ()
 Чтение основных параметров (температура, влажность, pH, EC)
 
int readNPKParameters ()
 Чтение NPK параметров (азот, фосфор, калий)
 
static void saveRawSnapshot (SensorData &d)
 
static void updateIrrigationFlag (SensorData &d)
 
static void applyCompensationIfEnabled (SensorData &d)
 
void finalizeSensorData (bool success)
 Финализация данных датчика (валидация, кэширование, скользящее среднее)
 
void readSensorData ()
 
float convertRegisterToFloat (uint16_t value, float multiplier)
 
void preTransmission ()
 Подготовка к передаче данных
 
void postTransmission ()
 Завершение передачи данных
 
void realSensorTask (void *pvParameters)
 
void startRealSensorTask ()
 
void printModbusError (uint8_t errNum)
 
void initMovingAverageBuffers (SensorData &data)
 
void addToMovingAverage (SensorData &data, float temp, float hum, float ec, float ph, float n, float p, float k)
 
float calculateMovingAverage (float *buffer, uint8_t window_size, uint8_t filled)
 
SensorData getSensorData ()
 

Переменные

ModbusMaster modbus
 
SensorData sensorData
 
SensorCache sensorCache
 
String sensorLastError = ""
 
static unsigned long lastIrrigationTs = 0
 

Подробное описание

Работа с Modbus-датчиком JXCT.

Реализация функций и задач для опроса датчика по Modbus RTU, преобразование данных, управление линией передачи.

См. определение в файле modbus_sensor.cpp

Функции

◆ addToMovingAverage()

◆ applyCompensationIfEnabled()

static void applyCompensationIfEnabled ( SensorData & d)
static

◆ calculateCRC16()

uint16_t calculateCRC16 ( uint8_t * data,
size_t length )

См. определение в файле modbus_sensor.cpp строка 109

◆ calculateMovingAverage()

float calculateMovingAverage ( float * buffer,
uint8_t window_size,
uint8_t filled )

См. определение в файле modbus_sensor.cpp строка 674

Перекрестные ссылки config.

Используется в addToMovingAverage().

◆ changeDeviceAddress()

bool changeDeviceAddress ( uint8_t new_address)

См. определение в файле modbus_sensor.cpp строка 183

Перекрестные ссылки modbus и REG_DEVICE_ADDRESS.

◆ convertRegisterToFloat()

float convertRegisterToFloat ( uint16_t value,
float multiplier )

См. определение в файле modbus_sensor.cpp строка 495

Используется в readSingleRegister().

◆ debugPrintBuffer()

void debugPrintBuffer ( const char * prefix,
uint8_t * buffer,
size_t length )

См. определение в файле modbus_sensor.cpp строка 24

Перекрестные ссылки currentLogLevel, LOG_DEBUG и logDebug().

◆ finalizeSensorData()

void finalizeSensorData ( bool success)

Финализация данных датчика (валидация, кэширование, скользящее среднее)

Аргументы
successФлаг успешности чтения всех параметров

См. определение в файле modbus_sensor.cpp строка 442

Перекрестные ссылки addToMovingAverage(), applyCompensationIfEnabled(), logError(), logSuccess(), logWarn(), saveRawSnapshot(), sensorCache, sensorData, updateIrrigationFlag() и validateSensorData().

Используется в readSensorData().

◆ getCachedData()

bool getCachedData ( SensorData & data)

См. определение в файле modbus_sensor.cpp строка 144

Перекрестные ссылки MODBUS_CACHE_TIMEOUT и sensorCache.

◆ getSensorData()

SensorData getSensorData ( )

◆ initMovingAverageBuffers()

void initMovingAverageBuffers ( SensorData & data)

◆ postTransmission()

void postTransmission ( )

Завершение передачи данных

Выключает передатчик и включает приемник с необходимой задержкой. Важно: Задержка 50 мкс необходима для корректного переключения режимов

См. определение в файле modbus_sensor.cpp строка 517

Перекрестные ссылки MODBUS_DE_PIN и MODBUS_RE_PIN.

Используется в setupModbus() и testModbusConnection().

◆ preTransmission()

void preTransmission ( )

Подготовка к передаче данных

Включает передатчик и отключает приемник с необходимой задержкой. Важно: Задержка 50 мкс необходима для стабилизации сигналов на шине RS-485

См. определение в файле modbus_sensor.cpp строка 505

Перекрестные ссылки MODBUS_DE_PIN и MODBUS_RE_PIN.

Используется в setupModbus() и testModbusConnection().

◆ printModbusError()

void printModbusError ( uint8_t errNum)

См. определение в файле modbus_sensor.cpp строка 547

Перекрестные ссылки logError() и logSuccess().

Используется в readFirmwareVersion() и readSingleRegister().

◆ readBasicParameters()

int readBasicParameters ( )

Чтение основных параметров (температура, влажность, pH, EC)

Возвращает
Количество успешно прочитанных параметров

См. определение в файле modbus_sensor.cpp строка 319

Перекрестные ссылки readSingleRegister(), REG_CONDUCTIVITY, REG_PH, REG_SOIL_MOISTURE, REG_SOIL_TEMP и sensorData.

Используется в readSensorData().

◆ readErrorStatus()

bool readErrorStatus ( )

См. определение в файле modbus_sensor.cpp строка 172

Перекрестные ссылки modbus, REG_ERROR_STATUS и sensorData.

◆ readFirmwareVersion()

bool readFirmwareVersion ( )

См. определение в файле modbus_sensor.cpp строка 153

Перекрестные ссылки logError(), logSensor(), logSuccess(), modbus и printModbusError().

◆ readNPKParameters()

int readNPKParameters ( )

Чтение NPK параметров (азот, фосфор, калий)

Возвращает
Количество успешно прочитанных параметров

См. определение в файле modbus_sensor.cpp строка 342

Перекрестные ссылки readSingleRegister(), REG_NITROGEN, REG_PHOSPHORUS, REG_POTASSIUM и sensorData.

Используется в readSensorData().

◆ readSensorData()

void readSensorData ( )

См. определение в файле modbus_sensor.cpp строка 478

Перекрестные ссылки finalizeSensorData(), logSensor(), readBasicParameters() и readNPKParameters().

Используется в realSensorTask().

◆ readSingleRegister()

bool readSingleRegister ( uint16_t reg_addr,
const char * reg_name,
float multiplier,
void * target,
bool is_float )

Чтение одного регистра с обработкой ошибок

Аргументы
reg_addrАдрес регистра
reg_nameНазвание регистра для логирования
multiplierМножитель для конвертации
targetУказатель на переменную для сохранения результата
is_floatФлаг - сохранять как float или int
Возвращает
true если чтение успешно

См. определение в файле modbus_sensor.cpp строка 284

Перекрестные ссылки convertRegisterToFloat(), logDebug(), logError(), modbus и printModbusError().

Используется в readBasicParameters() и readNPKParameters().

◆ realSensorTask()

void realSensorTask ( void * pvParameters)

См. определение в файле modbus_sensor.cpp строка 525

Перекрестные ссылки COLOR_CYAN, config, logPrintHeader(), logSystem() и readSensorData().

Используется в startRealSensorTask().

◆ saveRawSnapshot()

◆ setupModbus()

void setupModbus ( )

Инициализация Modbus и SP3485E.

Настраивает пины управления SP3485E и инициализирует UART для Modbus. Важно: DE и RE управляются раздельно для лучшего контроля над временем переключения

См. определение в файле modbus_sensor.cpp строка 80

Перекрестные ссылки COLOR_CYAN, COLOR_GREEN, JXCT_MODBUS_ID, logPrintHeader(), logSuccess(), logSystem(), modbus, MODBUS_DE_PIN, MODBUS_RE_PIN, MODBUS_RX_PIN, MODBUS_TX_PIN, postTransmission() и preTransmission().

Используется в ModbusSensorAdapter::ModbusSensorAdapter().

◆ startRealSensorTask()

void startRealSensorTask ( )

См. определение в файле modbus_sensor.cpp строка 541

Перекрестные ссылки realSensorTask().

Используется в setup().

◆ testModbusConnection()

bool testModbusConnection ( )

См. определение в файле modbus_sensor.cpp строка 199

Перекрестные ссылки logError(), logSuccess(), logSystem(), logWarn(), modbus, MODBUS_DE_PIN, MODBUS_RE_PIN, postTransmission() и preTransmission().

◆ testSP3485E()

void testSP3485E ( )

Тестирование работы SP3485E.

Проверяет корректность работы пинов DE и RE:

  1. Устанавливает оба пина в режим OUTPUT
  2. Проверяет переключение HIGH/LOW
  3. Проверяет возможность независимого управления передатчиком и приемником

См. определение в файле modbus_sensor.cpp строка 45

Перекрестные ссылки logSuccess(), logSystem(), logWarn(), MODBUS_DE_PIN и MODBUS_RE_PIN.

◆ updateIrrigationFlag()

static void updateIrrigationFlag ( SensorData & d)
static

См. определение в файле modbus_sensor.cpp строка 373

Перекрестные ссылки config, SensorData::humidity, lastIrrigationTs и SensorData::recentIrrigation.

Используется в finalizeSensorData().

◆ validateSensorData()

bool validateSensorData ( SensorData & data)

Переменные

◆ lastIrrigationTs

unsigned long lastIrrigationTs = 0
static

См. определение в файле modbus_sensor.cpp строка 22

Используется в updateIrrigationFlag().

◆ modbus

ModbusMaster modbus

См. определение в файле modbus_sensor.cpp строка 17

Используется в changeDeviceAddress(), readErrorStatus(), readFirmwareVersion(), readSingleRegister(), setupModbus() и testModbusConnection().

◆ sensorCache

SensorCache sensorCache

См. определение в файле modbus_sensor.cpp строка 19

Используется в finalizeSensorData() и getCachedData().

◆ sensorData

◆ sensorLastError

String sensorLastError = ""

См. определение в файле modbus_sensor.cpp строка 20

Используется в sendHealthJson() и sendServiceStatusJson().