# 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, ¢er_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); } ``` ### 步骤4:Android应用适配 #### 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或优化其他内存使用 ### 问题2:I2C通信失败 **现象**: ``` 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 - **项目仓库**:查看项目根目录的README文件 - **Heimann技术支持**:参考传感器官方文档 --- ## 🎯 总结 新传感器升级主要涉及: 1. **硬件连接**:相同接口,注意功耗 2. **代码修改**:主要是数据量和分辨率的调整 3. **性能优化**:使用降采样保持响应速度 4. **充分测试**:确保所有功能正常工作 **关键提醒**: - 新传感器代码已预先准备好,主要是集成工作 - 建议使用条件编译,便于问题时回退到32x32版本 - 重点关注内存使用和处理性能 - 火灾检测算法可能需要重新调优参数 **预计工作量**:1-2天完成代码修改,1周完成测试验证 --- **文档版本**:v1.0 **创建时间**:2026年2月26日 **适用版本**:ESP32固件v2.1.0+, Android应用v1.0.0+ **作者**:fw (离职前准备文档)