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
Загрузка...
Поиск...
Не найдено
sensor_compensation.cpp
См. документацию.
2#include "jxct_config_vars.h"
3#include <math.h>
4#include <time.h>
5
6// --- коэффициенты ------------------------------------------------
7static constexpr struct { float k; } SOIL_EC[] = {
8 {0.15f}, // SAND
9 {0.30f}, // LOAM
10 {0.10f}, // PEAT
11 {0.45f}, // CLAY
12 {0.18f} // SANDPEAT
13};
14
15static constexpr float k_t_N[5] = {0.0041f, 0.0038f, 0.0028f, 0.0032f, 0.0040f};
16static constexpr float k_t_P[5] = {0.0053f, 0.0049f, 0.0035f, 0.0042f, 0.0051f};
17static constexpr float k_t_K[5] = {0.0032f, 0.0029f, 0.0018f, 0.0024f, 0.0031f};
18
19// влажностные коэффициенты (λ-функции заменить не можем, считаем прямо)
20static inline float k_h_N(float th){ return 1.8f - 0.024f*th; }
21static inline float k_h_P(float th){ return 1.6f - 0.018f*th; }
22static inline float k_h_K(float th){ return 1.9f - 0.021f*th; }
23
24// ------------------------------------------------------------------
25// EC ----------------------------------------------------------------
26float correctEC(float ecRaw, float T, float theta, SoilType soil)
27{
28 // Шаг 1. Температурная компенсация к 25 °C
29 float ec25 = ecRaw / (1.0f + 0.021f * (T - 25.0f));
30
31 // Шаг 2. Перевод к ECe (насыщенная паста)
32 constexpr float THETA_SAT = 45.0f; // %
33 float k = SOIL_EC[(int)soil].k;
34 return ec25 * powf(THETA_SAT / theta, 1.0f + k);
35}
36
37// pH ----------------------------------------------------------------
38float correctPH(float phRaw, float T)
39{
40 // только температурная поправка (-0.003·ΔT)
41 return phRaw - 0.003f * (T - 25.0f);
42}
43
44// NPK ---------------------------------------------------------------
45void correctNPK(float T, float theta,
46 float& N, float& P, float& K, SoilType soil)
47{
48 if (theta < 25.0f || theta > 60.0f)
49 return; // валидация – оставляем как есть
50
51 int idx = (int)soil;
52
53 // Температурная коррекция
54 N *= (1.0f - k_t_N[idx]*(T - 25.0f));
55 P *= (1.0f - k_t_P[idx]*(T - 25.0f));
56 K *= (1.0f - k_t_K[idx]*(T - 25.0f));
57
58 // Влажностная коррекция
59 N *= k_h_N(theta);
60 P *= k_h_P(theta);
61 K *= k_h_K(theta);
62}
63// ------------------------------------------------------------------
static float k_h_K(float th)
Определения sensor_compensation.cpp:22
float k
Определения sensor_compensation.cpp:7
void correctNPK(float T, float theta, float &N, float &P, float &K, SoilType soil)
Определения sensor_compensation.cpp:45
static constexpr float k_t_P[5]
Определения sensor_compensation.cpp:16
static constexpr struct @016332004146266166342013117042232226317123312235 SOIL_EC[]
static constexpr float k_t_N[5]
Определения sensor_compensation.cpp:15
static float k_h_N(float th)
Определения sensor_compensation.cpp:20
static float k_h_P(float th)
Определения sensor_compensation.cpp:21
static constexpr float k_t_K[5]
Определения sensor_compensation.cpp:17
float correctPH(float phRaw, float T)
Определения sensor_compensation.cpp:38
float correctEC(float ecRaw, float T, float theta, SoilType soil)
Определения sensor_compensation.cpp:26
Алгоритмы коррекции показаний датчиков
SoilType
Определения sensor_compensation.h:23