inet-mon/firmware/main/temperature.cpp
Ricardo (XenGi) Band 840909af66
nearly done
2026-07-17 00:08:48 +02:00

65 lines
2.2 KiB
C++

/**
* @file temperature.cpp
* @brief ESP32-S3 internal temperature sensor driver
*
* Uses the built-in TEMPSENSOR peripheral to measure chip die temperature.
* No external wiring needed. The chip temperature is typically 10-20°C
* above ambient due to self-heating, but is useful for relative monitoring.
*
* API reference: driver/temperature_sensor.h
*/
#include "temperature.h"
#include <stdio.h>
#include "esp_log.h"
#include "driver/temperature_sensor.h"
static const char *TAG = "TEMP";
// ─── State ──────────────────────────────────────────────────────────────────
static temperature_sensor_handle_t s_temp_handle = NULL;
static bool s_sensor_ready = false;
// ─── Public API ─────────────────────────────────────────────────────────────
bool temperature_init(void)
{
ESP_LOGI(TAG, "Initializing ESP32-S3 internal temperature sensor...");
// Configure range for typical operation (0°C to 80°C covers rack temps)
temperature_sensor_config_t config = TEMPERATURE_SENSOR_CONFIG_DEFAULT(0, 80);
esp_err_t ret = temperature_sensor_install(&config, &s_temp_handle);
if (ret != ESP_OK) {
ESP_LOGW(TAG, "Temperature sensor install failed: %s", esp_err_to_name(ret));
return false;
}
ret = temperature_sensor_enable(s_temp_handle);
if (ret != ESP_OK) {
ESP_LOGW(TAG, "Temperature sensor enable failed: %s", esp_err_to_name(ret));
temperature_sensor_uninstall(s_temp_handle);
s_temp_handle = NULL;
return false;
}
s_sensor_ready = true;
ESP_LOGI(TAG, "Internal temperature sensor ready");
return true;
}
float temperature_read(void)
{
if (!s_sensor_ready || !s_temp_handle) return -273.0f;
float celsius = -273.0f;
esp_err_t ret = temperature_sensor_get_celsius(s_temp_handle, &celsius);
if (ret != ESP_OK) {
ESP_LOGW(TAG, "Temperature read failed: %s", esp_err_to_name(ret));
return -273.0f;
}
return celsius;
}