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.h
См. документацию.
1#ifndef MODBUS_SENSOR_H
2#define MODBUS_SENSOR_H
3
4#include <Arduino.h>
5#include <ModbusMaster.h>
6
7// 🔥 ВОССТАНОВЛЕНЫ РАБОЧИЕ РЕГИСТРЫ из официальной документации JXCT:
8// ✅ ПРАВИЛЬНЫЕ Modbus адреса (подтверждены документацией):
9#define REG_PH 0x0006 // pH почвы (÷100)
10#define REG_SOIL_MOISTURE 0x0012 // Влажность почвы (÷10)
11#define REG_SOIL_TEMP 0x0013 // Температура почвы (÷10)
12#define REG_CONDUCTIVITY 0x0015 // Электропроводность (как есть)
13#define REG_NITROGEN 0x001E // Азот (как есть)
14#define REG_PHOSPHORUS 0x001F // Фосфор (как есть)
15#define REG_POTASSIUM 0x0020 // Калий (как есть)
16#define REG_FIRMWARE_VERSION 0x07 // Версия прошивки
17#define REG_CALIBRATION 0x08 // Калибровка
18#define REG_ERROR_STATUS 0x0B // Статус ошибок
19#define REG_DEVICE_ADDRESS 0x0C // Адрес устройства
20
21// Допустимые пределы измерений
22#define MIN_TEMPERATURE -10.0
23#define MAX_TEMPERATURE 50.0
24#define MIN_HUMIDITY 0.0
25#define MAX_HUMIDITY 100.0
26#define MIN_EC 0.0
27#define MAX_EC 20000.0
28#define MIN_PH 0.0
29#define MAX_PH 14.0
30#define MIN_NPK 0.0
31#define MAX_NPK 2000.0
32
33// Структура для хранения данных с датчика
35{
36 float temperature; // Температура почвы в °C (делится на 10)
37 float humidity; // Влажность почвы в % (делится на 10)
38 float ec; // Электропроводность почвы в µS/cm
39 float ph; // pH почвы (делится на 100)
40 float nitrogen; // Содержание азота в мг/кг
41 float phosphorus; // Содержание фосфора в мг/кг
42 float potassium; // Содержание калия в мг/кг
43 float moisture; // Добавляем поле для влажности
44 float conductivity; // Добавляем поле для электропроводности
45 uint16_t firmware_version; // Версия прошивки
46 uint8_t error_status; // Статус ошибок
47 bool valid; // Флаг валидности данных
48 bool isValid; // Альтернативное поле валидности для веб-интерфейса
49 unsigned long last_update; // Время последнего обновления
50 unsigned long timestamp; // Альтернативное поле времени для веб-интерфейса
51
52 // ДЕЛЬТА-ФИЛЬТР v2.2.1: Поля для хранения предыдущих значений
53 float prev_temperature; // Предыдущая температура для дельта-фильтра
54 float prev_humidity; // Предыдущая влажность для дельта-фильтра
55 float prev_ec; // Предыдущая EC для дельта-фильтра
56 float prev_ph; // Предыдущий pH для дельта-фильтра
57 float prev_nitrogen; // Предыдущий азот для дельта-фильтра
58 float prev_phosphorus; // Предыдущий фосфор для дельта-фильтра
59 float prev_potassium; // Предыдущий калий для дельта-фильтра
60 unsigned long last_mqtt_publish; // Время последней публикации MQTT
61
62 // СКОЛЬЗЯЩЕЕ СРЕДНЕЕ v2.3.0: Кольцевые буферы для усреднения
63 float temp_buffer[15]; // Буфер температуры (макс 15 значений)
64 float hum_buffer[15]; // Буфер влажности
65 float ec_buffer[15]; // Буфер EC
66 float ph_buffer[15]; // Буфер pH
67 float n_buffer[15]; // Буфер азота
68 float p_buffer[15]; // Буфер фосфора
69 float k_buffer[15]; // Буфер калия
70 uint8_t buffer_index; // Текущий индекс в буферах
71 uint8_t buffer_filled; // Количество заполненных элементов (0-15)
72
73 // RAW значения до компенсации (v2.5.1)
76 float raw_ec;
77 float raw_ph;
82};
83
84// Структура для кэширования данных
86{
89 unsigned long timestamp;
90};
91
92extern ModbusMaster modbus;
95extern String sensorLastError;
96
97// Получение текущих данных датчика
99
100// Инициализация Modbus
101void setupModbus();
102
103// Чтение данных с датчика
104void readSensorData();
105
106// Чтение версии прошивки
108
109// Чтение статуса ошибок
110bool readErrorStatus();
111
112// Изменение адреса устройства
113bool changeDeviceAddress(uint8_t new_address);
114
115// Проверка валидности значений
117
118// Получение кэшированных данных
119bool getCachedData(SensorData& data);
120
121// Преобразование значения регистра в число с плавающей точкой
122float convertRegisterToFloat(uint16_t value, float multiplier);
123
124// Функция предварительной передачи для управления SP3485E
125void preTransmission();
126
127// Функция после передачи для управления SP3485E
128void postTransmission();
129
130// Функция для вывода ошибок Modbus
131void printModbusError(uint8_t errNum);
132
134
135// v2.3.0: Функции скользящего среднего
136void addToMovingAverage(SensorData& data, float temp, float hum, float ec, float ph, float n, float p, float k);
137float calculateMovingAverage(float* buffer, uint8_t window_size, uint8_t filled);
139
140// Тестовые функции
141void testSP3485E(); // Тест драйвера SP3485E
142bool testModbusConnection(); // Диагностика Modbus связи
143void testSerialConfigurations(); // Тест конфигураций Serial2
144
145#endif // MODBUS_SENSOR_H
SensorCache sensorCache
Определения modbus_sensor.cpp:19
ModbusMaster modbus
Определения modbus_sensor.cpp:17
String sensorLastError
Определения modbus_sensor.cpp:20
SensorData sensorData
Определения modbus_sensor.cpp:18
void setupModbus()
Инициализация Modbus и SP3485E.
Определения modbus_sensor.cpp:80
void preTransmission()
Подготовка к передаче данных
Определения modbus_sensor.cpp:505
void postTransmission()
Завершение передачи данных
Определения modbus_sensor.cpp:517
void testSerialConfigurations()
SensorData getSensorData()
Определения modbus_sensor.cpp:730
void startRealSensorTask()
Определения modbus_sensor.cpp:541
bool readFirmwareVersion()
Определения modbus_sensor.cpp:153
bool readErrorStatus()
Определения modbus_sensor.cpp:172
bool getCachedData(SensorData &data)
Определения modbus_sensor.cpp:144
bool validateSensorData(SensorData &data)
Определения modbus_sensor.cpp:132
float calculateMovingAverage(float *buffer, uint8_t window_size, uint8_t filled)
Определения modbus_sensor.cpp:674
bool changeDeviceAddress(uint8_t new_address)
Определения modbus_sensor.cpp:183
void testSP3485E()
Тестирование работы SP3485E.
Определения modbus_sensor.cpp:45
void readSensorData()
Определения modbus_sensor.cpp:478
float convertRegisterToFloat(uint16_t value, float multiplier)
Определения modbus_sensor.cpp:495
void printModbusError(uint8_t errNum)
Определения modbus_sensor.cpp:547
void initMovingAverageBuffers(SensorData &data)
Определения modbus_sensor.cpp:588
bool testModbusConnection()
Определения modbus_sensor.cpp:199
void addToMovingAverage(SensorData &data, float temp, float hum, float ec, float ph, float n, float p, float k)
Определения modbus_sensor.cpp:606
float k
Определения sensor_compensation.cpp:7
Определения modbus_sensor.h:86
SensorData data
Определения modbus_sensor.h:87
unsigned long timestamp
Определения modbus_sensor.h:89
bool is_valid
Определения modbus_sensor.h:88
Определения modbus_sensor.h:35
float raw_humidity
Определения modbus_sensor.h:75
float phosphorus
Определения modbus_sensor.h:41
float temperature
Определения modbus_sensor.h:36
uint8_t buffer_index
Определения modbus_sensor.h:70
float nitrogen
Определения modbus_sensor.h:40
bool recentIrrigation
Определения modbus_sensor.h:81
float hum_buffer[15]
Определения modbus_sensor.h:64
bool valid
Определения modbus_sensor.h:47
float humidity
Определения modbus_sensor.h:37
float prev_phosphorus
Определения modbus_sensor.h:58
float n_buffer[15]
Определения modbus_sensor.h:67
float moisture
Определения modbus_sensor.h:43
float ec_buffer[15]
Определения modbus_sensor.h:65
float k_buffer[15]
Определения modbus_sensor.h:69
float raw_ph
Определения modbus_sensor.h:77
float raw_potassium
Определения modbus_sensor.h:80
bool isValid
Определения modbus_sensor.h:48
float ph_buffer[15]
Определения modbus_sensor.h:66
float raw_nitrogen
Определения modbus_sensor.h:78
float p_buffer[15]
Определения modbus_sensor.h:68
float prev_ph
Определения modbus_sensor.h:56
float prev_nitrogen
Определения modbus_sensor.h:57
float prev_ec
Определения modbus_sensor.h:55
float ec
Определения modbus_sensor.h:38
float temp_buffer[15]
Определения modbus_sensor.h:63
float raw_phosphorus
Определения modbus_sensor.h:79
float conductivity
Определения modbus_sensor.h:44
float prev_potassium
Определения modbus_sensor.h:59
unsigned long timestamp
Определения modbus_sensor.h:50
float raw_ec
Определения modbus_sensor.h:76
uint8_t error_status
Определения modbus_sensor.h:46
uint8_t buffer_filled
Определения modbus_sensor.h:71
float raw_temperature
Определения modbus_sensor.h:74
unsigned long last_update
Определения modbus_sensor.h:49
float ph
Определения modbus_sensor.h:39
unsigned long last_mqtt_publish
Определения modbus_sensor.h:60
float prev_humidity
Определения modbus_sensor.h:54
float potassium
Определения modbus_sensor.h:42
float prev_temperature
Определения modbus_sensor.h:53
uint16_t firmware_version
Определения modbus_sensor.h:45