From 9ac3792c6c844adc654e2c33f52858cf83b78dbdfa8cae25e73bac3e6d6c68c2 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sat, 7 Dec 2024 17:57:55 +0100 Subject: [PATCH] implement Outputs --- .vscode/settings.json | 10 +++ README.md | 11 ++- main/http_metrics.c | 2 +- main/main.c | 176 ++++++++++++------------------------------ main/output.h | 0 main/outputs.c | 73 ++++++++++++++++++ main/outputs.h | 12 +++ 7 files changed, 157 insertions(+), 127 deletions(-) create mode 100644 .vscode/settings.json delete mode 100644 main/output.h create mode 100644 main/outputs.h diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..126f78a --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,10 @@ +{ + "idf.flashType": "UART", + "idf.port": "/dev/ttyUSB0", + "idf.adapterTargetName": "esp32", + "files.associations": { + "http_metrics.h": "c", + "outputs.h": "c", + "task.h": "c" + } +} \ No newline at end of file diff --git a/README.md b/README.md index 5610866..6f61fa9 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ Safety <|-- HTTP_Metrics } class Outputs{ + +initOutputs() +getCirculationPumpState() +setCirculationPumpState() +getBurnerState() @@ -49,4 +50,12 @@ Safety <|-- HTTP_Metrics + connect_wifi() + setMetrics() } -``` \ No newline at end of file +``` + +### Hardware + + +| Function| ESP32 | ES32C14 | +|------------------|-----------------|------------------| +| CirculationPump | IO27 | Relay 1 NO1 | +| Burner | IO14 | Relay 1 NC2 | diff --git a/main/http_metrics.c b/main/http_metrics.c index b3aa75a..c333c97 100644 --- a/main/http_metrics.c +++ b/main/http_metrics.c @@ -2,7 +2,7 @@ static EventGroupHandle_t s_wifi_event_group; -static const char *TAG = "esp32-env-exp-http_metrics"; +static const char *TAG = "smart-oil-heater-control-system-http_metrics"; char caHtmlResponse[HTML_RESPONSE_SIZE]; SemaphoreHandle_t xMutexAccessMetricResponse = NULL; diff --git a/main/main.c b/main/main.c index b796bef..f92c410 100644 --- a/main/main.c +++ b/main/main.c @@ -12,31 +12,18 @@ #include "freertos/timers.h" #include "http_metrics.h" +#include "outputs.h" #define I2C_MASTER_SCL 19 #define I2C_MASTER_SDA 18 -//#define BMP280 -//#define DHT11 -//#define AHT10 -//#define VEML7700 - -#ifdef DHT11 -#define CONFIG_EXAMPLE_DATA_GPIO 17 -#define SENSOR_TYPE DHT_TYPE_DHT11 -#endif - -#ifdef AHT10 -#define AHT_TYPE AHT_TYPE_AHT1x -#endif - static const char *TAG = "smart-oil-heater-control-system"; void app_main(void) { ESP_LOGI(TAG, "starting ..."); - //Initialize NVS + // Initialize NVS esp_err_t ret = nvs_flash_init(); if (ret == ESP_ERR_NVS_NO_FREE_PAGES || ret == ESP_ERR_NVS_NEW_VERSION_FOUND) { @@ -45,7 +32,7 @@ void app_main(void) } ESP_ERROR_CHECK(ret); - connect_wifi(); //will return if successful + connect_wifi(); // will return if successful setup_server(); sMetric aMetrics[METRIC_MAX_COUNT]; @@ -53,129 +40,68 @@ void app_main(void) /*Sensor Init*/ ESP_ERROR_CHECK(i2cdev_init()); -#ifdef BMP280 - bmp280_params_t params; - bmp280_init_default_params(¶ms); - bmp280_t devBMP280; - memset(&devBMP280, 0, sizeof(bmp280_t)); - ESP_ERROR_CHECK(bmp280_init_desc(&devBMP280, BMP280_I2C_ADDRESS_0, 0, I2C_MASTER_SDA, I2C_MASTER_SCL)); - ESP_ERROR_CHECK(bmp280_init(&devBMP280, ¶ms)); - bool bme280p = devBMP280.id == BME280_CHIP_ID; - ESP_LOGI(TAG, "BMP280: found %s\n", bme280p ? "BME280" : "BMP280"); -#endif - -#ifdef AHT10 - aht_t devAHT10 = {0}; - devAHT10.mode = AHT_MODE_NORMAL; - devAHT10.type = AHT_TYPE; - ESP_ERROR_CHECK(aht_init_desc(&devAHT10, AHT_I2C_ADDRESS_GND, 0, I2C_MASTER_SDA, I2C_MASTER_SCL)); - ESP_ERROR_CHECK(aht_init(&devAHT10)); -#endif - -#ifdef VEML7700 - i2c_dev_t veml7700_device; - veml7700_config_t veml7700_configuration; - - memset(&veml7700_device, 0, sizeof(i2c_dev_t)); - memset(&veml7700_configuration, 0, sizeof(veml7700_config_t)); - - // initialize the device struct - ESP_ERROR_CHECK(veml7700_init_desc(&veml7700_device, I2C_NUM_0, I2C_MASTER_SDA, I2C_MASTER_SCL)); - - // check if the device is available - ESP_ERROR_CHECK(veml7700_probe(&veml7700_device)); - - /* set configuration parameters - * select gain 1/8 coastest resolution but the sensor will most likely not - * over-saturated - */ - veml7700_configuration.gain = VEML7700_GAIN_DIV_8; - - /* set the time to integrate the light values. more time will lead to a finer - * resolution but will be over-saturated earlier - */ - veml7700_configuration.integration_time = VEML7700_INTEGRATION_TIME_100MS; - - // interrupt is not used - veml7700_configuration.persistence_protect = VEML7700_PERSISTENCE_PROTECTION_4; - veml7700_configuration.interrupt_enable = 1; - veml7700_configuration.shutdown = 0; - - // write the configuration to the device - ESP_ERROR_CHECK(veml7700_set_config(&veml7700_device, &veml7700_configuration)); - -#endif + initOutputs(); ESP_LOGI(TAG, "running"); while (1) { + ESP_LOGI(TAG,"\n"); vTaskDelay(pdMS_TO_TICKS(5000)); uint16_t u16MetricCounter = 0U; /*Wifi RSSI*/ wifi_ap_record_t ap; esp_wifi_sta_get_ap_info(&ap); - printf("WiFi RSSI: %d\n", ap.rssi); + // printf("WiFi RSSI: %d\n", ap.rssi); strcpy(aMetrics[u16MetricCounter].caMetricName, "wifi_rssi"); aMetrics[0].fMetricValue = ap.rssi; u16MetricCounter++; -#ifdef BMP280 - if ((bmp280_read_float(&devBMP280, &aMetrics[u16MetricCounter].fMetricValue, &aMetrics[u16MetricCounter+1].fMetricValue, 0) == ESP_OK)) - { - strcpy(aMetrics[u16MetricCounter].caMetricName, "bmp280_temperature"); - strcpy(aMetrics[u16MetricCounter+1].caMetricName, "bmp280_pressure"); - printf("(BMP280) Temperature: %.2f C, Pressure: %.2f Pa\n", aMetrics[u16MetricCounter].fMetricValue, aMetrics[u16MetricCounter+1].fMetricValue); - u16MetricCounter++; - u16MetricCounter++; - } else { - printf("(BMP280) Temperature/pressure reading failed\n"); - } -#endif - -#ifdef AHT10 - if ((aht_get_data(&devAHT10, &aMetrics[u16MetricCounter].fMetricValue, &aMetrics[u16MetricCounter+1].fMetricValue) == ESP_OK)) - { - strcpy(aMetrics[u16MetricCounter].caMetricName, "aht10_temperature"); - strcpy(aMetrics[u16MetricCounter+1].caMetricName, "aht10_humidity"); - printf("(AHT10) Temperature: %.2f C, Humidity: %.2f %% \n", aMetrics[u16MetricCounter].fMetricValue, aMetrics[u16MetricCounter+1].fMetricValue); - u16MetricCounter++; - u16MetricCounter++; - } else { - printf("(AHT10) Temperature/Humidity reading failed\n"); - } -#endif - -#ifdef DHT11 - if ((dht_read_float_data(SENSOR_TYPE, CONFIG_EXAMPLE_DATA_GPIO, &aMetrics[u16MetricCounter].fMetricValue, &aMetrics[u16MetricCounter+1].fMetricValue) == ESP_OK)) - { - strcpy(aMetrics[u16MetricCounter].caMetricName, "dht11_humidity"); - strcpy(aMetrics[u16MetricCounter+1].caMetricName, "dht11_temperature"); - printf("(DHT11) Humidity: %.2f %%, Temperature: %.2f C\n", aMetrics[u16MetricCounter].fMetricValue, aMetrics[u16MetricCounter+1].fMetricValue); - u16MetricCounter++; - u16MetricCounter++; - } else { - printf("(DHT11) Temperature/pressure reading failed\n"); - } -#endif - -#ifdef VEML7700 - uint32_t u32AmbientLight = 0U; - uint32_t u32WhiteChannel = 0U; - if ((veml7700_get_ambient_light(&veml7700_device, &veml7700_configuration, &u32AmbientLight) == ESP_OK) && (veml7700_get_white_channel(&veml7700_device, &veml7700_configuration, &u32WhiteChannel) == ESP_OK)) - { - aMetrics[u16MetricCounter].fMetricValue = u32AmbientLight; - aMetrics[u16MetricCounter+1].fMetricValue = u32WhiteChannel; - strcpy(aMetrics[u16MetricCounter].caMetricName, "veml7700_ambient_light"); - strcpy(aMetrics[u16MetricCounter+1].caMetricName, "veml7700_white_channel"); - printf("(VEML7700) Ambient light: %.2f lux, White channel: %.2f lux\n", aMetrics[u16MetricCounter].fMetricValue, aMetrics[u16MetricCounter+1].fMetricValue); - u16MetricCounter++; - u16MetricCounter++; - } else { - printf("(VEML7700) light reading failed\n"); - } -#endif vSetMetrics(aMetrics, u16MetricCounter); + + setCirculationPumpState(ENABLED); + setBurnerState(ENABLED); + + if (getBurnerState() == ENABLED) + { + ESP_LOGI(TAG, "Burner ENABLED"); + } + else + { + ESP_LOGI(TAG, "Burner DISABLED"); + } + + if (getCirculationPumpState() == ENABLED) + { + ESP_LOGI(TAG, "CirculationPump ENABLED"); + } + else + { + ESP_LOGI(TAG, "CirculationPump DISABLED"); + } + + ESP_LOGI(TAG,"\n"); + vTaskDelay(pdMS_TO_TICKS(2000)); + setCirculationPumpState(DISABLED); + setBurnerState(DISABLED); + + if (getBurnerState() == ENABLED) + { + ESP_LOGI(TAG, "Burner ENABLED"); + } + else + { + ESP_LOGI(TAG, "Burner DISABLED"); + } + + if (getCirculationPumpState() == ENABLED) + { + ESP_LOGI(TAG, "CirculationPump ENABLED"); + } + else + { + ESP_LOGI(TAG, "CirculationPump DISABLED"); + } } -} +} \ No newline at end of file diff --git a/main/output.h b/main/output.h deleted file mode 100644 index 473a0f4..0000000 diff --git a/main/outputs.c b/main/outputs.c index 473a0f4..98d97bd 100644 --- a/main/outputs.c +++ b/main/outputs.c @@ -0,0 +1,73 @@ +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "driver/gpio.h" +#include "esp_log.h" + +#include "outputs.h" + +const uint8_t uCirculationPumpGpioPin = 27U; +const uint8_t uBurnerGpioPin = 14U; + +static eOutput sCirculationPumpState; +static eOutput sBurnerState; + +void initOutputs(void) +{ + gpio_config_t ioConfCirculationPump = { + .pin_bit_mask = (1ULL << uCirculationPumpGpioPin), // 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_t ioConfBurner = { + .pin_bit_mask = (1ULL << uBurnerGpioPin), // 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); +} + +eOutput getCirculationPumpState(void) +{ + return sCirculationPumpState; +} + +void setCirculationPumpState(eOutput in) +{ + sCirculationPumpState = in; + switch (sCirculationPumpState) + { + case ENABLED: + gpio_set_level(uCirculationPumpGpioPin, 1U); // Switch on Circulation Pump + break; + case DISABLED: + gpio_set_level(uCirculationPumpGpioPin, 0U); // Switch off Circulation Pump + default: + break; + } +} + +eOutput getBurnerState(void) +{ +return sBurnerState; +} + +void setBurnerState(eOutput in) +{ + sBurnerState = in; + switch (sBurnerState) + { + case ENABLED: + gpio_set_level(uBurnerGpioPin, 0U); // Switch on Burner + break; + case DISABLED: + gpio_set_level(uBurnerGpioPin, 1U); // Switch off Burner + default: + break; + } +} \ No newline at end of file diff --git a/main/outputs.h b/main/outputs.h new file mode 100644 index 0000000..11fda13 --- /dev/null +++ b/main/outputs.h @@ -0,0 +1,12 @@ +#pragma once + +typedef enum _Output{ + ENABLED, + DISABLED +} eOutput; + +void initOutputs(void); +eOutput getCirculationPumpState(void); +void setCirculationPumpState(eOutput in); +eOutput getBurnerState(void); +void setBurnerState(eOutput in); \ No newline at end of file