From b21dc720ed6de9dfb134cf73f95a4b999c4168ecb345b3f0d8590958e0887091 Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 26 Dec 2024 20:00:37 +0100 Subject: [PATCH 1/4] use lab single sensor --- main/inputs.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/main/inputs.c b/main/inputs.c index cb90d2a..ba62a9e 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -16,10 +16,10 @@ static const char *TAG = "smart-oil-heater-control-system-inputs"; const uint8_t uBurnerFaultPin = 19U; const uint8_t uDS18B20Pin = 4U; -const onewire_addr_t uChamperTempSensorAddr = 0x3e0000001754be28; -const onewire_addr_t uOutdoorTempSensorAddr = 0x880000001648e328; -const onewire_addr_t uInletFlowTempSensorAddr = 0xe59cdef51e64ff28; -const onewire_addr_t uReturnFlowTempSensorAddr = 0xa7a8e1531f64ff28; +const onewire_addr_t uChamperTempSensorAddr = 0x78000000c6c2f728; +const onewire_addr_t uOutdoorTempSensorAddr = 0x78000000c6c2f728; +const onewire_addr_t uInletFlowTempSensorAddr = 0x78000000c6c2f728; +const onewire_addr_t uReturnFlowTempSensorAddr = 0x78000000c6c2f728; onewire_addr_t uOneWireAddresses[MAX_DN18B20_SENSORS]; float fDS18B20Temps[MAX_DN18B20_SENSORS]; @@ -217,7 +217,7 @@ void taskInput(void *pvParameters) for (int j = 0; j < sSensorCount; j++) { float temp_c = fDS18B20Temps[j]; - // ESP_LOGI(TAG, "Sensor: %08" PRIx64 " reports %lf°C", (uint64_t)uOneWireAddresses[j], temp_c); + ESP_LOGI(TAG, "Sensor: %08" PRIx64 " reports %lf°C", (uint64_t)uOneWireAddresses[j], temp_c); switch ((uint64_t)uOneWireAddresses[j]) { @@ -226,20 +226,17 @@ void taskInput(void *pvParameters) sChamperTemperature.state = MEASUREMENT_NO_ERROR; updateAverage(&sChamperTemperature); updatePrediction(&sChamperTemperature); - break; - case ((uint64_t)uOutdoorTempSensorAddr): + sOutdoorTemperature.fCurrentValue = temp_c; sOutdoorTemperature.state = MEASUREMENT_NO_ERROR; updateAverage(&sOutdoorTemperature); updatePrediction(&sOutdoorTemperature); - break; - case ((uint64_t)uInletFlowTempSensorAddr): + sInletFlowTemperature.fCurrentValue = temp_c; sInletFlowTemperature.state = MEASUREMENT_NO_ERROR; updateAverage(&sInletFlowTemperature); updatePrediction(&sInletFlowTemperature); - break; - case ((uint64_t)uReturnFlowTempSensorAddr): + sReturnFlowTemperature.fCurrentValue = temp_c; sReturnFlowTemperature.state = MEASUREMENT_NO_ERROR; updateAverage(&sReturnFlowTemperature); -- 2.47.1 From 06c6612ef6f7ba31b18fc2b044c5606b22b2a68e198f37a44d9240baa0dd4e4b Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 26 Dec 2024 22:40:20 +0100 Subject: [PATCH 2/4] fix algo --- main/inputs.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/main/inputs.c b/main/inputs.c index ba62a9e..00951c1 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -36,7 +36,7 @@ void taskInput(void *pvParameters); void initMeasurement(sMeasurement *pMeasurement); void updateAverage(sMeasurement *pMeasurement); void updatePrediction(sMeasurement *pMeasurement); -float linearRegressionPredict(const float *samples, size_t count, float futureIndex); +float linearRegressionPredict(const float *samples, size_t count, size_t bufferIndex, float futureIndex); void initInputs(void) { @@ -162,6 +162,7 @@ void updatePrediction(sMeasurement *pMeasurement) predict60s->fValue = linearRegressionPredict( predict60s->samples, predict60s->bufferCount, + predict60s->bufferIndex, predict60s->bufferCount + 60.0f); } @@ -264,7 +265,7 @@ void taskInput(void *pvParameters) } } -float linearRegressionPredict(const float *samples, size_t count, float futureIndex) +float linearRegressionPredict(const float *samples, size_t count, size_t bufferIndex, float futureIndex) { if (count == 0) return 0.0f; // No prediction possible with no data @@ -273,8 +274,11 @@ float linearRegressionPredict(const float *samples, size_t count, float futureIn for (size_t i = 0; i < count; i++) { - float x = (float)i; // Time index - float y = samples[i]; // Sample value + // Calculate the circular buffer index for the current sample + size_t circularIndex = (bufferIndex + i + 1) % count; + + float x = (float)i; // Time index + float y = samples[circularIndex]; // Sample value sumX += x; sumY += y; @@ -284,8 +288,8 @@ float linearRegressionPredict(const float *samples, size_t count, float futureIn // Calculate slope (m) and intercept (b) of the line: y = mx + b float denominator = (count * sumX2 - sumX * sumX); - if (fabs(denominator) < 1e-6) // Avoid division by zero - return samples[count - 1]; // Return last value as prediction + if (fabs(denominator) < 1e-6) // Avoid division by zero + return samples[bufferIndex]; // Return the latest value as prediction float m = (count * sumXY - sumX * sumY) / denominator; float b = (sumY - m * sumX) / count; -- 2.47.1 From 59b8c3e2b2a06f6251915bc4f1df8b33a162465432ac3aad9f2b684f5ec12e11 Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 26 Dec 2024 22:46:30 +0100 Subject: [PATCH 3/4] revert lab setup --- main/inputs.c | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/main/inputs.c b/main/inputs.c index 00951c1..14ff97a 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -16,10 +16,10 @@ static const char *TAG = "smart-oil-heater-control-system-inputs"; const uint8_t uBurnerFaultPin = 19U; const uint8_t uDS18B20Pin = 4U; -const onewire_addr_t uChamperTempSensorAddr = 0x78000000c6c2f728; -const onewire_addr_t uOutdoorTempSensorAddr = 0x78000000c6c2f728; -const onewire_addr_t uInletFlowTempSensorAddr = 0x78000000c6c2f728; -const onewire_addr_t uReturnFlowTempSensorAddr = 0x78000000c6c2f728; +const onewire_addr_t uChamperTempSensorAddr = 0x3e0000001754be28; +const onewire_addr_t uOutdoorTempSensorAddr = 0x880000001648e328; +const onewire_addr_t uInletFlowTempSensorAddr = 0xe59cdef51e64ff28; +const onewire_addr_t uReturnFlowTempSensorAddr = 0xa7a8e1531f64ff28; onewire_addr_t uOneWireAddresses[MAX_DN18B20_SENSORS]; float fDS18B20Temps[MAX_DN18B20_SENSORS]; @@ -227,17 +227,20 @@ void taskInput(void *pvParameters) sChamperTemperature.state = MEASUREMENT_NO_ERROR; updateAverage(&sChamperTemperature); updatePrediction(&sChamperTemperature); - + break; + case ((uint64_t)uOutdoorTempSensorAddr): sOutdoorTemperature.fCurrentValue = temp_c; sOutdoorTemperature.state = MEASUREMENT_NO_ERROR; updateAverage(&sOutdoorTemperature); updatePrediction(&sOutdoorTemperature); - + break; + case ((uint64_t)uInletFlowTempSensorAddr): sInletFlowTemperature.fCurrentValue = temp_c; sInletFlowTemperature.state = MEASUREMENT_NO_ERROR; updateAverage(&sInletFlowTemperature); updatePrediction(&sInletFlowTemperature); - + break; + case ((uint64_t)uReturnFlowTempSensorAddr): sReturnFlowTemperature.fCurrentValue = temp_c; sReturnFlowTemperature.state = MEASUREMENT_NO_ERROR; updateAverage(&sReturnFlowTemperature); -- 2.47.1 From 8a8bcd078ba6507cad09b31d853999fe9ba029c5ebdd990226a7b3ae35be27f5 Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 26 Dec 2024 22:47:12 +0100 Subject: [PATCH 4/4] disable log --- main/inputs.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/main/inputs.c b/main/inputs.c index 14ff97a..d9eb47f 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -218,7 +218,7 @@ void taskInput(void *pvParameters) for (int j = 0; j < sSensorCount; j++) { float temp_c = fDS18B20Temps[j]; - ESP_LOGI(TAG, "Sensor: %08" PRIx64 " reports %lf°C", (uint64_t)uOneWireAddresses[j], temp_c); + // ESP_LOGI(TAG, "Sensor: %08" PRIx64 " reports %lf°C", (uint64_t)uOneWireAddresses[j], temp_c); switch ((uint64_t)uOneWireAddresses[j]) { -- 2.47.1