smart-home/使用手册/后续调整修改部分/HTPA60x40传感器升级指南.md
小羊肉肉. 0548c1555f 更新项目文档和传感器模块
主要更改:
1. 新增使用手册:
   - AI算法更新指南
   - HTPA60x40传感器升级指南
   - 环境配置教程

2. 传感器模块优化:
   - HTPA60x40dR1L0.9传感器集成
   - HTPAd32x32L1k7传感器更新
   - 传感器配置文档完善

3. 项目文档整理:
   - 删除过期的433MHz使用指南
   - 更新README文档结构
   - 完善配置教程链接

 目标:完善项目文档,优化传感器集成
2026-02-26 18:11:43 +08:00

472 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# HTPA60x40传感器升级指南
## 📋 概述
本文档为后续接手项目的同事提供详细的传感器升级指导。当新的HTPA60x40dR1L0.9/0.8热成像传感器到货后,需要按照本指南进行代码修改和系统集成。
**重要提醒**:新传感器代码已经预先编写完成,位于 `firefly_esp32/main/Sensor/HTPA60x40dR1L0.9/` 目录中。
## 🎯 升级目标
- **从**HTPAd32x32L1k7 (32x32分辨率1024像素)
- **到**HTPA60x40dR1L0.9/0.8 (60x40分辨率2400像素)
- **提升**分辨率提升134%,更精细的火灾检测能力
## 🔧 硬件准备
### 1. 硬件连接检查
新传感器与旧传感器使用相同的I2C接口
- **SDA引脚**GPIO14
- **SCL引脚**GPIO21
- **电源**3.3V
- **I2C地址**0x1A (传感器), 0x50 (EEPROM)
⚠️ **注意**新传感器功耗约150mA比32x32版本略高确保电源供应充足。
### 2. 物理安装
- 传感器尺寸可能略有不同,检查安装孔位
- 确保传感器视野没有遮挡
- 验证散热条件良好
## 📝 代码修改步骤
### 步骤1主程序文件修改
#### 1.1 修改 `main.cpp` 或主控制文件
**位置**`firefly_esp32/main/main.cpp` (或相应的主文件)
**修改内容**
```cpp
// 原代码 (32x32传感器)
#include "Sensor/HTPAd32x32L1k7/HTPA_Sensor32_2.h"
HTPA32_2 thermal_sensor;
// 修改为 (60x40传感器)
#include "Sensor/HTPA60x40dR1L0.9/HTPA_Sensor60x40.h"
HTPA60x40 thermal_sensor;
```
**或者使用条件编译方式**
```cpp
// 推荐方式:使用条件编译,便于切换测试
#define USE_HTPA60x40 // 新增这一行
#ifdef USE_HTPA60x40
#include "Sensor/HTPA60x40dR1L0.9/HTPA_Sensor60x40.h"
HTPA60x40 thermal_sensor;
#define THERMAL_PIXELS 2400
#define THERMAL_COLS 60
#define THERMAL_ROWS 40
#else
#include "Sensor/HTPAd32x32L1k7/HTPA_Sensor32_2.h"
HTPA32_2 thermal_sensor;
#define THERMAL_PIXELS 1024
#define THERMAL_COLS 32
#define THERMAL_ROWS 32
#endif
```
#### 1.2 修改数据处理逻辑
**查找并修改以下代码段**
```cpp
// 原代码32x32数据处理
uint16_t thermal_data[1024];
if (thermal_sensor.getData(thermal_data, 1024)) {
// 处理1024个像素
}
// 修改为60x40数据处理
uint16_t thermal_data[THERMAL_PIXELS];
if (thermal_sensor.getData(thermal_data, THERMAL_PIXELS)) {
// 处理2400个像素
}
// 或者使用新的API获取温度数据
float thermal_temps[THERMAL_PIXELS];
if (thermal_sensor.getThermalData60x40(thermal_temps)) {
// 直接获取温度值,无需额外转换
}
```
### 步骤2火灾检测算法调整
#### 2.1 修改火灾检测参数
**位置**:查找火灾检测相关的文件 (可能在 `FireDetection.cpp` 或类似文件中)
**需要调整的参数**
```cpp
// 原参数 (32x32)
#define FIRE_DETECTION_GRID_SIZE 32
#define FIRE_DETECTION_PIXELS 1024
#define HOT_SPOT_THRESHOLD_PIXELS 10 // 约1%的像素
// 新参数 (60x40)
#define FIRE_DETECTION_GRID_SIZE_X 60
#define FIRE_DETECTION_GRID_SIZE_Y 40
#define FIRE_DETECTION_PIXELS 2400
#define HOT_SPOT_THRESHOLD_PIXELS 24 // 约1%的像素
```
#### 2.2 优化检测算法
**建议使用降采样方式保持性能**
```cpp
// 方案1使用8x5网格 (40个数据点与32x32接近)
float grid_data[40];
if (thermal_sensor.getThermalGrid8x5(grid_data)) {
// 使用现有的火灾检测算法,数据量相近
fire_detection_algorithm(grid_data, 8, 5);
}
// 方案2使用12x8网格 (96个数据点更精细)
float grid_data[96];
if (thermal_sensor.getThermalGrid12x8(grid_data)) {
// 需要调整算法以适应12x8网格
fire_detection_algorithm_enhanced(grid_data, 12, 8);
}
// 方案3使用区域检测 (推荐用于火灾检测)
float center_temp, edge_temp;
thermal_sensor.getRegionTemperature(20, 15, 20, 10, &center_temp); // 中心区域
thermal_sensor.getRegionTemperature(0, 0, 60, 5, &edge_temp); // 边缘区域
if (center_temp - edge_temp > FIRE_THRESHOLD_DIFF) {
// 检测到可能的火源
}
```
### 步骤3网络传输调整
#### 3.1 修改数据传输格式
**位置**:查找网络传输相关代码 (可能在 `WiFiManager.cpp``DataTransmission.cpp` 中)
**原代码示例**
```cpp
// 32x32数据传输 (2KB)
uint8_t data_buffer[2048];
// 打包1024个像素数据
// 发送到Android应用
send_thermal_data(data_buffer, 2048);
```
**修改为**
```cpp
// 60x40数据传输 (4.8KB) - 可能需要分包或压缩
uint8_t data_buffer[4800];
// 打包2400个像素数据
// 方案1分包传输
send_thermal_data_chunked(data_buffer, 4800, 1200); // 分4包发送
// 方案2发送降采样数据 (推荐)
float grid_data[96]; // 12x8网格
if (thermal_sensor.getThermalGrid12x8(grid_data)) {
send_thermal_grid(grid_data, 12, 8); // 只发送384字节
}
// 方案3只在检测到异常时发送完整数据
if (fire_detected) {
send_full_thermal_data(data_buffer, 4800);
} else {
send_thermal_summary(grid_data, 96);
}
```
### 步骤4Android应用适配
#### 4.1 修改Android端接收代码
**位置**`Smarthome_android/app/src/main/java/com/archesens/android/`
**查找并修改**
```java
// 原代码
private static final int THERMAL_PIXELS = 1024;
private static final int THERMAL_COLS = 32;
private static final int THERMAL_ROWS = 32;
// 修改为
private static final int THERMAL_PIXELS = 2400;
private static final int THERMAL_COLS = 60;
private static final int THERMAL_ROWS = 40;
// 或者支持动态切换
private int thermalPixels = 1024; // 默认值
private int thermalCols = 32;
private int thermalRows = 32;
// 在接收到传感器信息时更新
public void updateSensorInfo(int pixels, int cols, int rows) {
this.thermalPixels = pixels;
this.thermalCols = cols;
this.thermalRows = rows;
}
```
#### 4.2 修改显示界面
**查找热成像显示相关的Activity或Fragment**
```java
// 原代码32x32网格显示
GridView thermalGrid = findViewById(R.id.thermal_grid);
ThermalAdapter adapter = new ThermalAdapter(this, 32, 32);
// 修改为60x40网格显示
GridView thermalGrid = findViewById(R.id.thermal_grid);
ThermalAdapter adapter = new ThermalAdapter(this, 60, 40);
// 或者使用降采样显示
ThermalAdapter adapter = new ThermalAdapter(this, 12, 8); // 显示12x8网格
```
### 步骤5内存配置调整
#### 5.1 修改ESP32内存配置
**位置**`firefly_esp32/sdkconfig` 或通过 `idf.py menuconfig`
**需要调整的配置**
```
# 增加主任务堆栈大小
CONFIG_ESP_MAIN_TASK_STACK_SIZE=8192
# 增加最小堆大小
CONFIG_FREERTOS_HEAP_SIZE_MIN=32768
# 如果使用PSRAM启用PSRAM支持
CONFIG_ESP32_SPIRAM_SUPPORT=y
CONFIG_SPIRAM_USE_MALLOC=y
```
#### 5.2 修改CMakeLists.txt
**位置**`firefly_esp32/main/CMakeLists.txt`
**添加新传感器库**
```cmake
# 原代码
set(COMPONENT_SRCS
"main.cpp"
"Sensor/HTPAd32x32L1k7/HTPA_Sensor32_2.cpp"
# ... 其他文件
)
# 修改为 (或添加)
set(COMPONENT_SRCS
"main.cpp"
"Sensor/HTPA60x40dR1L0.9/HTPA_Sensor60x40.cpp"
"Sensor/HTPA60x40dR1L0.9/htpa60x40_lookuptable.cpp"
# ... 其他文件
)
# 添加包含目录
set(COMPONENT_ADD_INCLUDEDIRS
"."
"Sensor/HTPA60x40dR1L0.9"
# ... 其他目录
)
```
## 🧪 测试验证步骤
### 第1步硬件连接测试
```cpp
// 在main.cpp中添加测试代码
void test_sensor_connection() {
ESP_LOGI("TEST", "Testing HTPA60x40 sensor connection...");
esp_err_t ret = thermal_sensor.init();
if (ret == ESP_OK) {
ESP_LOGI("TEST", "✅ Sensor initialized successfully");
ESP_LOGI("TEST", "Pixels: %d, Cols: %d, Rows: %d",
thermal_sensor.getPixelCount(),
thermal_sensor.getColumnCount(),
thermal_sensor.getRowCount());
} else {
ESP_LOGE("TEST", "❌ Sensor initialization failed: %s", esp_err_to_name(ret));
}
}
```
### 第2步数据读取测试
```cpp
void test_data_reading() {
ESP_LOGI("TEST", "Testing data reading...");
if (thermal_sensor.process()) {
// 测试完整数据读取
float thermal_data[2400];
if (thermal_sensor.getThermalData60x40(thermal_data)) {
ESP_LOGI("TEST", "✅ Full data reading successful");
ESP_LOGI("TEST", "Sample temperatures: %.2f, %.2f, %.2f",
thermal_data[0], thermal_data[1200], thermal_data[2399]);
}
// 测试网格数据读取
float grid_data[40];
if (thermal_sensor.getThermalGrid8x5(grid_data)) {
ESP_LOGI("TEST", "✅ Grid data reading successful");
}
// 测试最热点检测
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("TEST", "✅ Hot spot: %.2f°C at (%d,%d)", hot_temp, hot_x, hot_y);
ESP_LOGI("TEST", "✅ Cold spot: %.2f°C at (%d,%d)", cold_temp, cold_x, cold_y);
}
}
}
```
### 第3步性能测试
```cpp
void test_performance() {
ESP_LOGI("TEST", "Testing performance...");
uint32_t start_time = esp_timer_get_time();
for (int i = 0; i < 10; i++) {
if (thermal_sensor.process()) {
float grid_data[40];
thermal_sensor.getThermalGrid8x5(grid_data);
}
vTaskDelay(pdMS_TO_TICKS(250));
}
uint32_t end_time = esp_timer_get_time();
uint32_t avg_time = (end_time - start_time) / 10;
ESP_LOGI("TEST", "Average processing time: %d ms", avg_time / 1000);
ESP_LOGI("TEST", "Free heap: %d bytes", esp_get_free_heap_size());
}
```
## 🚨 常见问题解决
### 问题1内存不足
**现象**
```
E (xxx) HTPA60x40: Memory allocation failed for 2400 pixels
```
**解决方案**
1. 检查 `sdkconfig` 中的内存配置
2. 使用 `esp_get_free_heap_size()` 监控内存使用
3. 考虑使用PSRAM或优化其他内存使用
### 问题2I2C通信失败
**现象**
```
E (xxx) HTPA60x40: Sensor initialization failed, check connections
```
**解决方案**
1. 检查硬件连接SDA、SCL、电源、地线
2. 使用万用表测试I2C信号
3. 检查I2C地址是否正确 (0x1A)
### 问题3数据处理缓慢
**现象**:系统响应变慢,帧率下降
**解决方案**
1. 使用降采样方法减少数据量
2. 优化算法,避免不必要的计算
3. 考虑使用FreeRTOS任务分离数据处理
### 问题4温度读数异常
**现象**:温度值明显不正确
**解决方案**
1. 检查查找表是否正确加载
2. 验证EEPROM校准数据读取
3. 对比已知温度源进行校准
## 📋 检查清单
### 硬件检查 ✓
- [ ] 传感器正确安装
- [ ] I2C连接正确 (GPIO14/21)
- [ ] 电源供应充足 (3.3V, >150mA)
- [ ] 传感器视野无遮挡
### 代码修改 ✓
- [ ] 主程序包含文件已更新
- [ ] 传感器对象声明已修改
- [ ] 数据处理逻辑已适配
- [ ] 火灾检测算法已调整
- [ ] 网络传输已优化
- [ ] Android应用已适配
### 配置调整 ✓
- [ ] ESP32内存配置已增加
- [ ] CMakeLists.txt已更新
- [ ] 编译配置正确
### 测试验证 ✓
- [ ] 硬件连接测试通过
- [ ] 数据读取测试通过
- [ ] 性能测试满足要求
- [ ] 火灾检测功能正常
- [ ] Android应用显示正常
## 📞 技术支持
### 文档参考
- **传感器技术文档**`firefly_esp32/main/Sensor/HTPA60x40dR1L0.9/README.md`
- **API参考**:查看头文件 `HTPA_Sensor60x40.h`
- **原32x32实现**`firefly_esp32/main/Sensor/HTPAd32x32L1k7/`
### 调试技巧
```cpp
// 启用详细日志
esp_log_level_set("HTPA60x40", ESP_LOG_DEBUG);
// 监控系统状态
ESP_LOGI("DEBUG", "Free heap: %d, Min free: %d",
esp_get_free_heap_size(), esp_get_minimum_free_heap_size());
// 性能监控
uint32_t start = esp_timer_get_time();
// ... 执行代码 ...
uint32_t duration = esp_timer_get_time() - start;
ESP_LOGI("PERF", "Operation took %d ms", duration / 1000);
```
### 联系信息
- **原开发者**fw <kingfun2000@qq.com>
- **项目仓库**查看项目根目录的README文件
- **Heimann技术支持**:参考传感器官方文档
---
## 🎯 总结
新传感器升级主要涉及:
1. **硬件连接**:相同接口,注意功耗
2. **代码修改**:主要是数据量和分辨率的调整
3. **性能优化**:使用降采样保持响应速度
4. **充分测试**:确保所有功能正常工作
**关键提醒**
- 新传感器代码已预先准备好,主要是集成工作
- 建议使用条件编译便于问题时回退到32x32版本
- 重点关注内存使用和处理性能
- 火灾检测算法可能需要重新调优参数
**预计工作量**1-2天完成代码修改1周完成测试验证
---
**文档版本**v1.0
**创建时间**2026年2月26日
**适用版本**ESP32固件v2.1.0+, Android应用v1.0.0+
**作者**fw (离职前准备文档)