这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 【M5stackS3】读取内部温度传感器数据

共1条 1/1 1 跳转至

【M5stackS3】读取内部温度传感器数据

高工
2026-06-13 10:13:21     打赏

一:ESP32S3的ADC知识

        ESP32-S3 集成了两个 12 位 SAR ADC,每个ADC有10个通道,共支持 20 个模拟通道输入,可测量最多来自 20 个管脚的模拟信号以及内部电压等内部信号。其中,为了实现更低功耗,ESP32-S3 的 ULP 协处理器也可以在睡眠方式下测量电压,此时,可通过设置阈值或其他触发方式唤醒 CPU。

  ADC可以转换的电压范围由VREF决定,对于ESP32-S3通常是0到3.3V,但需要注意的是,ESP32具体的最大额定输入电压可能略有不同,检查相应数据手册的具体信息非常重要,通常会建议使用衰减器(Attenuation)功能或者额外的硬件如电压分压器来保证输入电压在规定范围内。

  ESP32-S3内部还带了一个温度传感器,用于生成一个随温度变化的电压。内部 ADC 将传感器电压转化为一个数字量,温度传感器的测量范围为–20 °C 到 110 °C。温度传感器适用于监测芯片内部温度的变化,该温度值会随着微控制器时钟频率或 IO 负载的变化而变化。一般来讲,芯片内部温度会高于外部温度。

二:ADC的基本参数

ADC 的基本参数通常包括以下几个:

通道和引脚: 不是所有的GPIO都可以用于ADC读取,需要查看ESP32S3的引脚图来确定哪些引脚支持ADC功能。

分辨率:指 ADC 的数字输出位数,也称为量化位数。例如,12 位 ADC 具有 4096 个离散的数字输出。

采样速率:指 ADC 可以进行采样的最大速率。对于 ESP32-S3,最大采样速率为 2.5 MS/s。

输入范围:指 ADC 可以测量输入信号的电压范围。对于 ESP32-S3,输入范围为 0-3.3V。

噪声:指 ADC 在采集时分辨率的误差和干扰的影响。噪声越小,ADC 测量结果越精准。

稳定性:指 ADC 输出的稳定性。稳定性好的 ADC 输出变化小,测量结果更加准确。

三:软件代码

#include "driver/temperature_sensor.h"
#include <Arduino.h>
// 引入ESP32-S3温度传感器所需的IDF驱动头文件
extern "C" {
#include "driver/temperature_sensor.h"
}

// 定义测量范围。设置得越接近实际工作温度,精度越高,这里设置20~50℃适用于大多数室温场景[citation:4][citation:10]
#define TEMP_RANGE_MIN  20
#define TEMP_RANGE_MAX  50

temperature_sensor_handle_t temp_handle = NULL;

void setup() {
  Serial.begin(115200);
  Serial.println("ESP32-S3 内部温度传感器准备就绪");

  // 1. 配置传感器参数
  temperature_sensor_config_t temp_sensor_config = {
      .range_min = TEMP_RANGE_MIN,
      .range_max = TEMP_RANGE_MAX,
  };
  
  // 2. 安装传感器驱动
  esp_err_t ret = temperature_sensor_install(&temp_sensor_config, &temp_handle);
  if (ret == ESP_OK) {
    Serial.println("温度传感器初始化成功");
  } else {
    Serial.println("传感器初始化失败,请检查配置");
    return;
  }
  
  // 3. 使能传感器,开始工作
  temperature_sensor_enable(temp_handle);
}

void loop() {
  float temperature_celsius = 0.0;
  // 4. 读取温度数据,单位为摄氏度
  esp_err_t ret = temperature_sensor_get_celsius(temp_handle, &temperature_celsius);
  
  if (ret == ESP_OK) {
    Serial.print("芯片内部温度: ");
    Serial.print(temperature_celsius);
    Serial.println(" °C");
  } else {
    Serial.println("读取温度失败");
  }
  
  delay(1000); // 每秒读取一次
}

头文件引入方式:由于这是Arduino项目,直接包含IDF头文件会报错,必须使用 extern "C" {} 包裹,告诉编译器按C语言的方式去链接函数。

数据类型与API:代码中使用的 temperature_sensor_handle_t 、temperature_sensor_config_t 等类型和函数,与ESP-IDF编程中的用法完全一致,这也是官方推荐的操作方式。

关于测量范围 (range_min /range_max):这个设置非常重要。ESP32-S3的内部传感器在不同温度区间有不同的校准曲线,将范围设置得越窄、越贴近实际工作温度,读出的数据就越准。如果只是放在室温下测,设为 20,50比设为 -10,80更准确。

功耗优化:如果不需要连续监控,可以在读完温度后调用 temperature_sensor_disable 关闭传感器以节省电量,下次读取前再调用temperature_sensor_enable即可。

核心提醒:这是芯片内部的温度,读数值通常会高于环境气温,别把它当成室温计用。

四:实物验证:

软件截图如下所示:

04-1 串口接收数据.png





关键词: arduino     内部     温度    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]