smart-home/firefly_esp32/main/Sensor/HTPA60x40dR1L0.9/HTPA_Sensor60x40.h
小羊肉肉. 0548c1555f 更新项目文档和传感器模块
主要更改:
1. 新增使用手册:
   - AI算法更新指南
   - HTPA60x40传感器升级指南
   - 环境配置教程

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

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

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

156 lines
4.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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