chamber temp prediction metrics
This commit is contained in:
		| @ -1,6 +1,7 @@ | ||||
| #include "freertos/FreeRTOS.h" | ||||
| #include "freertos/task.h" | ||||
| #include "driver/gpio.h" | ||||
| #include <string.h> | ||||
| #include "esp_log.h" | ||||
| #include <ds18x20.h> | ||||
|  | ||||
| @ -31,6 +32,7 @@ static sMeasurement sInletFlowTemperature; | ||||
| static sMeasurement sReturnFlowTemperature; | ||||
|  | ||||
| void taskInput(void *pvParameters); | ||||
| void initMeasurement(sMeasurement *pMeasurement); | ||||
| void updateAverage(sMeasurement *pMeasurement); | ||||
| void updatePrediction(sMeasurement *pMeasurement); | ||||
|  | ||||
| @ -54,6 +56,11 @@ void initInputs(void) | ||||
|     } | ||||
|     xSemaphoreGiveRecursive(xMutexAccessInputs); | ||||
|  | ||||
|     initMeasurement(&sChamperTemperature); | ||||
|     initMeasurement(&sOutdoorTemperature); | ||||
|     initMeasurement(&sInletFlowTemperature); | ||||
|     initMeasurement(&sReturnFlowTemperature); | ||||
|  | ||||
|     BaseType_t taskCreated = xTaskCreate( | ||||
|         taskInput,   // Function to implement the task | ||||
|         "taskInput", // Task name | ||||
| @ -73,6 +80,32 @@ void initInputs(void) | ||||
|     } | ||||
| } | ||||
|  | ||||
| void initMeasurement(sMeasurement *pMeasurement) | ||||
| { | ||||
|     pMeasurement->state = MEASUREMENT_FAULT; | ||||
|     pMeasurement->fCurrentValue = 0.0f; | ||||
|  | ||||
|     pMeasurement->average10s.fValue = 0.0f; | ||||
|     pMeasurement->average10s.bufferCount = 0U; | ||||
|     pMeasurement->average10s.bufferIndex = 0U; | ||||
|     memset(pMeasurement->average10s.samples, 0U, AVG10_SAMPLE_SIZE); | ||||
|  | ||||
|     pMeasurement->average60s.fValue = 0.0f; | ||||
|     pMeasurement->average60s.bufferCount = 0U; | ||||
|     pMeasurement->average60s.bufferIndex = 0U; | ||||
|     memset(pMeasurement->average60s.samples, 0U, AVG60_SAMPLE_SIZE); | ||||
|  | ||||
|     pMeasurement->predict10s.fValue = 0.0f; | ||||
|     pMeasurement->predict10s.bufferCount = 0U; | ||||
|     pMeasurement->predict10s.bufferIndex = 0U; | ||||
|     memset(pMeasurement->predict10s.samples, 0U, PRED10_SAMPLE_SIZE); | ||||
|  | ||||
|     pMeasurement->predict60s.fValue = 0.0f; | ||||
|     pMeasurement->predict60s.bufferCount = 0U; | ||||
|     pMeasurement->predict60s.bufferIndex = 0U; | ||||
|     memset(pMeasurement->predict60s.samples, 0U, PRED60_SAMPLE_SIZE); | ||||
| } | ||||
|  | ||||
| void updateAverage(sMeasurement *pMeasurement) | ||||
| { /* Average form the last 10sec */ | ||||
|     pMeasurement->average10s.samples[pMeasurement->average10s.bufferIndex] = pMeasurement->fCurrentValue; | ||||
| @ -124,10 +157,25 @@ void updatePrediction(sMeasurement *pMeasurement) | ||||
|         pMeasurement->predict10s.bufferCount++; | ||||
|     } | ||||
|  | ||||
|     float delta = pMeasurement->predict10s.samples[(pMeasurement->predict10s.bufferIndex - 1) % PRED10_SAMPLE_SIZE] - pMeasurement->predict10s.samples[pMeasurement->predict10s.bufferIndex]; | ||||
|     if (delta != 0.0) | ||||
|     float delta10s = pMeasurement->predict10s.samples[(pMeasurement->predict10s.bufferIndex - 1) % PRED10_SAMPLE_SIZE] - pMeasurement->predict10s.samples[pMeasurement->predict10s.bufferIndex]; | ||||
|     if (delta10s != 0.0) | ||||
|     { | ||||
|         pMeasurement->predict10s.fValue = pMeasurement->fCurrentValue + (delta * pMeasurement->predict10s.bufferCount); | ||||
|         pMeasurement->predict10s.fValue = pMeasurement->fCurrentValue + (delta10s * pMeasurement->predict10s.bufferCount); | ||||
|     } | ||||
|  | ||||
|     /* Prediction of the value in 60sec */ | ||||
|     pMeasurement->predict60s.samples[pMeasurement->predict60s.bufferIndex] = pMeasurement->fCurrentValue; | ||||
|     pMeasurement->predict60s.bufferIndex = (pMeasurement->predict60s.bufferIndex + 1) % PRED60_SAMPLE_SIZE; | ||||
|  | ||||
|     if (pMeasurement->predict60s.bufferCount < PRED60_SAMPLE_SIZE) | ||||
|     { | ||||
|         pMeasurement->predict60s.bufferCount++; | ||||
|     } | ||||
|  | ||||
|     float delta60s = pMeasurement->predict60s.samples[(pMeasurement->predict60s.bufferIndex - 1) % PRED60_SAMPLE_SIZE] - pMeasurement->predict60s.samples[pMeasurement->predict60s.bufferIndex]; | ||||
|     if (delta60s != 0.0) | ||||
|     { | ||||
|         pMeasurement->predict60s.fValue = pMeasurement->fCurrentValue + (delta60s * pMeasurement->predict60s.bufferCount); | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
		Reference in New Issue
	
	Block a user