#ifndef HTPA60x40_H #define HTPA60x40_H #include "../../Module/Timer.h" #include "../../Module/Wire.h" #include "HTPA60x40dR1L0.9.h" #include #include typedef struct { uint16_t NumberOfPixel; uint8_t NumberOfBlocks; uint8_t RowPerBlock; uint16_t PixelPerBlock; uint16_t PixelPerColumn; uint16_t PixelPerRow; uint8_t AllowedDeadPix; uint16_t TableNumber; uint16_t TableOffset; uint8_t PTATPos; uint8_t VDDPos; uint8_t PTATVDDSwitch; uint8_t CyclopsActive; uint8_t CyclopsPos; uint8_t DataPos; } HTPA60x40_Characteristics; class HTPA60x40 { private: // I2C配置 i2c_port_t _i2c_port; gpio_num_t _sda_pin; gpio_num_t _scl_pin; // 传感器特性 HTPA60x40_Characteristics _dev_const; // EEPROM数据 uint8_t mbit_calib, bias_calib, clk_calib, bpa_calib, pu_calib; uint8_t mbit_user, bias_user, clk_user, bpa_user, pu_user; uint8_t nrofdefpix, gradscale, vddscgrad, vddscoff, epsilon, lastepsilon, arraytype; uint8_t deadpixmask[ALLOWED_DEADPIX_60x40]; int8_t globaloff; int16_t thgrad[PIXEL_PER_COLUMN_60x40][PIXEL_PER_ROW_60x40]; uint16_t tablenumber, vddth1, vddth2, ptatth1, ptatth2, ptatgr, globalgain; uint16_t deadpixadr[ALLOWED_DEADPIX_60x40 * 2]; int16_t thoffset[PIXEL_PER_COLUMN_60x40][PIXEL_PER_ROW_60x40]; int16_t vddcompgrad[ROW_PER_BLOCK_60x40 * 2][PIXEL_PER_ROW_60x40]; int16_t vddcompoff[ROW_PER_BLOCK_60x40 * 2][PIXEL_PER_ROW_60x40]; uint32_t id; float ptatgr_float, ptatoff_float, pixcmin, pixcmax; // 像素常量(使用动态分配) uint32_t *_pixc2_0; uint32_t *_pixc2; // 传感器数据 uint16_t data_pixel[PIXEL_PER_COLUMN_60x40][PIXEL_PER_ROW_60x40]; uint8_t RAMoutput[2 * NUMBER_OF_BLOCKS_60x40 + 2][BLOCK_LENGTH_60x40]; uint16_t eloffset[ROW_PER_BLOCK_60x40 * 2][PIXEL_PER_ROW_60x40]; uint8_t statusreg; uint16_t Ta, ptat_av_uint16, vdd_av_uint16; // 缓冲区 uint16_t ptat_buffer[PTAT_BUFFER_SIZE_60x40]; uint16_t ptat_buffer_average; uint8_t use_ptat_buffer = 0; uint8_t ptat_i = 0; uint8_t PTATok = 0; uint16_t vdd_buffer[VDD_BUFFER_SIZE_60x40]; uint16_t vdd_buffer_average; uint8_t use_vdd_buffer = 0; uint8_t vdd_i = 0; uint8_t use_eloffsets_buffer = 0; uint8_t eloffsets_i = 0; uint8_t new_offsets = 1; // 程序控制变量 bool switch_ptat_vdd = 0; uint8_t adr_offset = 0x00; uint16_t picnum = 0; uint8_t state = 0; uint8_t read_block_num = START_WITH_BLOCK_60x40; uint8_t read_eloffset_next_pic = 0; bool ReadingRoutineEnable = 1; // 其他参数 uint32_t gradscale_div; uint32_t vddscgrad_div; uint32_t vddscoff_div; int vddcompgrad_n; int vddcompoff_n; // 定时器 uint16_t timert; Timer timer; bool _new_data_available = true; // 私有函数 uint8_t write_sensor_byte(uint8_t registeraddress, uint8_t input); void read_sensor_register(uint8_t addr, uint8_t *dest, uint16_t n); uint8_t read_EEPROM_byte(uint16_t address); uint8_t write_EEPROM_byte(uint16_t address, uint8_t content); void read_eeprom(); void write_calibration_settings_to_sensor(); void calcPixC(); uint16_t calc_timert(uint8_t clk, uint8_t mbit); void pixel_masking(); void readblockinterrupt(); void sort_data(); void calculate_pixel_temp(); // 定时器回调函数 static void timer_callback(void* arg); public: // 构造函数和析构函数 HTPA60x40(); ~HTPA60x40(); // 初始化函数 esp_err_t init(); bool process(); // 数据获取函数 bool getData(uint16_t* data, int size); uint16_t get_ambient_temperature(); // 获取热成像数据(60x40分辨率) bool getThermalData60x40(float* thermal_data); // 获取降采样的热成像数据(用于兼容性和性能优化) bool getThermalGrid8x5(float* grid_temps); // 8x5网格,每个网格代表7.5x8像素的平均值 bool getThermalGrid12x8(float* grid_temps); // 12x8网格,每个网格代表5x5像素的平均值 // 获取指定区域的平均温度 bool getRegionTemperature(uint8_t start_x, uint8_t start_y, uint8_t width, uint8_t height, float* avg_temp); // 获取最热点和最冷点 bool getHotColdSpots(float* hot_temp, uint8_t* hot_x, uint8_t* hot_y, float* cold_temp, uint8_t* cold_x, uint8_t* cold_y); // 定时器控制(用于避免I2C冲突) void pauseTimer() { timer.stop(); } void resumeTimer() { timer.start(timert); } // 获取传感器信息 uint16_t getPixelCount() { return NUMBER_OF_PIXEL_60x40; } uint8_t getColumnCount() { return PIXEL_PER_COLUMN_60x40; } uint8_t getRowCount() { return PIXEL_PER_ROW_60x40; } }; #endif // HTPA60x40_H