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

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

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

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

13 KiB
Raw Blame 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 (或相应的主文件)

修改内容

// 原代码 (32x32传感器)
#include "Sensor/HTPAd32x32L1k7/HTPA_Sensor32_2.h"
HTPA32_2 thermal_sensor;

// 修改为 (60x40传感器)
#include "Sensor/HTPA60x40dR1L0.9/HTPA_Sensor60x40.h"
HTPA60x40 thermal_sensor;

或者使用条件编译方式

// 推荐方式:使用条件编译,便于切换测试
#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 修改数据处理逻辑

查找并修改以下代码段

// 原代码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 或类似文件中)

需要调整的参数

// 原参数 (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 优化检测算法

建议使用降采样方式保持性能

// 方案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.cppDataTransmission.cpp 中)

原代码示例

// 32x32数据传输 (2KB)
uint8_t data_buffer[2048];
// 打包1024个像素数据

// 发送到Android应用
send_thermal_data(data_buffer, 2048);

修改为

// 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/

查找并修改

// 原代码
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

// 原代码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

添加新传感器库

# 原代码
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步硬件连接测试

// 在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步数据读取测试

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步性能测试

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/

调试技巧

// 启用详细日志
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 (离职前准备文档)