summaryrefslogtreecommitdiff
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
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>
-rw-r--r--docs/esp32/quickref.rst6
-rw-r--r--ports/esp32/modesp32.c22
2 files changed, 28 insertions, 0 deletions
diff --git a/docs/esp32/quickref.rst b/docs/esp32/quickref.rst
index 3f0db2286..2be1dbadc 100644
--- a/docs/esp32/quickref.rst
+++ b/docs/esp32/quickref.rst
@@ -67,6 +67,12 @@ Note that the temperature sensor in the ESP32 will typically read higher than
ambient due to the IC getting warm while it runs. This effect can be minimised
by reading the temperature sensor immediately after waking up from sleep.
+ESP32C3, ESP32S2, and ESP32S3 also have an internal temperature sensor available.
+It is implemented a bit differently to the ESP32 and returns the temperature in
+Celsius::
+
+ esp32.mcu_temperature() # read the internal temperature of the MCU, in Celsius
+
Networking
----------
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) },