From 197b9009c37272843da747ffd41b77e0102b0060 Mon Sep 17 00:00:00 2001 From: Andrew Krasichkov Date: Tue, 12 Dec 2023 06:44:35 +0300 Subject: [PATCH 1/2] more sensors added --- src/board_config.h | 10 ++++++ src/board_manager.cpp | 76 +++++++++++++++++++++++++++++++++++++++++++ src/board_manager.h | 12 ++++++- src/gui.cpp | 44 ++++++++++++++++++++++++- src/gui.h | 1 + src/ssh_handler.cpp | 8 +++++ 6 files changed, 149 insertions(+), 2 deletions(-) diff --git a/src/board_config.h b/src/board_config.h index c6f9075..8339c7b 100644 --- a/src/board_config.h +++ b/src/board_config.h @@ -31,6 +31,16 @@ #define IDR_CASE_OPENED_MODE INPUT_PULLUP // End of intruder config +// Batt config +#define HAVE_BATTERY 1 +#define ADC_PIN 4 +// End of batt config + +// Temp sensor +// Broken for ESP32S3 so far: https://github.com/espressif/esp-idf/issues/8088 +// #define HAVE_TEMP_SENSOR 1 +// End of core temp sensor + // Log store config // #define HAVE_SD_CARD 1 #define SD_CARD_SS_PIN 14 diff --git a/src/board_manager.cpp b/src/board_manager.cpp index 7e6e5be..f40509c 100644 --- a/src/board_manager.cpp +++ b/src/board_manager.cpp @@ -10,6 +10,14 @@ #include #include #include +#if HAVE_BATTERY +#include +#endif +#if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5,0,0) +#include +#else +#include +#endif #define LOG_PREFIX "board_manager: " @@ -19,6 +27,10 @@ namespace static TUIManager& uiManager = TUIManager::Instance(); static TAuthenticator& authenticator = TAuthenticator::Instance(); +#if HAVE_TEMP_SENSOR && ESP_IDF_VERSION > ESP_IDF_VERSION_VAL(5,0,0) + temperature_sensor_handle_t temp_sensor; +#endif + void restart() { esp_restart(); @@ -34,6 +46,55 @@ namespace esp_deep_sleep_start(); } + uint32_t adcBattVoltage() + { + #if !HAVE_BATTERY || !ADC_PIN + return 0; + #endif + esp_adc_cal_characteristics_t adc_chars; + esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 1100, &adc_chars); + uint32_t v1 = 0, raw = 0; + raw = analogRead(ADC_PIN); + v1 = esp_adc_cal_raw_to_voltage(raw, &adc_chars) * 2; + return v1; + } + + void initEsp32TempSensor() + { + #if !HAVE_TEMP_SENSOR + return; + #endif + + // https://docs.espressif.com/projects/esp-idf/zh_CN/v4.4.4/esp32s3/api-reference/peripherals/temp_sensor.html + #if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5,0,0) + temp_sensor_config_t temp_sensor = TSENS_CONFIG_DEFAULT(); + temp_sensor_set_config(temp_sensor); + temp_sensor_start(); + #else + // https://docs.espressif.com/projects/esp-idf/zh_CN/v5.0.1/esp32s3/api-reference/peripherals/temp_sensor.html + static temperature_sensor_config_t temp_sensor_config = TEMPERATURE_SENSOR_CONFIG_DEFAULT(10, 50); + temperature_sensor_install(&temp_sensor_config, &temp_sensor); + temperature_sensor_enable(temp_sensor); + #endif + } + + float esp32CoreTemp() + { + #if !HAVE_TEMP_SENSOR + return 0.0f; + #endif + + float tsens_value; + // https://docs.espressif.com/projects/esp-idf/zh_CN/v4.4.4/esp32s3/api-reference/peripherals/temp_sensor.html + #if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5,0,0) + temp_sensor_read_celsius(&tsens_value); + #else + // https://docs.espressif.com/projects/esp-idf/zh_CN/v5.0.1/esp32s3/api-reference/peripherals/temp_sensor.html + temperature_sensor_get_celsius(temp_sensor, &tsens_value); + #endif + + return tsens_value; + } } TBoardManager& TBoardManager::Instance() @@ -56,6 +117,9 @@ bool TBoardManager::Begin() Log.infoln(LOG_PREFIX "IDR not available"); #endif + Log.infoln(LOG_PREFIX "setup temp sensor"); + initEsp32TempSensor(); + Log.infoln(LOG_PREFIX "setup preferences"); if (!TPrefStore::Instance().Begin()) { Log.errorln(LOG_PREFIX "unable to open preferences"); @@ -185,6 +249,16 @@ uint32_t TBoardManager::FreeHeap() const return esp_get_free_heap_size(); } +uint32_t TBoardManager::BattVoltage() const +{ + return adcBattVoltage(); +} + +float TBoardManager::CoreTemp() const +{ + return esp32CoreTemp(); +} + void TBoardManager::tickRestart() { if (restartAt > 0 && Uptime() >= restartAt) { @@ -209,4 +283,6 @@ void TBoardManager::tickBoardInfo() infoUpdatedAt = Uptime(); boardInfo.LocalIP = netManager.LocalIP(); + boardInfo.CoreTemp = CoreTemp(); + boardInfo.BattVoltage = BattVoltage(); } diff --git a/src/board_manager.h b/src/board_manager.h index 6e81b52..137d7f7 100644 --- a/src/board_manager.h +++ b/src/board_manager.h @@ -3,6 +3,7 @@ #include "config.h" #include "net_manager.h" +// #include class TBoardManager { @@ -21,10 +22,17 @@ class TBoardManager { BoardState State; IPAddress LocalIP; + uint32_t BattVoltage; + float CoreTemp; bool operator==(const BoardInfo& info) const { - return State == info.State && LocalIP == info.LocalIP; + return ( + State == info.State && + LocalIP == info.LocalIP && + abs((int)BattVoltage - (int)info.BattVoltage) < 50 && + fabs(CoreTemp - info.CoreTemp) < 0.1 + ); } }; @@ -40,6 +48,8 @@ class TBoardManager const TConfig& RuntimeConfig() const; uint32_t Uptime() const; uint32_t FreeHeap() const; + uint32_t BattVoltage() const; + float CoreTemp() const; private: TBoardManager() = default; diff --git a/src/gui.cpp b/src/gui.cpp index 40190f0..e10ff87 100644 --- a/src/gui.cpp +++ b/src/gui.cpp @@ -329,7 +329,7 @@ void TGUI::ShowScreenIdle(TBoardManager::BoardInfo boardInfo) lv_obj_t* ipLabel = lv_label_create(cont); lv_obj_align(ipLabel, LV_ALIGN_BOTTOM_LEFT, 24, -24); lv_obj_set_style_text_font(ipLabel, &font_roboto_mono_20, 0); - lv_obj_set_style_text_align(ipLabel, LV_TEXT_ALIGN_CENTER, 0); + lv_obj_set_style_text_align(ipLabel, LV_TEXT_ALIGN_LEFT, 0); lv_label_set_text_fmt(ipLabel, "IP: %s", boardInfo.LocalIP.toString()); lv_obj_add_event_cb(ipLabel, @@ -344,6 +344,48 @@ void TGUI::ShowScreenIdle(TBoardManager::BoardInfo boardInfo) nullptr ); lv_msg_subsribe_obj(GUI_MESSAGE_UPDATE_BOARD_INFO, ipLabel, nullptr); + +#if HAVE_TEMP_SENSOR + lv_obj_t* tempLabel = lv_label_create(cont); + lv_obj_align(tempLabel, LV_ALIGN_BOTTOM_MID, 0, -24); + lv_obj_set_style_text_font(tempLabel, &font_roboto_mono_20, 0); + lv_obj_set_style_text_align(tempLabel, LV_TEXT_ALIGN_CENTER, 0); + lv_label_set_text_fmt(tempLabel, "Core: %.2f°C", boardInfo.CoreTemp); + + lv_obj_add_event_cb(tempLabel, + [](lv_event_t* e) -> void { + lv_msg_t* m = lv_event_get_msg(e); + lv_obj_t* label = lv_event_get_target(e); + + auto info = reinterpret_cast(lv_msg_get_payload(m)); + lv_label_set_text_fmt(label, "BATT: %.2f°C", info->CoreTemp); + }, + LV_EVENT_MSG_RECEIVED, + nullptr + ); + lv_msg_subsribe_obj(GUI_MESSAGE_UPDATE_BOARD_INFO, tempLabel, nullptr); +#endif + +#if HAVE_BATTERY + lv_obj_t* battLabel = lv_label_create(cont); + lv_obj_align(battLabel, LV_ALIGN_BOTTOM_RIGHT, -24, -24); + lv_obj_set_style_text_font(battLabel, &font_roboto_mono_20, 0); + lv_obj_set_style_text_align(battLabel, LV_TEXT_ALIGN_RIGHT, 0); + lv_label_set_text_fmt(battLabel, "BATT: %.2fV", boardInfo.BattVoltage/1000.0f); + + lv_obj_add_event_cb(battLabel, + [](lv_event_t* e) -> void { + lv_msg_t* m = lv_event_get_msg(e); + lv_obj_t* label = lv_event_get_target(e); + + auto info = reinterpret_cast(lv_msg_get_payload(m)); + lv_label_set_text_fmt(label, "BATT: %.2fV", info->BattVoltage/1000.0f); + }, + LV_EVENT_MSG_RECEIVED, + nullptr + ); + lv_msg_subsribe_obj(GUI_MESSAGE_UPDATE_BOARD_INFO, battLabel, nullptr); +#endif } TGUI::~TGUI() diff --git a/src/gui.h b/src/gui.h index 6f91e14..6cdd168 100644 --- a/src/gui.h +++ b/src/gui.h @@ -1,6 +1,7 @@ #ifndef GUI_H #define GUI_H +#include "board_config.h" #include "board_manager.h" #include #include diff --git a/src/ssh_handler.cpp b/src/ssh_handler.cpp index 52c871d..5be29d5 100644 --- a/src/ssh_handler.cpp +++ b/src/ssh_handler.cpp @@ -1,6 +1,7 @@ #include "ssh_handler.h" #include "defaults.h" #include "config.h" +#include "board_config.h" #include "board_manager.h" #include "secrets.h" #include "authenticator.h" @@ -118,6 +119,13 @@ namespace { rsp["uptime"] = boardManager.Uptime(); rsp["free_heap"] = boardManager.FreeHeap(); + #if HAVE_BATTERY + rsp["batt_voltage"] = boardManager.BattVoltage(); + #endif + #if HAVE_TEMP_SENSOR + rsp["core_temp"] = boardManager.CoreTemp(); + #endif + return true; } } From 2dc2224a7932f93a70c1d3c3775dc573ed39cd85 Mon Sep 17 00:00:00 2001 From: Andrew Krasichkov Date: Tue, 12 Dec 2023 06:49:23 +0300 Subject: [PATCH 2/2] better --- src/board_manager.cpp | 13 ++++++++++--- src/board_manager.h | 9 +++++++-- 2 files changed, 17 insertions(+), 5 deletions(-) diff --git a/src/board_manager.cpp b/src/board_manager.cpp index f40509c..2ed0bf3 100644 --- a/src/board_manager.cpp +++ b/src/board_manager.cpp @@ -10,14 +10,18 @@ #include #include #include + #if HAVE_BATTERY #include #endif + +#if HAVE_TEMP_SENSOR #if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5,0,0) #include #else #include #endif +#endif #define LOG_PREFIX "board_manager: " @@ -50,20 +54,21 @@ namespace { #if !HAVE_BATTERY || !ADC_PIN return 0; - #endif + #else esp_adc_cal_characteristics_t adc_chars; esp_adc_cal_characterize(ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 1100, &adc_chars); uint32_t v1 = 0, raw = 0; raw = analogRead(ADC_PIN); v1 = esp_adc_cal_raw_to_voltage(raw, &adc_chars) * 2; return v1; + #endif } void initEsp32TempSensor() { #if !HAVE_TEMP_SENSOR return; - #endif + #else // https://docs.espressif.com/projects/esp-idf/zh_CN/v4.4.4/esp32s3/api-reference/peripherals/temp_sensor.html #if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5,0,0) @@ -76,13 +81,14 @@ namespace temperature_sensor_install(&temp_sensor_config, &temp_sensor); temperature_sensor_enable(temp_sensor); #endif + #endif } float esp32CoreTemp() { #if !HAVE_TEMP_SENSOR return 0.0f; - #endif + #else float tsens_value; // https://docs.espressif.com/projects/esp-idf/zh_CN/v4.4.4/esp32s3/api-reference/peripherals/temp_sensor.html @@ -94,6 +100,7 @@ namespace #endif return tsens_value; + #endif } } diff --git a/src/board_manager.h b/src/board_manager.h index 137d7f7..c4a58b5 100644 --- a/src/board_manager.h +++ b/src/board_manager.h @@ -2,8 +2,8 @@ #define BB_BOARD_MANAGER_H #include "config.h" +#include "board_config.h" #include "net_manager.h" -// #include class TBoardManager { @@ -30,8 +30,13 @@ class TBoardManager return ( State == info.State && LocalIP == info.LocalIP && + #if HAVE_BATTERY abs((int)BattVoltage - (int)info.BattVoltage) < 50 && - fabs(CoreTemp - info.CoreTemp) < 0.1 + #endif + #if HAVE_TEMP_SENSOR + fabs(CoreTemp - info.CoreTemp) < 0.1 && + #endif + true ); } };