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
Загрузка...
Поиск...
Не найдено
fake_sensor.cpp
См. документацию.
1
6#include "fake_sensor.h"
7#include "modbus_sensor.h"
9#include "jxct_config_vars.h"
10#include "debug.h" // ✅ Добавляем систему условной компиляции
11#include <Arduino.h>
12
13// ✅ Неблокирующая задача эмуляции датчика с оптимизированным циклом
14void fakeSensorTask(void *pvParameters)
15{
16 const TickType_t taskDelay = 1000 / portTICK_PERIOD_MS; // 1 секунда
17 const uint32_t dataGenerationInterval = 10; // Генерация данных каждые 10 итераций
18 uint32_t iterationCounter = 0;
19
20 for (;;)
21 {
22 // Генерируем данные только каждые 10 секунд
23 if (iterationCounter >= dataGenerationInterval)
24 {
25 sensorData.temperature = 22.0 + random(-50, 50) / 10.0; // 17.0..27.0
26 sensorData.humidity = 50.0 + random(-200, 200) / 10.0; // 30..70
27 sensorData.ec = 1000 + random(-200, 200); // 800..1200
28 sensorData.ph = 6.5 + random(-20, 20) / 10.0; // 4.5..8.5
29
30 // NPK в мг/дм³ (как в даташите)
31 float n = 30 + random(-10, 10); // 20..40
32 float p = 15 + random(-5, 5); // 10..20
33 float k = 20 + random(-5, 5); // 15..25
34
35 // Конверсия в мг/кг (как в рекомендациях)
36 constexpr float NPK_FACTOR = 6.5f; // пересчёт мг/дм³ → мг/кг (ρ=1.3 г/см³, влажность ≈30%)
37 sensorData.nitrogen = n * NPK_FACTOR;
38 sensorData.phosphorus = p * NPK_FACTOR;
39 sensorData.potassium = k * NPK_FACTOR;
40
41 sensorData.valid = true;
42 sensorData.last_update = millis(); // ✅ Обновляем timestamp
43
44 // RAW значения до компенсации
45 sensorData.raw_temperature = sensorData.temperature;
46 sensorData.raw_humidity = sensorData.humidity;
47 sensorData.raw_ec = sensorData.ec;
48 sensorData.raw_ph = sensorData.ph;
49 // RAW до компенсации, но уже в правильных единицах (мг/кг)
50 sensorData.raw_nitrogen = sensorData.nitrogen;
51 sensorData.raw_phosphorus = sensorData.phosphorus;
52 sensorData.raw_potassium = sensorData.potassium;
53
54 // Применяем компенсацию, если включена
55 if (config.flags.calibrationEnabled)
56 {
57 SoilType soil;
58 switch (config.soilProfile)
59 {
60 case 0: soil = SoilType::SAND; break;
61 case 1: soil = SoilType::LOAM; break;
62 case 2: soil = SoilType::PEAT; break;
63 case 3: soil = SoilType::CLAY; break;
64 case 4: soil = SoilType::SANDPEAT; break;
65 default: soil = SoilType::LOAM; break;
66 }
67
68 // 1. EC: температурная компенсация → затем модель Арчи
69 float ec25 = sensorData.ec / (1.0f + 0.021f * (sensorData.temperature - 25.0f));
70 sensorData.ec = correctEC(ec25,
71 sensorData.temperature,
72 sensorData.humidity,
73 soil);
74
75 // 2. pH: температурная поправка
76 sensorData.ph = correctPH(sensorData.ph, sensorData.temperature);
77
78 // 3. NPK: зависимость от T, θ и типа почвы
79 correctNPK(sensorData.temperature,
80 sensorData.humidity,
81 sensorData.nitrogen,
82 sensorData.phosphorus,
83 sensorData.potassium,
84 soil);
85 }
86
87 DEBUG_PRINTLN("[fakeSensorTask] Сгенерированы тестовые данные датчика");
88 iterationCounter = 0; // Сброс счетчика
89 }
90
91 iterationCounter++;
92
93 // ✅ Более частые, но короткие задержки для отзывчивости
94 vTaskDelay(taskDelay);
95 }
96}
97
99{
100 xTaskCreate(fakeSensorTask, "FakeSensor", 4096, NULL, 1, NULL);
101}
Config config
Определения config.cpp:34
#define DEBUG_PRINTLN(x)
Определения debug.h:18
void fakeSensorTask(void *pvParameters)
Определения fake_sensor.cpp:14
void startFakeSensorTask()
Определения fake_sensor.cpp:98
SensorData sensorData
Определения modbus_sensor.cpp:18
float k
Определения sensor_compensation.cpp:7
void correctNPK(float T, float theta, float &N, float &P, float &K, SoilType soil)
Определения sensor_compensation.cpp:45
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
@ LOAM
Определения sensor_compensation.h:23
@ CLAY
Определения sensor_compensation.h:23
@ PEAT
Определения sensor_compensation.h:23
@ SANDPEAT
Определения sensor_compensation.h:23
@ SAND
Определения sensor_compensation.h:23