diff --git a/main/Kconfig.projbuild b/main/Kconfig.projbuild index c855f47..5c0bcff 100644 --- a/main/Kconfig.projbuild +++ b/main/Kconfig.projbuild @@ -1,22 +1,391 @@ menu "Smart Oil Heating Control System" - config SSID - string "SSID" - default "my WiFi SSID" - config WIFI_PASSWORD - string "WIFI_PASSWORD" - default "my WIFI Password" - config STATIC_IP_ADDR - string "Static IPv4 address" - default "192.168.0.42" - config STATIC_IP_NETMASK - string "Static IPv4 netmask" - default "255.255.0.0" - config STATIC_GATEWAY_IP_ADDR - string "Static IPv4 gateway address" - default "192.168.0.1" - config SNTP_SERVER_IP_ADDR - string "SNTP IPv4 server address" - default "192.168.0.1" + menu "WiFi Configuration" + config SSID + string "WiFi SSID" + default "my WiFi SSID" + help + The SSID of the WiFi network to connect to. + + config WIFI_PASSWORD + string "WiFi Password" + default "my WIFI Password" + help + The password for the WiFi network. + + config STATIC_IP_ADDR + string "Static IPv4 address" + default "192.168.0.42" + help + Static IP address for the ESP32. + + config STATIC_IP_NETMASK + string "Static IPv4 netmask" + default "255.255.0.0" + help + Network mask for the static IP configuration. + + config STATIC_GATEWAY_IP_ADDR + string "Static IPv4 gateway address" + default "192.168.0.1" + help + Gateway IP address for network routing. + + config SNTP_SERVER_IP_ADDR + string "SNTP server address" + default "192.168.0.1" + help + NTP server address for time synchronization. + endmenu + + menu "GPIO Configuration" + menu "Input GPIOs" + config GPIO_BURNER_FAULT + int "Burner fault input GPIO" + range 0 39 + default 19 + help + GPIO pin connected to the burner fault signal. + + config GPIO_DS18B20_ONEWIRE + int "DS18B20 1-Wire bus GPIO" + range 0 39 + default 4 + help + GPIO pin for the 1-Wire bus (DS18B20 temperature sensors). + endmenu + + menu "Output GPIOs" + config GPIO_CIRCULATION_PUMP + int "Circulation pump output GPIO" + range 0 39 + default 27 + help + GPIO pin to control the circulation pump relay. + + config GPIO_BURNER + int "Burner control output GPIO" + range 0 39 + default 14 + help + GPIO pin to control the burner relay. + + config GPIO_SAFETY_CONTACT + int "Safety contact output GPIO" + range 0 39 + default 12 + help + GPIO pin for the safety contact relay (main power to burner). + endmenu + endmenu + + menu "1-Wire Sensor Addresses" + config ONEWIRE_ADDR_CHAMBER_TEMP + hex "Chamber temperature sensor address" + default 0xd00000108cd01d28 + help + 64-bit 1-Wire address of the chamber temperature sensor. + + config ONEWIRE_ADDR_OUTDOOR_TEMP + hex "Outdoor temperature sensor address" + default 0xd70000108a9b9128 + help + 64-bit 1-Wire address of the outdoor temperature sensor. + + config ONEWIRE_ADDR_INLET_FLOW_TEMP + hex "Inlet flow temperature sensor address" + default 0x410000108b8c0628 + help + 64-bit 1-Wire address of the inlet flow temperature sensor. + + config ONEWIRE_ADDR_RETURN_FLOW_TEMP + hex "Return flow temperature sensor address" + default 0x90000108cc77c28 + help + 64-bit 1-Wire address of the return flow temperature sensor. + endmenu + + menu "Temperature Control Settings" + menu "Target Temperatures" + config TEMP_RETURN_FLOW_LOWER_LIMIT_DAY + int "Return flow lower limit (day) [°C x 10]" + range 150 500 + default 300 + help + Minimum return flow temperature during day mode in 0.1°C units. + Example: 300 = 30.0°C + + config TEMP_RETURN_FLOW_LOWER_LIMIT_NIGHT + int "Return flow lower limit (night) [°C x 10]" + range 150 500 + default 250 + help + Minimum return flow temperature during night mode in 0.1°C units. + Example: 250 = 25.0°C + + config TEMP_CHAMBER_TARGET + int "Chamber target temperature [°C x 10]" + range 500 950 + default 800 + help + Maximum chamber temperature target in 0.1°C units. + Example: 800 = 80.0°C + + config TEMP_CHAMBER_THRESHOLD + int "Chamber temperature threshold [°C x 10]" + range 300 700 + default 450 + help + Minimum chamber temperature to enable burner in 0.1°C units. + Example: 450 = 45.0°C + + config TEMP_CIRCULATION_PUMP_THRESHOLD + int "Circulation pump threshold [°C x 10]" + range 200 500 + default 300 + help + Minimum chamber temperature to enable circulation pump in 0.1°C units. + Example: 300 = 30.0°C + endmenu + + menu "Summer Mode Settings" + config TEMP_SUMMER_MODE_HIGH + int "Summer mode activation threshold [°C x 10]" + range 150 300 + default 200 + help + Outdoor temperature above which summer mode activates in 0.1°C units. + Example: 200 = 20.0°C + + config TEMP_SUMMER_MODE_LOW + int "Summer mode deactivation threshold [°C x 10]" + range 100 250 + default 150 + help + Outdoor temperature below which summer mode deactivates in 0.1°C units. + Example: 150 = 15.0°C + endmenu + + config BURNER_FAULT_DETECTION_SECONDS + int "Burner fault detection timeout (seconds)" + range 60 600 + default 240 + help + Time in seconds to wait before checking for burner fault after enabling. + endmenu + + menu "Sensor Limits" + menu "Chamber Temperature Limits" + config SENSOR_LIMIT_CHAMBER_MAX + int "Chamber sensor maximum [°C x 10]" + range 500 1200 + default 950 + help + Maximum valid chamber temperature reading in 0.1°C units. + + config SENSOR_LIMIT_CHAMBER_MIN + int "Chamber sensor minimum [°C x 10]" + range -400 100 + default -100 + help + Minimum valid chamber temperature reading in 0.1°C units. + endmenu + + menu "Outdoor Temperature Limits" + config SENSOR_LIMIT_OUTDOOR_MAX + int "Outdoor sensor maximum [°C x 10]" + range 300 600 + default 450 + help + Maximum valid outdoor temperature reading in 0.1°C units. + + config SENSOR_LIMIT_OUTDOOR_MIN + int "Outdoor sensor minimum [°C x 10]" + range -500 0 + default -200 + help + Minimum valid outdoor temperature reading in 0.1°C units. + endmenu + + menu "Inlet Flow Temperature Limits" + config SENSOR_LIMIT_INLET_MAX + int "Inlet flow sensor maximum [°C x 10]" + range 500 1200 + default 950 + help + Maximum valid inlet flow temperature reading in 0.1°C units. + + config SENSOR_LIMIT_INLET_MIN + int "Inlet flow sensor minimum [°C x 10]" + range -400 100 + default -100 + help + Minimum valid inlet flow temperature reading in 0.1°C units. + endmenu + + menu "Return Flow Temperature Limits" + config SENSOR_LIMIT_RETURN_MAX + int "Return flow sensor maximum [°C x 10]" + range 500 1200 + default 950 + help + Maximum valid return flow temperature reading in 0.1°C units. + + config SENSOR_LIMIT_RETURN_MIN + int "Return flow sensor minimum [°C x 10]" + range -400 100 + default -100 + help + Minimum valid return flow temperature reading in 0.1°C units. + endmenu + + config SENSOR_GRACE_PERIOD_MINUTES + int "Sensor unchanged grace period (minutes)" + range 1 120 + default 30 + help + Maximum time in minutes a sensor can report unchanged values + before being flagged as faulty. + endmenu + + menu "Damping Factors" + config DAMPING_FACTOR_WARMER + int "Damping factor warmer [x 0.00001]" + range 1 100 + default 1 + help + Damping factor for rising temperatures in units of 0.00001. + Example: 1 = 0.00001 (0.001%) + + config DAMPING_FACTOR_COLDER + int "Damping factor colder [x 0.00001]" + range 1 100 + default 5 + help + Damping factor for falling temperatures in units of 0.00001. + Example: 5 = 0.00005 (0.005%) + endmenu + + menu "Heating Schedule" + menu "Weekday Schedule (Monday-Thursday)" + config SCHEDULE_WEEKDAY_DAY_START_HOUR + int "Day mode start hour" + range 0 23 + default 4 + help + Hour when day mode starts on weekdays (24h format). + + config SCHEDULE_WEEKDAY_DAY_START_MINUTE + int "Day mode start minute" + range 0 59 + default 45 + help + Minute when day mode starts on weekdays. + + config SCHEDULE_WEEKDAY_NIGHT_START_HOUR + int "Night mode start hour" + range 0 23 + default 22 + help + Hour when night mode starts on weekdays (24h format). + + config SCHEDULE_WEEKDAY_NIGHT_START_MINUTE + int "Night mode start minute" + range 0 59 + default 0 + help + Minute when night mode starts on weekdays. + endmenu + + menu "Friday Schedule" + config SCHEDULE_FRIDAY_DAY_START_HOUR + int "Day mode start hour" + range 0 23 + default 4 + help + Hour when day mode starts on Friday (24h format). + + config SCHEDULE_FRIDAY_DAY_START_MINUTE + int "Day mode start minute" + range 0 59 + default 45 + help + Minute when day mode starts on Friday. + + config SCHEDULE_FRIDAY_NIGHT_START_HOUR + int "Night mode start hour" + range 0 23 + default 23 + help + Hour when night mode starts on Friday (24h format). + + config SCHEDULE_FRIDAY_NIGHT_START_MINUTE + int "Night mode start minute" + range 0 59 + default 0 + help + Minute when night mode starts on Friday. + endmenu + + menu "Saturday Schedule" + config SCHEDULE_SATURDAY_DAY_START_HOUR + int "Day mode start hour" + range 0 23 + default 6 + help + Hour when day mode starts on Saturday (24h format). + + config SCHEDULE_SATURDAY_DAY_START_MINUTE + int "Day mode start minute" + range 0 59 + default 45 + help + Minute when day mode starts on Saturday. + + config SCHEDULE_SATURDAY_NIGHT_START_HOUR + int "Night mode start hour" + range 0 23 + default 23 + help + Hour when night mode starts on Saturday (24h format). + + config SCHEDULE_SATURDAY_NIGHT_START_MINUTE + int "Night mode start minute" + range 0 59 + default 30 + help + Minute when night mode starts on Saturday. + endmenu + + menu "Sunday Schedule" + config SCHEDULE_SUNDAY_DAY_START_HOUR + int "Day mode start hour" + range 0 23 + default 6 + help + Hour when day mode starts on Sunday (24h format). + + config SCHEDULE_SUNDAY_DAY_START_MINUTE + int "Day mode start minute" + range 0 59 + default 45 + help + Minute when day mode starts on Sunday. + + config SCHEDULE_SUNDAY_NIGHT_START_HOUR + int "Night mode start hour" + range 0 23 + default 22 + help + Hour when night mode starts on Sunday (24h format). + + config SCHEDULE_SUNDAY_NIGHT_START_MINUTE + int "Night mode start minute" + range 0 59 + default 30 + help + Minute when night mode starts on Sunday. + endmenu + endmenu endmenu diff --git a/main/control.c b/main/control.c index 8b31b0e..8061cc8 100644 --- a/main/control.c +++ b/main/control.c @@ -1,28 +1,15 @@ #include "control.h" -#include "esp_log.h" -#include "esp_timer.h" -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" #include "inputs.h" #include "outputs.h" #include "safety.h" #include "sntp.h" -#define PERIODIC_INTERVAL 1U // Run control loop every 1 second +#include "esp_log.h" +#include "esp_timer.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" -// Temperature thresholds -#define RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY 30.0f -#define RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT 25.0f -#define CHAMBER_TEMPERATURE_TARGET 80.0f // Max cutoff temperature -#define CHAMBER_TEMPERATURE_THRESHOLD 45.0f // Min threshold for burner enable -#define SUMMER_MODE_TEMPERATURE_THRESHOLD_HIGH \ - 20.0f // Summer mode will be activated -#define SUMMER_MODE_TEMPERATURE_THRESHOLD_LOW \ - 15.0f // Summer mode will be deactivated --> Heating starts -#define CIRCULATION_PUMP_TEMPERATURE_THRESHOLD \ - 30.0f // Min threshold of chamber for circulation pump enable -#define BURNER_FAULT_DETECTION_THRESHOLD \ - (60U * 4U) // Burner fault detection after 4 minutes +#define PERIODIC_INTERVAL 1U // Run control loop every 1 second static const char *TAG = "smart-oil-heater-control-system-control"; static eControlState gControlState = CONTROL_STARTING; @@ -30,58 +17,58 @@ static eControlState gControlState = CONTROL_STARTING; static const sControlDay gControlTable[] = { {MONDAY, 2U, - {{{4, 45}, + {{{CONFIG_SCHEDULE_WEEKDAY_DAY_START_HOUR, CONFIG_SCHEDULE_WEEKDAY_DAY_START_MINUTE}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY, CHAMBER_TEMPERATURE_TARGET}, - {{22, 0}, + {{CONFIG_SCHEDULE_WEEKDAY_NIGHT_START_HOUR, CONFIG_SCHEDULE_WEEKDAY_NIGHT_START_MINUTE}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT, CHAMBER_TEMPERATURE_TARGET}}}, {TUESDAY, 2U, - {{{4, 45}, + {{{CONFIG_SCHEDULE_WEEKDAY_DAY_START_HOUR, CONFIG_SCHEDULE_WEEKDAY_DAY_START_MINUTE}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY, CHAMBER_TEMPERATURE_TARGET}, - {{22, 0}, + {{CONFIG_SCHEDULE_WEEKDAY_NIGHT_START_HOUR, CONFIG_SCHEDULE_WEEKDAY_NIGHT_START_MINUTE}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT, CHAMBER_TEMPERATURE_TARGET}}}, {WEDNESDAY, 2U, - {{{4, 45}, + {{{CONFIG_SCHEDULE_WEEKDAY_DAY_START_HOUR, CONFIG_SCHEDULE_WEEKDAY_DAY_START_MINUTE}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY, CHAMBER_TEMPERATURE_TARGET}, - {{22, 0}, + {{CONFIG_SCHEDULE_WEEKDAY_NIGHT_START_HOUR, CONFIG_SCHEDULE_WEEKDAY_NIGHT_START_MINUTE}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT, CHAMBER_TEMPERATURE_TARGET}}}, {THURSDAY, 2U, - {{{4, 45}, + {{{CONFIG_SCHEDULE_WEEKDAY_DAY_START_HOUR, CONFIG_SCHEDULE_WEEKDAY_DAY_START_MINUTE}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY, CHAMBER_TEMPERATURE_TARGET}, - {{22, 0}, + {{CONFIG_SCHEDULE_WEEKDAY_NIGHT_START_HOUR, CONFIG_SCHEDULE_WEEKDAY_NIGHT_START_MINUTE}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT, CHAMBER_TEMPERATURE_TARGET}}}, {FRIDAY, 2U, - {{{4, 45}, + {{{CONFIG_SCHEDULE_FRIDAY_DAY_START_HOUR, CONFIG_SCHEDULE_FRIDAY_DAY_START_MINUTE}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY, CHAMBER_TEMPERATURE_TARGET}, - {{23, 0}, + {{CONFIG_SCHEDULE_FRIDAY_NIGHT_START_HOUR, CONFIG_SCHEDULE_FRIDAY_NIGHT_START_MINUTE}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT, CHAMBER_TEMPERATURE_TARGET}}}, {SATURDAY, 2U, - {{{6, 45}, + {{{CONFIG_SCHEDULE_SATURDAY_DAY_START_HOUR, CONFIG_SCHEDULE_SATURDAY_DAY_START_MINUTE}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY, CHAMBER_TEMPERATURE_TARGET}, - {{23, 30}, + {{CONFIG_SCHEDULE_SATURDAY_NIGHT_START_HOUR, CONFIG_SCHEDULE_SATURDAY_NIGHT_START_MINUTE}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT, CHAMBER_TEMPERATURE_TARGET}}}, {SUNDAY, 2U, - {{{6, 45}, + {{{CONFIG_SCHEDULE_SUNDAY_DAY_START_HOUR, CONFIG_SCHEDULE_SUNDAY_DAY_START_MINUTE}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY, CHAMBER_TEMPERATURE_TARGET}, - {{22, 30}, + {{CONFIG_SCHEDULE_SUNDAY_NIGHT_START_HOUR, CONFIG_SCHEDULE_SUNDAY_NIGHT_START_MINUTE}, RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT, CHAMBER_TEMPERATURE_TARGET}}}, }; @@ -377,10 +364,10 @@ void findControlCurrentTemperatureEntry(void) /* ESP_LOGI(TAG, "Active entry found - Time: %02d:%02d, " "Return Temp: %lf, Chamber Temp: %lf", - gCurrentControlEntry.timestamp.hour, - gCurrentControlEntry.timestamp.minute, - gCurrentControlEntry.fReturnFlowTemperature, - gCurrentControlEntry.fChamberTemperature); + gCurrentControlEntry.timestamp.hour, + gCurrentControlEntry.timestamp.minute, + gCurrentControlEntry.fReturnFlowTemperature, + gCurrentControlEntry.fChamberTemperature); */ return; } diff --git a/main/control.h b/main/control.h index 7690bd1..0096038 100644 --- a/main/control.h +++ b/main/control.h @@ -1,8 +1,20 @@ #pragma once + +#include "sdkconfig.h" + #include #define MAX_TEMPERATURE_ENTRIES_PER_DAY 24U +#define RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_DAY (CONFIG_TEMP_RETURN_FLOW_LOWER_LIMIT_DAY / 10.0f) +#define RETURN_FLOW_TEMPERATURE_LOWER_LIMIT_NIGHT (CONFIG_TEMP_RETURN_FLOW_LOWER_LIMIT_NIGHT / 10.0f) +#define CHAMBER_TEMPERATURE_TARGET (CONFIG_TEMP_CHAMBER_TARGET / 10.0f) +#define CHAMBER_TEMPERATURE_THRESHOLD (CONFIG_TEMP_CHAMBER_THRESHOLD / 10.0f) +#define SUMMER_MODE_TEMPERATURE_THRESHOLD_HIGH (CONFIG_TEMP_SUMMER_MODE_HIGH / 10.0f) +#define SUMMER_MODE_TEMPERATURE_THRESHOLD_LOW (CONFIG_TEMP_SUMMER_MODE_LOW / 10.0f) +#define CIRCULATION_PUMP_TEMPERATURE_THRESHOLD (CONFIG_TEMP_CIRCULATION_PUMP_THRESHOLD / 10.0f) +#define BURNER_FAULT_DETECTION_THRESHOLD CONFIG_BURNER_FAULT_DETECTION_SECONDS + typedef enum _ControlState { CONTROL_STARTING, diff --git a/main/inputs.c b/main/inputs.c index 8df4fb8..56c04b2 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -1,25 +1,26 @@ +#include "inputs.h" + #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" -#include -#include #include "esp_log.h" #include -#include "inputs.h" +#include +#include #define MAX_DN18B20_SENSORS 4U #define ONE_WIRE_LOOPS 4U // try to read the 1-Wire sensors that often #define PERIODIC_INTERVAL 1U // read and compute the inputs every 1sec static const char *TAG = "smart-oil-heater-control-system-inputs"; -const uint8_t uBurnerFaultPin = 19U; -const uint8_t uDS18B20Pin = 4U; +const uint8_t uBurnerFaultPin = CONFIG_GPIO_BURNER_FAULT; +const uint8_t uDS18B20Pin = CONFIG_GPIO_DS18B20_ONEWIRE; -const onewire_addr_t uChamperTempSensorAddr = 0xd00000108cd01d28; -const onewire_addr_t uOutdoorTempSensorAddr = 0xd70000108a9b9128; -const onewire_addr_t uInletFlowTempSensorAddr = 0x410000108b8c0628; -const onewire_addr_t uReturnFlowTempSensorAddr = 0x90000108cc77c28; +const onewire_addr_t uChamperTempSensorAddr = CONFIG_ONEWIRE_ADDR_CHAMBER_TEMP; +const onewire_addr_t uOutdoorTempSensorAddr = CONFIG_ONEWIRE_ADDR_OUTDOOR_TEMP; +const onewire_addr_t uInletFlowTempSensorAddr = CONFIG_ONEWIRE_ADDR_INLET_FLOW_TEMP; +const onewire_addr_t uReturnFlowTempSensorAddr = CONFIG_ONEWIRE_ADDR_RETURN_FLOW_TEMP; onewire_addr_t uOneWireAddresses[MAX_DN18B20_SENSORS]; float fDS18B20Temps[MAX_DN18B20_SENSORS]; @@ -416,4 +417,4 @@ eBurnerErrorState getBurnerError(void) ESP_LOGE(TAG, "Unable to take mutex: getBurnerError()"); } return ret; -} \ No newline at end of file +} diff --git a/main/inputs.h b/main/inputs.h index 17e095b..be68658 100644 --- a/main/inputs.h +++ b/main/inputs.h @@ -1,13 +1,17 @@ #pragma once +#include "sdkconfig.h" + +#include + #define MAX(a, b) ((a) > (b) ? (a) : (b)) #define INITIALISATION_VALUE 0.0f #define AVG10S_SAMPLE_SIZE 10U #define AVG60S_SAMPLE_SIZE 60U #define AVG24H_SAMPLE_SIZE 24U #define PRED60S_SAMPLE_SIZE 60U -#define DAMPING_FACTOR_WARMER 0.00001f // 0.001% -#define DAMPING_FACTOR_COLDER 0.00005f // 0.005% +#define DAMPING_FACTOR_WARMER (CONFIG_DAMPING_FACTOR_WARMER * 0.00001f) +#define DAMPING_FACTOR_COLDER (CONFIG_DAMPING_FACTOR_COLDER * 0.00001f) typedef enum _BurnerErrorState { @@ -52,4 +56,4 @@ sMeasurement getChamberTemperature(void); sMeasurement getOutdoorTemperature(void); sMeasurement getInletFlowTemperature(void); sMeasurement getReturnFlowTemperature(void); -eBurnerErrorState getBurnerError(void); \ No newline at end of file +eBurnerErrorState getBurnerError(void); diff --git a/main/main.c b/main/main.c index 82c2d63..622cd51 100644 --- a/main/main.c +++ b/main/main.c @@ -1,7 +1,3 @@ -#include "esp_log.h" -#include -#include "nvs_flash.h" - #include "safety.h" #include "metrics.h" #include "outputs.h" @@ -10,6 +6,10 @@ #include "wifi.h" #include "sntp.h" +#include "esp_log.h" +#include "esp_system.h" +#include "nvs_flash.h" + static const char *TAG = "smart-oil-heater-control-system"; void app_main(void) @@ -39,4 +39,4 @@ void app_main(void) vTaskDelay(pdMS_TO_TICKS(1000)); // Do nothing ;-) } -} \ No newline at end of file +} diff --git a/main/metrics.c b/main/metrics.c index 5c10247..ba3c436 100644 --- a/main/metrics.c +++ b/main/metrics.c @@ -1,12 +1,3 @@ -#include -#include "esp_timer.h" -#include "freertos/FreeRTOS.h" -#include "freertos/task.h" -#include "esp_wifi.h" -#include "esp_log.h" -#include -#include - #include "metrics.h" #include "outputs.h" #include "inputs.h" @@ -14,6 +5,16 @@ #include "sntp.h" #include "control.h" +#include "esp_timer.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "esp_wifi.h" +#include "esp_log.h" + +#include +#include +#include + static const char *TAG = "smart-oil-heater-control-system-metrics"; char caHtmlResponse[HTML_RESPONSE_SIZE]; diff --git a/main/outputs.c b/main/outputs.c index 9861b60..63dd0e6 100644 --- a/main/outputs.c +++ b/main/outputs.c @@ -1,14 +1,15 @@ +#include "outputs.h" + +#include "sdkconfig.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "driver/gpio.h" #include "esp_log.h" -#include "outputs.h" - static const char *TAG = "smart-oil-heater-control-system-outputs"; -const uint8_t uCirculationPumpGpioPin = 27U; -const uint8_t uBurnerGpioPin = 14U; -const uint8_t uSafetyContactGpioPin = 12U; +const uint8_t uCirculationPumpGpioPin = CONFIG_GPIO_CIRCULATION_PUMP; +const uint8_t uBurnerGpioPin = CONFIG_GPIO_BURNER; +const uint8_t uSafetyContactGpioPin = CONFIG_GPIO_SAFETY_CONTACT; static SemaphoreHandle_t xMutexAccessOutputs = NULL; static eOutput sCirculationPumpState; diff --git a/main/safety.c b/main/safety.c index f592a86..7fb6ae4 100644 --- a/main/safety.c +++ b/main/safety.c @@ -1,21 +1,22 @@ +#include "safety.h" + #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "esp_log.h" + #include #include -#include "safety.h" -#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 +#define PERIODIC_INTERVAL 1U // run safety checks every 1sec +#define SENSOR_GRACE_PERIOD (CONFIG_SENSOR_GRACE_PERIOD_MINUTES * 60U) // period that a sensor can report the same reading in seconds #define FLOAT_EPSILON 0.0001f - static const char *TAG = "smart-oil-heater-control-system-safety"; static SemaphoreHandle_t xMutexAccessSafety = NULL; static sSensorSanityCheck sanityChecks[NUMBER_OF_SENSOR_SANITY_CHECKS] = { - {SENSOR_NO_ERROR, "chamber_temperature", {95.0f, -10.0f}, 0.0f, 0U, getChamberTemperature}, - {SENSOR_NO_ERROR, "outdoor_temperature", {45.0f, -20.0f}, 0.0f, 0U, getOutdoorTemperature}, - {SENSOR_NO_ERROR, "inlet_flow_temperature", {95.0f, -10.0f}, 0.0f, 0U, getInletFlowTemperature}, - {SENSOR_NO_ERROR, "return_flow_temperature", {95.0f, -10.0f}, 0.0f, 0U, getReturnFlowTemperature}}; + {SENSOR_NO_ERROR, "chamber_temperature", {SENSOR_LIMIT_CHAMBER_MAX, SENSOR_LIMIT_CHAMBER_MIN}, 0.0f, 0U, getChamberTemperature}, + {SENSOR_NO_ERROR, "outdoor_temperature", {SENSOR_LIMIT_OUTDOOR_MAX, SENSOR_LIMIT_OUTDOOR_MIN}, 0.0f, 0U, getOutdoorTemperature}, + {SENSOR_NO_ERROR, "inlet_flow_temperature", {SENSOR_LIMIT_INLET_MAX, SENSOR_LIMIT_INLET_MIN}, 0.0f, 0U, getInletFlowTemperature}, + {SENSOR_NO_ERROR, "return_flow_temperature", {SENSOR_LIMIT_RETURN_MAX, SENSOR_LIMIT_RETURN_MIN}, 0.0f, 0U, getReturnFlowTemperature}}; static eSafetyState sSafetyState = SAFETY_NO_ERROR; void taskSafety(void *pvParameters); diff --git a/main/safety.h b/main/safety.h index 825e7cd..58e6974 100644 --- a/main/safety.h +++ b/main/safety.h @@ -3,9 +3,22 @@ #include "outputs.h" #include "inputs.h" +#include "sdkconfig.h" + +#include + #define MAX_ERROR_STRING_SIZE 64U #define NUMBER_OF_SENSOR_SANITY_CHECKS 4U +#define SENSOR_LIMIT_CHAMBER_MAX (CONFIG_SENSOR_LIMIT_CHAMBER_MAX / 10.0f) +#define SENSOR_LIMIT_CHAMBER_MIN (CONFIG_SENSOR_LIMIT_CHAMBER_MIN / 10.0f) +#define SENSOR_LIMIT_OUTDOOR_MAX (CONFIG_SENSOR_LIMIT_OUTDOOR_MAX / 10.0f) +#define SENSOR_LIMIT_OUTDOOR_MIN (CONFIG_SENSOR_LIMIT_OUTDOOR_MIN / 10.0f) +#define SENSOR_LIMIT_INLET_MAX (CONFIG_SENSOR_LIMIT_INLET_MAX / 10.0f) +#define SENSOR_LIMIT_INLET_MIN (CONFIG_SENSOR_LIMIT_INLET_MIN / 10.0f) +#define SENSOR_LIMIT_RETURN_MAX (CONFIG_SENSOR_LIMIT_RETURN_MAX / 10.0f) +#define SENSOR_LIMIT_RETURN_MIN (CONFIG_SENSOR_LIMIT_RETURN_MIN / 10.0f) + typedef enum _SensorErrorState { SENSOR_NO_ERROR, diff --git a/main/sntp.c b/main/sntp.c index fab2d6f..f00bdd6 100644 --- a/main/sntp.c +++ b/main/sntp.c @@ -1,9 +1,10 @@ -#include -#include -#include +#include "sntp.h" + +#include "esp_sntp.h" #include "esp_log.h" -#include "sntp.h" +#include +#include static const char *TAG = "smart-oil-heater-control-system-sntp"; static volatile eSntpState sntpState = SYNC_NOT_STARTED; diff --git a/main/wifi.c b/main/wifi.c index 2b628d9..bf764d4 100644 --- a/main/wifi.c +++ b/main/wifi.c @@ -1,15 +1,16 @@ -#include +#include "wifi.h" + #include "esp_timer.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" +#include "freertos/event_groups.h" #include "esp_wifi.h" #include "esp_event.h" -#include "freertos/event_groups.h" #include "esp_log.h" #include "esp_netif.h" #include -#include "wifi.h" +#include #define WIFI_CONNECTED_BIT BIT0 #define WIFI_FAIL_BIT BIT1