1111#include < SD.h>
1212#include < ArduinoLog.h>
1313
14+ #if HAVE_BATTERY
15+ #include < esp_adc_cal.h>
16+ #endif
17+
18+ #if HAVE_TEMP_SENSOR
19+ #if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5,0,0)
20+ #include < driver/temp_sensor.h>
21+ #else
22+ #include < driver/temperature_sensor.h>
23+ #endif
24+ #endif
25+
1426#define LOG_PREFIX " board_manager: "
1527
1628namespace
@@ -19,6 +31,10 @@ namespace
1931 static TUIManager& uiManager = TUIManager::Instance();
2032 static TAuthenticator& authenticator = TAuthenticator::Instance();
2133
34+ #if HAVE_TEMP_SENSOR && ESP_IDF_VERSION > ESP_IDF_VERSION_VAL(5,0,0)
35+ temperature_sensor_handle_t temp_sensor;
36+ #endif
37+
2238 void restart ()
2339 {
2440 esp_restart ();
@@ -34,6 +50,58 @@ namespace
3450 esp_deep_sleep_start ();
3551 }
3652
53+ uint32_t adcBattVoltage ()
54+ {
55+ #if !HAVE_BATTERY || !ADC_PIN
56+ return 0 ;
57+ #else
58+ esp_adc_cal_characteristics_t adc_chars;
59+ esp_adc_cal_characterize (ADC_UNIT_1, ADC_ATTEN_DB_11, ADC_WIDTH_BIT_12, 1100 , &adc_chars);
60+ uint32_t v1 = 0 , raw = 0 ;
61+ raw = analogRead (ADC_PIN);
62+ v1 = esp_adc_cal_raw_to_voltage (raw, &adc_chars) * 2 ;
63+ return v1;
64+ #endif
65+ }
66+
67+ void initEsp32TempSensor ()
68+ {
69+ #if !HAVE_TEMP_SENSOR
70+ return ;
71+ #else
72+
73+ // https://docs.espressif.com/projects/esp-idf/zh_CN/v4.4.4/esp32s3/api-reference/peripherals/temp_sensor.html
74+ #if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5,0,0)
75+ temp_sensor_config_t temp_sensor = TSENS_CONFIG_DEFAULT ();
76+ temp_sensor_set_config (temp_sensor);
77+ temp_sensor_start ();
78+ #else
79+ // https://docs.espressif.com/projects/esp-idf/zh_CN/v5.0.1/esp32s3/api-reference/peripherals/temp_sensor.html
80+ static temperature_sensor_config_t temp_sensor_config = TEMPERATURE_SENSOR_CONFIG_DEFAULT (10 , 50 );
81+ temperature_sensor_install (&temp_sensor_config, &temp_sensor);
82+ temperature_sensor_enable (temp_sensor);
83+ #endif
84+ #endif
85+ }
86+
87+ float esp32CoreTemp ()
88+ {
89+ #if !HAVE_TEMP_SENSOR
90+ return 0 .0f ;
91+ #else
92+
93+ float tsens_value;
94+ // https://docs.espressif.com/projects/esp-idf/zh_CN/v4.4.4/esp32s3/api-reference/peripherals/temp_sensor.html
95+ #if ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(5,0,0)
96+ temp_sensor_read_celsius (&tsens_value);
97+ #else
98+ // https://docs.espressif.com/projects/esp-idf/zh_CN/v5.0.1/esp32s3/api-reference/peripherals/temp_sensor.html
99+ temperature_sensor_get_celsius (temp_sensor, &tsens_value);
100+ #endif
101+
102+ return tsens_value;
103+ #endif
104+ }
37105}
38106
39107TBoardManager& TBoardManager::Instance ()
@@ -56,6 +124,9 @@ bool TBoardManager::Begin()
56124 Log.infoln (LOG_PREFIX " IDR not available" );
57125#endif
58126
127+ Log.infoln (LOG_PREFIX " setup temp sensor" );
128+ initEsp32TempSensor ();
129+
59130 Log.infoln (LOG_PREFIX " setup preferences" );
60131 if (!TPrefStore::Instance ().Begin ()) {
61132 Log.errorln (LOG_PREFIX " unable to open preferences" );
@@ -185,6 +256,16 @@ uint32_t TBoardManager::FreeHeap() const
185256 return esp_get_free_heap_size ();
186257}
187258
259+ uint32_t TBoardManager::BattVoltage () const
260+ {
261+ return adcBattVoltage ();
262+ }
263+
264+ float TBoardManager::CoreTemp () const
265+ {
266+ return esp32CoreTemp ();
267+ }
268+
188269void TBoardManager::tickRestart ()
189270{
190271 if (restartAt > 0 && Uptime () >= restartAt) {
@@ -209,4 +290,6 @@ void TBoardManager::tickBoardInfo()
209290
210291 infoUpdatedAt = Uptime ();
211292 boardInfo.LocalIP = netManager.LocalIP ();
293+ boardInfo.CoreTemp = CoreTemp ();
294+ boardInfo.BattVoltage = BattVoltage ();
212295}
0 commit comments