Rdzleo 93f0e19d1d 初始化项目:精灵吊坠 RTC 语音助手 + VEML7700 石头同频匹配
ESP32-S3 吊坠设备固件,集成火山引擎 RTC 语音助手、蓝牙配网、
VEML7700 环境光传感器驱动及石头同频匹配交友功能。

VEML7700 驱动:
- 基于 ESP-IDF i2c_master API 实现,复用项目 I2cDevice 基类
- 支持 ALS + White 双通道、自动量程、Vishay 非线性校正
- 3 次采样取中位数过滤偶发异常

石头同频匹配算法(双维度):
- 维度1:光谱比值 ALS/White(石头固有光学特征,不随光照强度变化)
- 维度2:亮度等级(5级对数划分,排除极端环境差异)
- 比值阈值 15%,实测同石头姿势变化波动 1.6%~9.6%,安全余量充足

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-01 11:43:57 +08:00

159 lines
5.4 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 VEML7700_H
#define VEML7700_H
#include "i2c_device.h"
#include "esp_log.h"
#include <cstdint>
// VEML7700 I2C地址7-bit
#define VEML7700_I2C_ADDR 0x10
// VEML7700 寄存器地址(命令码)
#define VEML7700_REG_ALS_CONF 0x00 // ALS配置寄存器
#define VEML7700_REG_ALS_WH 0x01 // 高阈值窗口设置
#define VEML7700_REG_ALS_WL 0x02 // 低阈值窗口设置
#define VEML7700_REG_PSM 0x03 // 省电模式配置
#define VEML7700_REG_ALS 0x04 // ALS数据输出寄存器
#define VEML7700_REG_WHITE 0x05 // 白光通道数据输出寄存器
#define VEML7700_REG_ALS_INT 0x06 // 中断状态寄存器
// 增益设置ALS_CONF[12:11]
typedef enum {
VEML7700_GAIN_1 = 0x00, // 增益 x1
VEML7700_GAIN_2 = 0x01, // 增益 x2
VEML7700_GAIN_D8 = 0x02, // 增益 x(1/8)
VEML7700_GAIN_D4 = 0x03, // 增益 x(1/4)
} veml7700_gain_t;
// 积分时间设置ALS_CONF[9:6]
typedef enum {
VEML7700_IT_25MS = 0x0C, // 25ms
VEML7700_IT_50MS = 0x08, // 50ms
VEML7700_IT_100MS = 0x00, // 100ms默认
VEML7700_IT_200MS = 0x01, // 200ms
VEML7700_IT_400MS = 0x02, // 400ms
VEML7700_IT_800MS = 0x03, // 800ms
} veml7700_it_t;
// 持续保护次数设置ALS_CONF[5:4]
typedef enum {
VEML7700_PERS_1 = 0x00, // 1次
VEML7700_PERS_2 = 0x01, // 2次
VEML7700_PERS_4 = 0x02, // 4次
VEML7700_PERS_8 = 0x03, // 8次
} veml7700_pers_t;
// 省电模式设置PSM[2:1]
typedef enum {
VEML7700_PSM_1 = 0x00, // 模式1刷新700ms @ IT=100ms
VEML7700_PSM_2 = 0x01, // 模式2刷新1100ms @ IT=100ms
VEML7700_PSM_3 = 0x02, // 模式3刷新1800ms @ IT=100ms
VEML7700_PSM_4 = 0x03, // 模式4刷新3400ms @ IT=100ms
} veml7700_psm_t;
// VEML7700 读取数据结构
typedef struct {
uint16_t als_raw; // ALS原始计数值
uint16_t white_raw; // 白光通道原始计数值
float als_lux; // ALS计算后的Lux值
float white_lux; // 白光通道计算后的Lux值
} veml7700_data_t;
// 自动量程测量结果(包含最终使用的增益和积分时间)
typedef struct {
float lux; // 校正后的Lux值
uint16_t raw; // 最终原始计数值
veml7700_gain_t gain; // 自动选择的增益
veml7700_it_t it; // 自动选择的积分时间
} veml7700_auto_data_t;
class VEML7700 : public I2cDevice {
public:
VEML7700(i2c_master_bus_handle_t i2c_bus, uint8_t addr = VEML7700_I2C_ADDR);
~VEML7700() = default;
// 初始化传感器,配置默认参数
esp_err_t Init();
// 配置增益
esp_err_t SetGain(veml7700_gain_t gain);
veml7700_gain_t GetGain() const { return gain_; }
// 配置积分时间
esp_err_t SetIntegrationTime(veml7700_it_t it);
veml7700_it_t GetIntegrationTime() const { return it_; }
// 配置持续保护次数
esp_err_t SetPersistence(veml7700_pers_t pers);
// 省电模式
esp_err_t SetPowerSaving(veml7700_psm_t mode, bool enable);
// 中断使能/禁用
esp_err_t SetInterruptEnable(bool enable);
// 设置中断阈值
esp_err_t SetThresholdHigh(uint16_t threshold);
esp_err_t SetThresholdLow(uint16_t threshold);
// 关机/唤醒
esp_err_t Shutdown(bool sd);
// 读取原始数据
esp_err_t ReadALSRaw(uint16_t* raw);
esp_err_t ReadWhiteRaw(uint16_t* raw);
// 读取Lux值带非线性校正
esp_err_t ReadALSLux(float* lux);
esp_err_t ReadWhiteLux(float* lux);
// 一次性读取所有数据
esp_err_t ReadAll(veml7700_data_t* data);
// 读取中断状态
esp_err_t ReadInterruptStatus(bool* high_triggered, bool* low_triggered);
// 获取当前配置下的采样等待时间ms
uint32_t GetSampleDelayMs() const;
// ---- 自动量程接口 ----
// 自动调节增益和积分时间,在任意光照条件下获取最优测量结果
// 强光下自动降低灵敏度避免溢出,弱光下自动提高灵敏度获得精度
// 注意此函数会修改当前增益和积分时间设置且耗时较长最长约5秒
esp_err_t ReadAutoALSLux(veml7700_auto_data_t* result);
esp_err_t ReadAutoWhiteLux(veml7700_auto_data_t* result);
// 自动量程一次性读取ALS和White双通道
esp_err_t ReadAutoAll(veml7700_auto_data_t* als_result, veml7700_auto_data_t* white_result);
private:
veml7700_gain_t gain_;
veml7700_it_t it_;
veml7700_pers_t pers_;
bool int_enable_;
bool shutdown_;
uint16_t als_conf_; // 缓存的ALS配置寄存器值
// 16-bit 寄存器读写VEML7700使用16-bit寄存器
esp_err_t WriteReg16(uint8_t cmd, uint16_t value);
esp_err_t ReadReg16(uint8_t cmd, uint16_t* value);
// 更新ALS配置寄存器
esp_err_t UpdateALSConf();
// 根据当前增益和积分时间计算分辨率
float GetResolution() const;
// 非线性校正高Lux值时的多项式补偿
float CorrectLux(float lux) const;
// 自动量程内部实现(通道类型由读取函数指针区分)
typedef esp_err_t (VEML7700::*ReadRawFunc)(uint16_t* raw);
esp_err_t AutoRangeMeasure(ReadRawFunc read_func, veml7700_auto_data_t* result);
// 应用增益和积分时间并等待采样完成
esp_err_t ApplyConfigAndWait(veml7700_gain_t gain, veml7700_it_t it);
};
#endif // VEML7700_H