主要更改: 1. 新增使用手册: - AI算法更新指南 - HTPA60x40传感器升级指南 - 环境配置教程 2. 传感器模块优化: - HTPA60x40dR1L0.9传感器集成 - HTPAd32x32L1k7传感器更新 - 传感器配置文档完善 3. 项目文档整理: - 删除过期的433MHz使用指南 - 更新README文档结构 - 完善配置教程链接 目标:完善项目文档,优化传感器集成
156 lines
4.9 KiB
C++
156 lines
4.9 KiB
C++
#ifndef HTPA60x40_H
|
||
#define HTPA60x40_H
|
||
|
||
#include "../../Module/Timer.h"
|
||
#include "../../Module/Wire.h"
|
||
#include "HTPA60x40dR1L0.9.h"
|
||
#include <stdint.h>
|
||
#include <stdbool.h>
|
||
|
||
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
|