add grade period for temp sensors

This commit is contained in:
Hendrik Schutter 2024-12-13 17:25:58 +01:00
parent 6e6d2965f7
commit a7f6973efd
3 changed files with 24 additions and 17 deletions

View File

@ -179,7 +179,7 @@ void taskInput(void *pvParameters)
for (int j = 0; j < sSensorCount; j++) for (int j = 0; j < sSensorCount; j++)
{ {
float temp_c = fDS18B20Temps[j]; float temp_c = fDS18B20Temps[j];
ESP_LOGI(TAG, "Sensor: %08" PRIx64 " reports %.3f°C", (uint64_t)uOneWireAddresses[j], temp_c); ESP_LOGI(TAG, "Sensor: %08" PRIx64 " reports %lf°C", (uint64_t)uOneWireAddresses[j], temp_c);
if (xSemaphoreTake(xMutexAccessInputs, portMAX_DELAY) == pdTRUE) if (xSemaphoreTake(xMutexAccessInputs, portMAX_DELAY) == pdTRUE)
{ {
switch ((uint64_t)uOneWireAddresses[j]) switch ((uint64_t)uOneWireAddresses[j])

View File

@ -3,15 +3,16 @@
#include "esp_log.h" #include "esp_log.h"
#include "safety.h" #include "safety.h"
#define PERIODIC_INTERVAL 1U // run safety checks every 1sec #define PERIODIC_INTERVAL 1U // run safety checks every 1sec
#define SENSOR_GRACE_PERIOD (60U * 30U) // period that a sensor can report the same reading in seconds
static const char *TAG = "smart-oil-heater-control-system-safety"; static const char *TAG = "smart-oil-heater-control-system-safety";
static SemaphoreHandle_t xMutexAccessSafety = NULL; static SemaphoreHandle_t xMutexAccessSafety = NULL;
sSensorSanityCheck sanityChecks[NUMBER_OF_SENSOR_SANITY_CHECKS] = { sSensorSanityCheck sanityChecks[NUMBER_OF_SENSOR_SANITY_CHECKS] = {
{0, "chamber_temperature", {95.0f, -10.0f}, 0.0f, getChamberTemperature}, {0U, "chamber_temperature", {95.0f, -10.0f}, 0.0f, 0U, getChamberTemperature},
{0, "outdoor_temperature", {45.0f, -20.0f}, 0.0f, getOutdoorTemperature}, {0U, "outdoor_temperature", {45.0f, -20.0f}, 0.0f, 0U, getOutdoorTemperature},
{0, "inlet_flow_temperature", {95.0f, -10.0f}, 0.0f, getInletFlowTemperature}, {0U, "inlet_flow_temperature", {95.0f, -10.0f}, 0.0f, 0U, getInletFlowTemperature},
{0, "return_flow_temperature", {95.0f, -10.0f}, 0.0f, getReturnFlowTemperature}}; {0U, "return_flow_temperature", {95.0f, -10.0f}, 0.0f, 0U, getReturnFlowTemperature}};
void taskSafety(void *pvParameters); void taskSafety(void *pvParameters);
void checkSensorSanity(void); void checkSensorSanity(void);
@ -60,16 +61,20 @@ void checkSensorSanity(void)
for (int i = 0; i < NUMBER_OF_SENSOR_SANITY_CHECKS; i++) for (int i = 0; i < NUMBER_OF_SENSOR_SANITY_CHECKS; i++)
{ {
//printf("Check sanity of sensor %s:\n", sanityChecks[i].name); // printf("Check sanity of sensor %s:\n", sanityChecks[i].name);
//printf(" Status: %u\n", sanityChecks[i].status); // printf(" Status: %u\n", sanityChecks[i].status);
//printf(" Sensor Limits: Max = %.2f, Min = %.2f\n", sanityChecks[i].sSensorLimit.max, sanityChecks[i].sSensorLimit.min); // printf(" Sensor Limits: Max = %.2f, Min = %.2f\n", sanityChecks[i].sSensorLimit.max, sanityChecks[i].sSensorLimit.min);
//printf(" Last Sensor Temperature: %.2f\n", sanityChecks[i].fSensorTemperatureLast); // printf(" Last Sensor Temperature: %.2f\n", sanityChecks[i].fSensorTemperatureLast);
const float fSensorTemperatureCurrent = sanityChecks[i].getSensor(CURRENT); const float fSensorTemperatureCurrent = sanityChecks[i].getSensor(CURRENT);
if (fSensorTemperatureCurrent == sanityChecks[i].fSensorTemperatureLast) if (fSensorTemperatureCurrent == sanityChecks[i].fSensorTemperatureLast)
{ {
ESP_LOGE(TAG, "%s Sensor reported unchanged value! %lf == %lf",sanityChecks[i].name, fSensorTemperatureCurrent, sanityChecks[i].fSensorTemperatureLast); sanityChecks[i].uUnchangedCounter++;
sanityChecks[i].status = 1; if (sanityChecks[i].uUnchangedCounter >= (SENSOR_GRACE_PERIOD / PERIODIC_INTERVAL))
{
ESP_LOGE(TAG, "%s Sensor reported unchanged value! %lf == %lf", sanityChecks[i].name, fSensorTemperatureCurrent, sanityChecks[i].fSensorTemperatureLast);
sanityChecks[i].status = 1U;
}
} }
else else
{ {
@ -78,19 +83,20 @@ void checkSensorSanity(void)
if (fSensorTemperatureCurrent > sanityChecks[i].sSensorLimit.max) if (fSensorTemperatureCurrent > sanityChecks[i].sSensorLimit.max)
{ {
ESP_LOGE(TAG, "%s Sensor reported too high value! %lf > %lf", sanityChecks[i].name, fSensorTemperatureCurrent, sanityChecks[i].sSensorLimit.max); ESP_LOGE(TAG, "%s Sensor reported too high value! %lf > %lf", sanityChecks[i].name, fSensorTemperatureCurrent, sanityChecks[i].sSensorLimit.max);
sanityChecks[i].status = 1; sanityChecks[i].status = 1U;
} }
else if (fSensorTemperatureCurrent < sanityChecks[i].sSensorLimit.min) else if (fSensorTemperatureCurrent < sanityChecks[i].sSensorLimit.min)
{ {
ESP_LOGE(TAG, "%s Sensor reported too low value! %lf < %lf", sanityChecks[i].name, fSensorTemperatureCurrent, sanityChecks[i].sSensorLimit.min); ESP_LOGE(TAG, "%s Sensor reported too low value! %lf < %lf", sanityChecks[i].name, fSensorTemperatureCurrent, sanityChecks[i].sSensorLimit.min);
sanityChecks[i].status = 1; sanityChecks[i].status = 1U;
} }
else else
{ {
sanityChecks[i].status = 0; sanityChecks[i].uUnchangedCounter = 0U;
sanityChecks[i].status = 0U;
} }
} }
//printf(" Status: %u\n", sanityChecks[i].status); // printf(" Status: %u\n", sanityChecks[i].status);
} }
} }

View File

@ -14,10 +14,11 @@ typedef struct _TemperatureSensorLimit
} sTemperatureSensorLimit; } sTemperatureSensorLimit;
typedef struct _SensorSanityCheck typedef struct _SensorSanityCheck
{ {
unsigned int status; uint8_t status;
char name[MAX_ERROR_STRING_SIZE]; char name[MAX_ERROR_STRING_SIZE];
sTemperatureSensorLimit sSensorLimit; sTemperatureSensorLimit sSensorLimit;
float fSensorTemperatureLast; float fSensorTemperatureLast;
uint32_t uUnchangedCounter;
GetSensorValue getSensor; GetSensorValue getSensor;
} sSensorSanityCheck; } sSensorSanityCheck;