From dfb03926c9df549e7385a77987f2a551ac1d2f7835f088fb3d473a915ba0c4f1 Mon Sep 17 00:00:00 2001 From: localhorst Date: Thu, 19 Dec 2024 21:38:48 +0100 Subject: [PATCH] add safety contact output --- README.md | 16 +++++++++------- main/control.c | 1 + main/metrics.c | 28 ++++++++++++++++++++++------ main/outputs.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ main/outputs.h | 7 +++++-- main/safety.c | 1 + 6 files changed, 87 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index bdafc6b..f7e0475 100644 --- a/README.md +++ b/README.md @@ -33,6 +33,8 @@ Sntp <|-- Metrics +setCirculationPumpState() +getBurnerState() +setBurnerState() + +getSafetyControlState() + +setSafetyControlState() } class Control{ @@ -71,10 +73,10 @@ Sntp <|-- Metrics ### Hardware - -| Function| ESP32 | ES32C14 | -|-----------------------|-------|---------------------------| -| CirculationPump | IO27 | Relay 1 NO1 | -| Burner | IO14 | Relay 1 NC2 | -| Burner Fault | IO19 | Digital Input IN1 | -| Temperature DS10B20 | IO04 | 1-Wire | +| Function | ESP32 | PLC ES32C14 | +|---------------------------------------|-------|---------------------------| +| Output CirculationPump | IO27 | Relay 1 NO1 | +| Output Burner Fire Signal | IO14 | Relay 2 NC2 | +| Output Safety Contact (powers Burner) | IO12 | Relay 3 NC2 | +| Input Burner Fault | IO19 | Digital Input IN1 | +| Input Temperature DS10B20 | IO04 | 1-Wire | diff --git a/main/control.c b/main/control.c index 42f89f8..c10da7e 100644 --- a/main/control.c +++ b/main/control.c @@ -56,5 +56,6 @@ void taskControl(void *pvParameters) // TODO: control the burner based on timetable setCirculationPumpState(DISABLED); setBurnerState(ENABLED); + setSafetyControlState(ENABLED); } } \ No newline at end of file diff --git a/main/metrics.c b/main/metrics.c index e0c8719..0f24436 100644 --- a/main/metrics.c +++ b/main/metrics.c @@ -55,6 +55,12 @@ void taskMetrics(void *pvParameters) u16MetricCounter = 0U; + /*Burner Error State*/ + strcpy(aMetrics[u16MetricCounter].caMetricName, "burner_fault_pending"); + aMetrics[u16MetricCounter].type = INTEGER_U8; + aMetrics[u16MetricCounter].u8MetricValue = getBurnerError(); + u16MetricCounter++; + /*Circulation Pump State*/ if (getCirculationPumpState() == ENABLED) { @@ -71,12 +77,6 @@ void taskMetrics(void *pvParameters) u16MetricCounter++; } - /*Burner Error State*/ - strcpy(aMetrics[u16MetricCounter].caMetricName, "burner_fault_pending"); - aMetrics[u16MetricCounter].type = INTEGER_U8; - aMetrics[u16MetricCounter].u8MetricValue = getBurnerError(); - u16MetricCounter++; - /*Burner State*/ if (getBurnerState() == ENABLED) { @@ -93,6 +93,22 @@ void taskMetrics(void *pvParameters) u16MetricCounter++; } + /*Safety Contact State*/ + if (getSafetyControlState() == ENABLED) + { + strcpy(aMetrics[u16MetricCounter].caMetricName, "safety_contact_enabled"); + aMetrics[u16MetricCounter].type = INTEGER_U8; + aMetrics[u16MetricCounter].u8MetricValue = 1U; + u16MetricCounter++; + } + else + { + strcpy(aMetrics[u16MetricCounter].caMetricName, "safety_contact_enabled"); + aMetrics[u16MetricCounter].type = INTEGER_U8; + aMetrics[u16MetricCounter].u8MetricValue = 0U; + u16MetricCounter++; + } + /*Chamber Temperature*/ strcpy(aMetrics[u16MetricCounter].caMetricName, "chamber_temperature"); aMetrics[u16MetricCounter].type = FLOAT; diff --git a/main/outputs.c b/main/outputs.c index 5134110..3309ce2 100644 --- a/main/outputs.c +++ b/main/outputs.c @@ -8,10 +8,12 @@ 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; static SemaphoreHandle_t xMutexAccessOutputs = NULL; static eOutput sCirculationPumpState; static eOutput sBurnerState; +static eOutput sSafetyContactState; void initOutputs(void) { @@ -30,8 +32,18 @@ void initOutputs(void) .pull_down_en = GPIO_PULLDOWN_DISABLE, // Disable pull-down .intr_type = GPIO_INTR_DISABLE // Disable interrupts }; + + gpio_config_t ioConfSafetyContact = { + .pin_bit_mask = (1ULL << uSafetyContactGpioPin), // Pin mask + .mode = GPIO_MODE_OUTPUT, // Set as output + .pull_up_en = GPIO_PULLUP_DISABLE, // Disable pull-up + .pull_down_en = GPIO_PULLDOWN_DISABLE, // Disable pull-down + .intr_type = GPIO_INTR_DISABLE // Disable interrupts + }; + gpio_config(&ioConfCirculationPump); gpio_config(&ioConfBurner); + gpio_config(&ioConfSafetyContact); xMutexAccessOutputs = xSemaphoreCreateRecursiveMutex(); if (xMutexAccessOutputs == NULL) @@ -105,4 +117,41 @@ void setBurnerState(eOutput in) { ESP_LOGE(TAG, "Unable to take mutex: setBurnerState()"); } +} + +eOutput getSafetyControlState(void) +{ + eOutput ret = ENABLED; + if (xSemaphoreTakeRecursive(xMutexAccessOutputs, pdMS_TO_TICKS(5000)) == pdTRUE) + { + ret = sSafetyContactState; + xSemaphoreGiveRecursive(xMutexAccessOutputs); + } + else + { + ESP_LOGE(TAG, "Unable to take mutex: getSafetyControlState()"); + } + return ret; +} +void setSafetyControlState(eOutput in) +{ + if (xSemaphoreTakeRecursive(xMutexAccessOutputs, pdMS_TO_TICKS(5000)) == pdTRUE) + { + sSafetyContactState = in; + switch (sSafetyContactState) + { + case ENABLED: + gpio_set_level(uSafetyContactGpioPin, 0U); // Switch on power for Burner + break; + case DISABLED: + gpio_set_level(uSafetyContactGpioPin, 1U); // Switch off power for Burner + default: + break; + } + xSemaphoreGiveRecursive(xMutexAccessOutputs); + } + else + { + ESP_LOGE(TAG, "Unable to take mutex: setSafetyControlState()"); + } } \ No newline at end of file diff --git a/main/outputs.h b/main/outputs.h index 11fda13..12ddfe9 100644 --- a/main/outputs.h +++ b/main/outputs.h @@ -1,6 +1,7 @@ #pragma once -typedef enum _Output{ +typedef enum _Output +{ ENABLED, DISABLED } eOutput; @@ -9,4 +10,6 @@ void initOutputs(void); eOutput getCirculationPumpState(void); void setCirculationPumpState(eOutput in); eOutput getBurnerState(void); -void setBurnerState(eOutput in); \ No newline at end of file +void setBurnerState(eOutput in); +eOutput getSafetyControlState(void); +void setSafetyControlState(eOutput in); \ No newline at end of file diff --git a/main/safety.c b/main/safety.c index f3205c7..4513822 100644 --- a/main/safety.c +++ b/main/safety.c @@ -132,6 +132,7 @@ void setSafeState(void) { setCirculationPumpState(ENABLED); // To cool down system setBurnerState(DISABLED); // Deactivate burner + setSafetyControlState(DISABLED); // Disable power to Burner } void getSensorSanityStates(sSensorSanityCheck *pSensorSanityChecks)