smart-home/使用手册/后续调整修改部分/HTPA60x40传感器升级指南.md

472 lines
13 KiB
Markdown
Raw Normal View History

# 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 (离职前准备文档)