summaryrefslogtreecommitdiff
path: root/ports/esp32
diff options
context:
space:
mode:
authorRick Sorensen <rick.sorensen@gmail.com>2023-12-26 12:57:46 -0600
committerDamien George <damien@micropython.org>2024-05-07 17:29:22 +1000
commit63c30a2dfc3118f2f82693dd96114b1efebf071c (patch)
treea1b8508a2aceec2a8ae88d55506f1ca4827afa28 /ports/esp32
parent595f86155aa76c4fd7c9b46a848023a93f6ddd32 (diff)
esp32/modesp32: Add mcu_temperature() function for C3/S2/S3 devices.
For ESP32C3/S2/S3 IDFv5 exposes new internal temperature API which is different to the base ESP32, IDFv4. Thanks to @robert-hh for cleaner code and testing sensor capability in these devices. See discussion #10443. Signed-off-by: Rick Sorensen <rick.sorensen@gmail.com>
Diffstat (limited to 'ports/esp32')
-rw-r--r--ports/esp32/modesp32.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/ports/esp32/modesp32.c b/ports/esp32/modesp32.c
index f36393948..1ee9153d7 100644
--- a/ports/esp32/modesp32.c
+++ b/ports/esp32/modesp32.c
@@ -168,6 +168,26 @@ static mp_obj_t esp32_raw_temperature(void) {
}
static MP_DEFINE_CONST_FUN_OBJ_0(esp32_raw_temperature_obj, esp32_raw_temperature);
+#else
+
+// IDF 5 exposes new internal temperature interface, and the ESP32C3/S2/S3
+// now have calibrated temperature settings in 5 discrete ranges.
+#include "driver/temperature_sensor.h"
+
+static mp_obj_t esp32_mcu_temperature(void) {
+ static temperature_sensor_handle_t temp_sensor = NULL;
+ float tvalue;
+ if (temp_sensor == NULL) {
+ temperature_sensor_config_t temp_sensor_config = TEMPERATURE_SENSOR_CONFIG_DEFAULT(-10, 80);
+ ESP_ERROR_CHECK(temperature_sensor_install(&temp_sensor_config, &temp_sensor));
+ }
+ ESP_ERROR_CHECK(temperature_sensor_enable(temp_sensor));
+ ESP_ERROR_CHECK(temperature_sensor_get_celsius(temp_sensor, &tvalue));
+ ESP_ERROR_CHECK(temperature_sensor_disable(temp_sensor));
+ return mp_obj_new_int((int)(tvalue + 0.5));
+}
+static MP_DEFINE_CONST_FUN_OBJ_0(esp32_mcu_temperature_obj, esp32_mcu_temperature);
+
#endif
static mp_obj_t esp32_idf_heap_info(const mp_obj_t cap_in) {
@@ -202,6 +222,8 @@ static const mp_rom_map_elem_t esp32_module_globals_table[] = {
{ MP_ROM_QSTR(MP_QSTR_gpio_deep_sleep_hold), MP_ROM_PTR(&esp32_gpio_deep_sleep_hold_obj) },
#if CONFIG_IDF_TARGET_ESP32
{ MP_ROM_QSTR(MP_QSTR_raw_temperature), MP_ROM_PTR(&esp32_raw_temperature_obj) },
+ #else
+ { MP_ROM_QSTR(MP_QSTR_mcu_temperature), MP_ROM_PTR(&esp32_mcu_temperature_obj) },
#endif
{ MP_ROM_QSTR(MP_QSTR_idf_heap_info), MP_ROM_PTR(&esp32_idf_heap_info_obj) },