JXCT Soil Sensor 7-in-1 3.10.1
IoT система мониторинга почвы на базе ESP32
Загрузка...
Поиск...
Не найдено
sensor_calibration_service.h
См. документацию.
1#pragma once
2
3#ifdef TEST_BUILD
4#include "../test/stubs/esp32_stubs.h"
5#else
6#include <Arduino.h>
7#endif
8#include <ArduinoJson.h>
9#include <vector>
10#include <map>
11#include "modbus_sensor.h" // Для структуры SensorData
12
13// ============================================================================
14// КОНСТАНТЫ СТАНДАРТНЫХ РАСТВОРОВ ДЛЯ КАЛИБРОВКИ
15// ============================================================================
16
23namespace StandardBuffers {
24 // pH буферные растворы (стандартные)
25 constexpr float PH_4_01 = 4.01F; // Кислый буфер
26 constexpr float PH_6_86 = 6.86F; // Нейтральный буфер
27 constexpr float PH_7_00 = 7.00F; // Нейтральный буфер
28 constexpr float PH_9_18 = 9.18F; // Щелочной буфер
29 constexpr float PH_10_01 = 10.01F; // Высокий щелочной буфер
30
31 // EC стандартные растворы (KCl)
32 constexpr float EC_1413_US = 1413.0F; // 1413 µS/cm
33 constexpr float EC_1_413_MS = 1.413F; // 1.413 mS/cm
34 constexpr float EC_12_88_MS = 12.88F; // 12.88 mS/cm
35 constexpr float EC_0_1413_MS = 0.1413F; // 0.1413 mS/cm
36
37 // Максимальное количество калибровочных точек
38 constexpr size_t MAX_PH_POINTS = 6; // pH буферные растворы
39 constexpr size_t MAX_EC_POINTS = 5; // EC стандартные растворы
40 constexpr size_t MAX_NPK_POINTS = 3; // NPK калибровка (обычно 1-3 точки)
42}
43
52// ============================================================================
53// СТРУКТУРЫ ДАННЫХ КАЛИБРОВКИ
54// ============================================================================
55
63{
64 float rawValue; // Исходное значение датчика
65 float referenceValue; // Эталонное значение
66
67 // Конструкторы для обратной совместимости
69 CalibrationPoint(float raw, float reference) : rawValue(raw), referenceValue(reference) {}
70
71 // Методы для обратной совместимости
72 float getExpected() const { return referenceValue; }
73 float getMeasured() const { return rawValue; }
74 void setExpected(float value) { referenceValue = value; }
75 void setMeasured(float value) { rawValue = value; }
76
77 // Операторы присваивания для совместимости с STL
79 if (this != &other) {
80 rawValue = other.rawValue;
82 }
83 return *this;
84 }
85
87 if (this != &other) {
88 rawValue = other.rawValue;
89 referenceValue = other.referenceValue;
90 }
91 return *this;
92 }
93
94 // Конструктор копирования
96
97 // Конструктор перемещения
98 CalibrationPoint(CalibrationPoint&& other) noexcept : rawValue(other.rawValue), referenceValue(other.referenceValue) {}
99};
100
106struct PHCalibration
107{
108 std::vector<CalibrationPoint> points;
109 float coefficient_a; // pH_corrected = a × pH_raw + b
111 float r_squared; // Коэффициент детерминации
113
114 PHCalibration() : coefficient_a(1.0f), coefficient_b(0.0f), r_squared(0.0f), is_valid(false) {}
115};
116
122struct ECCalibration
123{
124 std::vector<CalibrationPoint> points;
125 float coefficient_c; // EC_corrected = c × EC_raw + d
129
130 ECCalibration() : coefficient_c(1.0f), coefficient_d(0.0f), r_squared(0.0f), is_valid(false) {}
131};
132
138struct NPKCalibration
139{
140 float offset_nitrogen; // NPK_corrected = NPK_raw + offset
144
146};
147
153struct CalibrationTable
154{
155 std::vector<CalibrationPoint> temperaturePoints;
156 std::vector<CalibrationPoint> humidityPoints;
157 std::vector<CalibrationPoint> ecPoints;
158 std::vector<CalibrationPoint> phPoints;
159 std::vector<CalibrationPoint> nitrogenPoints;
160 std::vector<CalibrationPoint> phosphorusPoints;
161 std::vector<CalibrationPoint> potassiumPoints;
162
163 bool isValid;
164
166};
167
184
185// ============================================================================
186// ОСНОВНОЙ КЛАСС КАЛИБРОВКИ
187// ============================================================================
188
196{
197 private:
198 // Текущая калибровка датчика
199 SensorCalibration current_calibration;
200
201 // Калибровочные таблицы для разных профилей почвы
202 static std::map<int, CalibrationTable> calibrationTables;
203
204 // ============================================================================
205 // ПРИВАТНЫЕ МЕТОДЫ
206 // ============================================================================
207
208 // Расчёт коэффициентов линейной регрессии
209 bool calculateLinearRegression(const std::vector<CalibrationPoint>& points, float& slope, float& intercept,
210 float& r_squared);
211
212 // Применение калибровки к сырым данным
213 float applyPHCalibration(float raw_ph);
214 float applyECCalibration(float raw_ec);
215 void applyNPKCalibration(float& nitrogen, float& phosphorus, float& potassium);
216
217 // Применение калибровки к значению с интерполяцией
218 float applyCalibrationWithInterpolation(float rawValue, const std::vector<CalibrationPoint>& points) const;
219
220 // Линейная интерполяция между двумя точками
221 float linearInterpolation(float value, float x1, float y1, float x2, float y2) const;
222
223 // Парсинг CSV данных калибровочной таблицы
224 bool parseCalibrationCSV(const String& csvData, CalibrationTable& table);
225
226 // Валидация калибровочных точек
227 bool validateCalibrationPoints(const std::vector<CalibrationPoint>& points) const;
228
229 public:
230 // ============================================================================
231 // КОНСТРУКТОР И ДЕСТРУКТОР
232 // ============================================================================
233
235 virtual ~SensorCalibrationService() = default;
236
237 // ============================================================================
238 // МЕТОДЫ ДОБАВЛЕНИЯ КАЛИБРОВОЧНЫХ ТОЧЕК
239 // ============================================================================
240
248 bool addPHCalibrationPoint(float expected, float measured);
249
257 bool addECCalibrationPoint(float expected, float measured);
258<<<<<<< HEAD
259
268=======
269 bool addTemperatureCalibrationPoint(float expected, float measured);
270 bool addHumidityCalibrationPoint(float expected, float measured);
271>>>>>>> develop
272 bool setNPKCalibrationPoint(float measured_n, float measured_p, float measured_k);
273
274 // ============================================================================
275 // МЕТОДЫ РАСЧЁТА КАЛИБРОВОЧНЫХ КОЭФФИЦИЕНТОВ
276 // ============================================================================
277
284
291
298
299 // ============================================================================
300 // МЕТОДЫ ПРИМЕНЕНИЯ КАЛИБРОВКИ
301 // ============================================================================
302
312 void applyCalibration(float& ph, float& ec, float& nitrogen, float& phosphorus, float& potassium);
313
320 void applyCalibration(SensorData& data, int profile);
321
329 float applySingleCalibration(float rawValue, int profile);
330
331 // ============================================================================
332 // МЕТОДЫ СЕРИАЛИЗАЦИИ/ДЕСЕРИАЛИЗАЦИИ
333 // ============================================================================
334
341
348 bool importCalibrationFromJSON(const String& json_data);
349
350 // ============================================================================
351 // МЕТОДЫ УПРАВЛЕНИЯ КАЛИБРОВОЧНЫМИ ТАБЛИЦАМИ
352 // ============================================================================
353
361 bool loadCalibrationTable(const String& csvData, int profile);
362
369 bool hasCalibrationTable(int profile) const;
370
376 void clearCalibrationTable(int profile);
377
385 static size_t getCalibrationPointsCount(int profile, const String& sensorType);
386
393 static String exportCalibrationTable(int profile);
394
395 // ============================================================================
396 // МЕТОДЫ СТАТУСА И ВАЛИДАЦИИ
397 // ============================================================================
398
404 String getCalibrationStatus() const;
405
412
417
423 bool validateCalibration() const;
424
432};
433
434// ============================================================================
435// ГЛОБАЛЬНЫЙ ЭКЗЕМПЛЯР
436// ============================================================================
437
Сервис калибровки датчиков
Definition sensor_calibration_service.h:59
bool validateCalibration() const
Валидирует калибровку
Definition unified_calibration_service.cpp:784
bool addPHCalibrationPoint(float expected, float measured)
Добавляет точку калибровки pH.
bool isCalibrationComplete() const
Проверяет завершённость калибровки
bool importCalibrationFromJSON(const String &json_data)
Импортирует калибровку из JSON.
bool validateCalibrationData(const SensorData &data)
Проверяет валидность калибровочных данных
void resetCalibration()
Сбрасывает калибровку
<<<<<<< HEAD=======bool addTemperatureCalibrationPoint(float expected, float measured);bool addHumidityCalibrationPoint(float expected, float measured);> > > > > > develop bool setNPKCalibrationPoint(float measured_n, float measured_p, float measured_k)
Устанавливает точку калибровки NPK.
void applyCalibration(SensorData &data, SoilProfile profile) override
Применяет калибровку к данным датчика
Definition sensor_calibration_service.cpp:31
bool calculatePHCalibration()
Рассчитывает коэффициенты калибровки pH.
bool addTemperatureCalibrationPoint(float expected, float measured) override
Добавляет точку калибровки температуры
Definition sensor_calibration_service.cpp:454
bool calculateECCalibration()
Рассчитывает коэффициенты калибровки EC.
String getCalibrationStatus() const
Получает статус калибровки
virtual ~SensorCalibrationService()=default
bool addECCalibrationPoint(float expected, float measured)
Добавляет точку калибровки EC.
bool addHumidityCalibrationPoint(float expected, float measured) override
Добавляет точку калибровки влажности
Definition sensor_calibration_service.cpp:477
bool loadCalibrationTable(const String &csvData, SoilProfile profile) override
Загружает калибровочную таблицу из CSV.
Definition sensor_calibration_service.cpp:128
bool hasCalibrationTable(SoilProfile profile) const override
Проверяет наличие калибровочной таблицы
Definition sensor_calibration_service.cpp:144
float applySingleCalibration(float rawValue, SoilProfile profile) override
Применяет калибровку к отдельному значению
Definition sensor_calibration_service.cpp:100
bool calculateNPKCalibration()
Рассчитывает коэффициенты калибровки NPK.
Definition unified_calibration_service.cpp:212
static String exportCalibrationTable(SoilProfile profile)
Экспортирует калибровочную таблицу в CSV.
Definition sensor_calibration_service.cpp:201
void clearCalibrationTable(SoilProfile profile) override
Очищает калибровочную таблицу
Definition sensor_calibration_service.cpp:150
size_t getCalibrationPointsCount(SoilProfile profile, const String &sensorType) override
Получает количество точек калибровки
Definition sensor_calibration_service.cpp:160
String exportCalibrationToJSON()
Экспортирует калибровку в JSON.
SensorCalibrationService gCalibrationService
Definition unified_calibration_service.cpp:19
Стандартные буферные растворы для pH калибровки
Definition sensor_calibration_service.h:23
constexpr size_t MAX_EC_POINTS
Definition sensor_calibration_service.h:39
constexpr float EC_1413_US
Definition sensor_calibration_service.h:32
constexpr float PH_6_86
Definition sensor_calibration_service.h:26
constexpr float PH_9_18
Definition sensor_calibration_service.h:28
constexpr float EC_1_413_MS
Definition sensor_calibration_service.h:33
constexpr float PH_10_01
Definition sensor_calibration_service.h:29
constexpr float PH_7_00
Definition sensor_calibration_service.h:27
constexpr float EC_0_1413_MS
Definition sensor_calibration_service.h:35
constexpr float PH_4_01
Definition sensor_calibration_service.h:25
constexpr size_t MAX_PH_POINTS
Definition sensor_calibration_service.h:38
constexpr size_t MAX_TOTAL_POINTS
Definition sensor_calibration_service.h:41
constexpr float EC_12_88_MS
Definition sensor_calibration_service.h:34
constexpr size_t MAX_NPK_POINTS
Definition sensor_calibration_service.h:40
Definition fake_sensor.cpp:26
Точка калибровки
Definition sensor_calibration_service.h:24
CalibrationPoint(const CalibrationPoint &other)
Definition sensor_calibration_service.h:95
float getMeasured() const
Definition sensor_calibration_service.h:73
void setMeasured(float value)
Definition sensor_calibration_service.h:75
CalibrationPoint(float raw, float reference)
Definition sensor_calibration_service.h:69
CalibrationPoint & operator=(const CalibrationPoint &other)
Definition sensor_calibration_service.h:78
float referenceValue
Definition sensor_calibration_service.h:26
float getExpected() const
Definition sensor_calibration_service.h:72
CalibrationPoint & operator=(CalibrationPoint &&other) noexcept
Definition sensor_calibration_service.h:86
float rawValue
Definition sensor_calibration_service.h:25
void setExpected(float value)
Definition sensor_calibration_service.h:74
CalibrationPoint(CalibrationPoint &&other) noexcept
Definition sensor_calibration_service.h:98
CalibrationPoint()
Definition sensor_calibration_service.h:68
Калибровочная таблица
Definition sensor_calibration_service.h:38
std::vector< CalibrationPoint > phPoints
Definition sensor_calibration_service.h:42
std::vector< CalibrationPoint > potassiumPoints
Definition sensor_calibration_service.h:45
std::vector< CalibrationPoint > temperaturePoints
Definition sensor_calibration_service.h:39
std::vector< CalibrationPoint > phosphorusPoints
Definition sensor_calibration_service.h:44
std::vector< CalibrationPoint > ecPoints
Definition sensor_calibration_service.h:41
CalibrationTable()
Definition sensor_calibration_service.h:165
std::vector< CalibrationPoint > nitrogenPoints
Definition sensor_calibration_service.h:43
bool isValid
Definition sensor_calibration_service.h:47
std::vector< CalibrationPoint > humidityPoints
Definition sensor_calibration_service.h:40
Калибровка EC (многоточечная с линейной регрессией)
Definition calibration_data.h:67
float coefficient_d
Definition sensor_calibration_service.h:126
float r_squared
Definition sensor_calibration_service.h:127
std::vector< CalibrationPoint > points
Definition sensor_calibration_service.h:124
float coefficient_c
Definition sensor_calibration_service.h:125
ECCalibration()
Definition sensor_calibration_service.h:130
bool is_valid
Definition sensor_calibration_service.h:128
Калибровка NPK (нулевая точка в дистиллированной воде)
Definition calibration_data.h:79
bool is_valid
Definition sensor_calibration_service.h:143
float offset_phosphorus
Definition sensor_calibration_service.h:141
NPKCalibration()
Definition sensor_calibration_service.h:145
float offset_nitrogen
Definition sensor_calibration_service.h:140
float offset_potassium
Definition sensor_calibration_service.h:142
Калибровка pH (многоточечная с линейной регрессией)
Definition calibration_data.h:55
float r_squared
Definition sensor_calibration_service.h:111
float coefficient_a
Definition sensor_calibration_service.h:109
bool is_valid
Definition sensor_calibration_service.h:112
float coefficient_b
Definition sensor_calibration_service.h:110
PHCalibration()
Definition sensor_calibration_service.h:114
std::vector< CalibrationPoint > points
Definition sensor_calibration_service.h:108
Полная калибровка датчика
Definition sensor_calibration_service.h:174
SensorCalibration()
Definition sensor_calibration_service.h:182
String calibration_date
Definition sensor_calibration_service.h:176
String sensor_id
Definition sensor_calibration_service.h:175
bool is_complete
Definition sensor_calibration_service.h:180
NPKCalibration npk
Definition sensor_calibration_service.h:179
PHCalibration ph
Definition sensor_calibration_service.h:177
ECCalibration ec
Definition sensor_calibration_service.h:178
Данные датчика
Definition sensor_types.h:77