主要更改: 1. 新增使用手册: - AI算法更新指南 - HTPA60x40传感器升级指南 - 环境配置教程 2. 传感器模块优化: - HTPA60x40dR1L0.9传感器集成 - HTPAd32x32L1k7传感器更新 - 传感器配置文档完善 3. 项目文档整理: - 删除过期的433MHz使用指南 - 更新README文档结构 - 完善配置教程链接 目标:完善项目文档,优化传感器集成
7.8 KiB
7.8 KiB
HTPA60x40dR1L0.9/0.8 热成像传感器驱动
📋 概述
本目录包含Heimann HTPA60x40dR1L0.9/0.8热成像传感器的ESP32驱动代码。该传感器提供60x40像素分辨率的热成像数据,相比32x32传感器提供更高的分辨率和更详细的热成像信息。
🔧 硬件规格
传感器参数:
- 分辨率:60x40像素 (2400个像素)
- 视场角:60° x 40° (标准版本)
- 温度范围:-20°C 到 +300°C
- 精度:±2°C (在环境温度下)
- 帧率:最高4Hz
- 接口:I2C (地址0x1A)
- 工作电压:3.3V
- 功耗:约150mA
与32x32版本的主要区别:
- 像素数量:2400 vs 1024 (增加134%)
- 数据量:4800字节 vs 2048字节
- 处理时间:更长的数据读取和处理时间
- 内存需求:更大的缓冲区需求
📁 文件结构
HTPA60x40dR1L0.9/
├── HTPA60x40dR1L0.9.h # 传感器常量定义
├── HTPA_Sensor60x40.h # 传感器类声明
├── HTPA_Sensor60x40.cpp # 传感器类实现
├── htpa60x40_lookuptable.cpp # 温度查找表
├── CMakeLists.txt # 编译配置
└── README.md # 本文档
🚀 使用方法
1. 基本初始化
#include "Sensor/HTPA60x40dR1L0.9/HTPA_Sensor60x40.h"
HTPA60x40 thermal_sensor;
void setup() {
// 初始化传感器
esp_err_t ret = thermal_sensor.init();
if (ret != ESP_OK) {
ESP_LOGE("MAIN", "Failed to initialize HTPA60x40 sensor");
return;
}
ESP_LOGI("MAIN", "HTPA60x40 sensor initialized successfully");
}
2. 数据读取
void loop() {
// 处理传感器数据
if (thermal_sensor.process()) {
// 方法1:获取完整60x40热成像数据
float thermal_data[2400];
if (thermal_sensor.getThermalData60x40(thermal_data)) {
// 处理2400个像素的温度数据
for (int i = 0; i < 2400; i++) {
// thermal_data[i] 包含第i个像素的温度值
}
}
// 方法2:获取降采样的8x5网格数据(兼容性更好)
float grid_8x5[40];
if (thermal_sensor.getThermalGrid8x5(grid_8x5)) {
// 处理40个网格的平均温度
}
// 方法3:获取12x8网格数据(中等分辨率)
float grid_12x8[96];
if (thermal_sensor.getThermalGrid12x8(grid_12x8)) {
// 处理96个网格的平均温度
}
// 方法4:获取指定区域的平均温度
float region_temp;
if (thermal_sensor.getRegionTemperature(20, 15, 20, 10, ®ion_temp)) {
ESP_LOGI("MAIN", "Region temperature: %.2f°C", region_temp);
}
// 方法5:获取最热点和最冷点
float hot_temp, cold_temp;
uint8_t hot_x, hot_y, cold_x, cold_y;
if (thermal_sensor.getHotColdSpots(&hot_temp, &hot_x, &hot_y,
&cold_temp, &cold_x, &cold_y)) {
ESP_LOGI("MAIN", "Hot spot: %.2f°C at (%d,%d)", hot_temp, hot_x, hot_y);
ESP_LOGI("MAIN", "Cold spot: %.2f°C at (%d,%d)", cold_temp, cold_x, cold_y);
}
}
vTaskDelay(pdMS_TO_TICKS(250)); // 4Hz更新频率
}
3. 与现有32x32代码的集成
// 在主程序中可以通过条件编译选择传感器
#ifdef USE_HTPA60x40
#include "Sensor/HTPA60x40dR1L0.9/HTPA_Sensor60x40.h"
HTPA60x40 thermal_sensor;
#else
#include "Sensor/HTPAd32x32L1k7/HTPA_Sensor32_2.h"
HTPA32_2 thermal_sensor;
#endif
void init_thermal_sensor() {
esp_err_t ret = thermal_sensor.init();
if (ret != ESP_OK) {
ESP_LOGE("MAIN", "Failed to initialize thermal sensor");
}
}
⚙️ 配置选项
I2C配置:
- SDA引脚:GPIO14
- SCL引脚:GPIO21
- 时钟频率:1MHz (传感器), 400kHz (EEPROM)
- 地址:0x1A (传感器), 0x50 (EEPROM)
内存配置:
// 在sdkconfig中增加堆内存大小
CONFIG_ESP_MAIN_TASK_STACK_SIZE=8192
CONFIG_FREERTOS_HEAP_SIZE_MIN=32768
性能优化:
// 暂停定时器以避免I2C冲突
thermal_sensor.pauseTimer();
// 执行其他I2C操作
thermal_sensor.resumeTimer();
🔍 API参考
主要方法:
esp_err_t init()
初始化传感器,包括I2C通信、EEPROM读取、校准设置等。
bool process()
处理传感器数据,返回true表示有新数据可用。
bool getThermalData60x40(float* thermal_data)
获取完整的60x40热成像数据,需要2400个float的数组。
bool getThermalGrid8x5(float* grid_temps)
获取8x5网格的降采样数据,需要40个float的数组。
bool getThermalGrid12x8(float* grid_temps)
获取12x8网格的降采样数据,需要96个float的数组。
bool getRegionTemperature(uint8_t start_x, uint8_t start_y, uint8_t width, uint8_t height, float* avg_temp)
获取指定矩形区域的平均温度。
bool getHotColdSpots(...)
获取图像中的最热点和最冷点位置及温度。
信息查询方法:
uint16_t getPixelCount()
返回像素总数 (2400)。
uint8_t getColumnCount()
返回列数 (60)。
uint8_t getRowCount()
返回行数 (40)。
uint16_t get_ambient_temperature()
返回环境温度。
⚠️ 注意事项
1. 内存需求
60x40传感器需要更多内存:
- 像素常量:2400 × 4字节 = 9.6KB
- 像素数据:2400 × 2字节 = 4.8KB
- 缓冲区:约20个块 × 242字节 = 4.8KB
- 总计:约19.2KB (vs 32x32的8KB)
2. 处理时间
更多的像素意味着:
- 更长的I2C数据传输时间
- 更多的计算处理时间
- 可能需要降低帧率以保证系统稳定性
3. 查找表
当前使用的是简化的查找表,实际部署时需要:
- 从Heimann获取完整的校准查找表
- 根据具体传感器型号调整参数
- 进行温度校准验证
4. 兼容性
代码设计为与32x32版本API兼容,但:
- 数据量更大,需要相应调整缓冲区大小
- 网络传输可能需要压缩或分包
- 显示界面需要适配新的分辨率
🔧 故障排除
常见问题:
1. 内存不足
E (xxx) HTPA60x40: Memory allocation failed for 2400 pixels
解决方案:增加堆内存大小或使用PSRAM。
2. I2C通信失败
E (xxx) HTPA60x40: Sensor initialization failed, check connections
解决方案:检查I2C连接和电源供应。
3. 数据处理缓慢
解决方案:
- 使用降采样方法减少数据量
- 优化处理算法
- 考虑使用DMA传输
调试技巧:
// 启用详细日志
esp_log_level_set("HTPA60x40", ESP_LOG_DEBUG);
// 监控内存使用
ESP_LOGI("MAIN", "Free heap: %d bytes", esp_get_free_heap_size());
// 检查传感器状态
ESP_LOGI("MAIN", "Sensor pixels: %d, columns: %d, rows: %d",
thermal_sensor.getPixelCount(),
thermal_sensor.getColumnCount(),
thermal_sensor.getRowCount());
📈 性能对比
| 特性 | HTPA32x32 | HTPA60x40 | 提升 |
|---|---|---|---|
| 像素数 | 1024 | 2400 | +134% |
| 分辨率 | 32×32 | 60×40 | +134% |
| 数据量 | 2KB | 4.8KB | +140% |
| 内存需求 | ~8KB | ~19KB | +138% |
| 处理时间 | 基准 | +150% | - |
🚀 未来改进
- 硬件加速:使用ESP32的DMA功能加速I2C传输
- 数据压缩:实现实时数据压缩算法
- 智能采样:根据应用需求动态调整采样率
- 温度校准:实现更精确的温度转换算法
- 多传感器支持:支持同时使用多个传感器
注意:此代码为预备版本,在实际部署前需要:
- 获取完整的传感器校准数据
- 进行充分的硬件测试
- 优化性能和内存使用
- 验证温度精度
文档版本:v1.0
创建时间:2026年2月26日
适用传感器:HTPA60x40dR1L0.9, HTPA60x40dR1L0.8