From 311ab2db2f75f927d7b8dd12444497c50c7c3edb84b8c92c7f561b8fcf63f337 Mon Sep 17 00:00:00 2001 From: localhorst Date: Sat, 7 Dec 2024 21:53:58 +0100 Subject: [PATCH] read temperatur via 1-Wire --- README.md | 9 +++--- main/inputs.c | 80 +++++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 79 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 043ff5e..3eee925 100644 --- a/README.md +++ b/README.md @@ -57,7 +57,8 @@ Safety <|-- HTTP_Metrics | Function| ESP32 | ES32C14 | -|------------------|-----------------|------------------| -| CirculationPump | IO27 | Relay 1 NO1 | -| Burner | IO14 | Relay 1 NC2 | -| Burner Fault | IO19 | Digital Input IN1 | +|-----------------------|-------|---------------------------| +| CirculationPump | IO27 | Relay 1 NO1 | +| Burner | IO14 | Relay 1 NC2 | +| Burner Fault | IO19 | Digital Input IN1 | +| Temperature DS10B20 | IO04 | 1-Wire | diff --git a/main/inputs.c b/main/inputs.c index 8cc4522..8814114 100644 --- a/main/inputs.c +++ b/main/inputs.c @@ -2,12 +2,30 @@ #include "freertos/task.h" #include "driver/gpio.h" #include "esp_log.h" +#include #include "inputs.h" +#define MAX_DN18B20_SENSORS 4U + static const char *TAG = "smart-oil-heater-control-system-inputs"; const uint8_t uBurnerFaultPin = 19U; +const uint8_t uDS18B20Pin = 4U; +const onewire_addr_t uChamperTempSensorAddr = 0x3e0000001754be28; +const onewire_addr_t uOutdoorTempSensorAddr = 0x880000001648e328; +const onewire_addr_t uInletFlowTempSensorAddr = 0xe59cdef51e64ff28; +const onewire_addr_t uReturnFlowTempSensorAddr = 0xa7a8e1531f64ff28; + +onewire_addr_t uOneWireAddresses[MAX_DN18B20_SENSORS]; +float fDS18B20Temps[MAX_DN18B20_SENSORS]; +size_t sSensorCount = 0U; + static eBurnerErrorState sBurnerErrorState; +static float fChamperTemperature; +static float fOutdoorTemperature; +static float fInletFlowTemperature; +static float fReturnFlowTemperature; + void loop(void *pvParameters); void initInputs(void) @@ -44,11 +62,10 @@ void initInputs(void) void loop(void *pvParameters) { - // This task will run in a loop while (1) { ESP_LOGI(TAG, "Running task Input..."); - vTaskDelay(1000 / portTICK_PERIOD_MS); // Delay for 1 second + vTaskDelay(1000U / portTICK_PERIOD_MS); if (gpio_get_level(uBurnerFaultPin) == 1) { @@ -58,24 +75,75 @@ void loop(void *pvParameters) { sBurnerErrorState = NO_ERROR; } + + if (ds18x20_scan_devices(uDS18B20Pin, uOneWireAddresses, MAX_DN18B20_SENSORS, &sSensorCount) != ESP_OK) + { + ESP_LOGE(TAG, "1-Wire device scan error!"); + } + + if (!sSensorCount) + { + ESP_LOGW(TAG, "No 1-Wire devices detected!"); + } + else + { + ESP_LOGI(TAG, "%d 1-Wire devices detected", sSensorCount); + + if (sSensorCount > MAX_DN18B20_SENSORS) + { + sSensorCount = MAX_DN18B20_SENSORS; + ESP_LOGW(TAG, "More 1-Wire devices found than expected!"); + } + + if (ds18x20_measure_and_read_multi(uDS18B20Pin, uOneWireAddresses, sSensorCount, fDS18B20Temps) != ESP_OK) + { + ESP_LOGE(TAG, "1-Wire devices read error"); + } + else + { + for (int j = 0; j < sSensorCount; j++) + { + float temp_c = fDS18B20Temps[j]; + ESP_LOGI(TAG, "Sensor: %08" PRIx64 " reports %.3f°C", (uint64_t)uOneWireAddresses[j], temp_c); + + switch ((uint64_t)uOneWireAddresses[j]) + { + case ((uint64_t)uChamperTempSensorAddr): + fChamperTemperature = temp_c; + break; + case ((uint64_t)uOutdoorTempSensorAddr): + fOutdoorTemperature = temp_c; + break; + case ((uint64_t)uInletFlowTempSensorAddr): + fInletFlowTemperature = temp_c; + break; + case ((uint64_t)uReturnFlowTempSensorAddr): + fReturnFlowTemperature = temp_c; + break; + default: + break; + } + } + } + } } } float getChamberTemperature(void) { - return 42.42; + return fChamperTemperature; } float getOutdoorTemperature(void) { - return 42.42; + return fOutdoorTemperature; } float getInletFlowTemperature(void) { - return 42.42; + return fInletFlowTemperature; } float getReturnFlowTemperature(void) { - return 42.42; + return fReturnFlowTemperature; } eBurnerErrorState getBurnerError(void) {