使用 ESP32 内置温度传感器读取温度值

引言

在物联网(IoT)设备中,环境温度监测是一个常见的需求。ESP32 开发板集成了一个内部温度传感器,可以方便地用于温度监测应用。了解如何使用 ESP-IDF 框架中的temperature_sensor驱动程序来读取 ESP32 的内部温度传感器数据。

示例代码

我们将使用 ESP-IDF 提供的示例代码来演示如何读取 ESP32 的内部温度传感器数据。以下是完整的示例代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include "driver/temperature_sensor.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

static const char* TAG = "example";

void app_main(void)
{
// 初始化温度传感器,设置预期的温度范围为 10~50℃
ESP_LOGI(TAG, "Install temperature sensor, expected temp range: 10~50 ℃");
temperature_sensor_handle_t temp_sensor = NULL;
temperature_sensor_config_t temp_sensor_config = TEMPERATURE_SENSOR_CONFIG_DEFAULT(10, 50);
ESP_ERROR_CHECK(temperature_sensor_install(&temp_sensor_config, &temp_sensor));

// 启用温度传感器
ESP_LOGI(TAG, "Enable temperature sensor");
ESP_ERROR_CHECK(temperature_sensor_enable(temp_sensor));

// 读取温度值并打印
ESP_LOGI(TAG, "Read temperature");
float tsens_value;
while (1) { // 官网这里只循环了 20 次
ESP_ERROR_CHECK(temperature_sensor_get_celsius(temp_sensor, &tsens_value));
ESP_LOGI(TAG, "Temperature value %.02f ℃", tsens_value);
vTaskDelay(pdMS_TO_TICKS(1000)); // 每秒读取一次
}
}

代码解析

1. 包含头文件

1
2
3
4
#include "driver/temperature_sensor.h"
#include "esp_log.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"

driver/temperature_sensor.h:包含温度传感器驱动程序的 API 声明。

esp_log.h:包含日志记录功能。

freertos/FreeRTOS.hfreertos/task.h:包含 FreeRTOS 任务管理功能。

2. 定义日志标签

1
static const char* TAG = "example";

定义了一个日志标签,用于标识日志信息的来源。

3. 初始化温度传感器

1
2
3
4
ESP_LOGI(TAG, "Install temperature sensor, expected temp range: 10~50 ℃");
temperature_sensor_handle_t temp_sensor = NULL;
temperature_sensor_config_t temp_sensor_config = TEMPERATURE_SENSOR_CONFIG_DEFAULT(10, 50);
ESP_ERROR_CHECK(temperature_sensor_install(&temp_sensor_config, &temp_sensor));

temperature_sensor_config_t temp_sensor_config = TEMPERATURE_SENSOR_CONFIG_DEFAULT(10, 50);:创建一个默认的温度传感器配置结构体,并设置预期的温度范围为 10 到 50 摄氏度。

temperature_sensor_install(&temp_sensor_config, &temp_sensor);:根据配置初始化温度传感器,并获取传感器句柄。

4. 启用温度传感器

1
2
ESP_LOGI(TAG, "Enable temperature sensor");
ESP_ERROR_CHECK(temperature_sensor_enable(temp_sensor));

temperature_sensor_enable(temp_sensor);:启用已初始化的温度传感器。

5. 读取温度值

1
2
3
4
5
6
7
ESP_LOGI(TAG, "Read temperature");
float tsens_value;
while (1) {
ESP_ERROR_CHECK(temperature_sensor_get_celsius(temp_sensor, &tsens_value));
ESP_LOGI(TAG, "Temperature value %.02f ℃", tsens_value);
vTaskDelay(pdMS_TO_TICKS(1000)); // 每秒读取一次
}

在一个无限循环中,使用temperature_sensor_get_celsius函数读取当前温度值,并通过ESP_LOGI打印出来。

vTaskDelay(pdMS_TO_TICKS(1000));:设置任务延迟 1 秒,以便每秒读取一次温度。

温度传感器概述

简介

ESP32 内置传感器,用于测量芯片内部的温度。该温度传感器模组包含一个 8 位 Sigma-Delta 模拟-数字转换器(ADC)和一个数字-模拟转换器(DAC),可以补偿测量结果,减少温度测量的误差。

预定义测量范围及误差

预定义测量范围 (°C) 测量误差 (°C)
50 ~ 125 < 3
20 ~ 100 < 2
-10 ~ 80 < 1
-30 ~ 50 < 2
-40 ~ 20 < 3

功能概述

  1. 资源分配:

通过temperature_sensor_config_t结构体设置温度范围。

使用temperature_sensor_install函数安装温度传感器,并获取传感器句柄。

  1. 启用及禁用温度传感器:

使用temperature_sensor_enable启用温度传感器。

使用temperature_sensor_disable禁用温度传感器。

  1. 获取测量的温度值:

使用temperature_sensor_get_celsius获取实时温度值。

  1. 电源管理:

温度传感器不使用 APB 时钟,无论是否激活电源管理,温度传感器仍可以继续工作。

  1. 线程安全:

温度传感器驱动程序通常只在一个任务中调用,如果要在不同任务中使用,需要设置额外的锁进行保护。

注意事项

温度传感器测量的是芯片内部的温度,而不是环境温度。

安装温度传感器失败时,可能会出现错误信息the boundary you gave cannot meet the range of internal temperature sensor,这通常是由于配置的温度范围超出了预定义的测量范围。

总结

通过上述代码,我们可以轻松地在 ESP32 上实现对内部温度传感器的读取。这个示例展示了如何使用 ESP-IDF 提供的温度传感器驱动程序进行基本的操作,包括初始化、启用和读取温度值。你可以根据实际需求,进一步扩展这个示例,比如将温度数据发送到云端或触发特定的动作。

希望这篇博客笔记对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言。

相关参考


使用 ESP32 内置温度传感器读取温度值
https://bubao.github.io/posts/c55d1163.html
作者
一念
发布于
2025年5月18日
许可协议