单片机GD32F303RCT6 (Macos环境)开发 (二十)—— 光感芯片veml7700的使用

文章详细介绍了如何使用veml77700光感芯片获取环境亮度值,包括寄存器配置、I2C通信函数、数据换算及初始化设置。提供的代码实现了从芯片读取数据并转换为可读的亮度值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

光感芯片veml7700的使用

1、veml有7个寄存器,每个十六位,见图。
在这里插入图片描述
00是config寄存器,
01 02 是中断设置的阈值
03是节能模式的设置
04 是得到的光的亮度值
05是得到的data of whole WHITE
06是中断设置值。
2、我们只测试得到光的亮度值,所以veml寄存器设置如下:
在这里插入图片描述

设置gain,integration time ,power save mode ,interrupt ,power on.
3、数据的换算:
在这里插入图片描述
可以用代码中公式。
在这里插入图片描述
4、代码

#include "gd32f30x.h"
#include "veml7700.h"
#include "i2c.h"
#include <stdio.h>

void veml7700_write(uint8_t reg_addr,uint8_t *p_buf)
{
#if I2C1_MODE == I2C1_MODE_SW
    swi2c_device_write_data(VEML_SLAVE_ADDR,&reg_addr,1,p_buf,2);
#endif
}

void veml7700_read(uint8_t reg_addr,uint8_t *p_buf)
{
#if I2C1_MODE == I2C1_MODE_SW
    swi2c_device_read_data(VEML_SLAVE_ADDR,&reg_addr,1,p_buf,2);
#endif
}

static int get_veml7700_default_value(uint16_t *default_value)
{
    uint8_t rx_data[2] = {0};
    veml7700_read(0x00,rx_data);
    *default_value = ((rx_data[1] << 8) | rx_data[0]);
    return 0;
}

static uint16_t veml7700_get_light_sensor_value(uint8_t command,uint16_t mask,uint8_t shift)
{
    uint8_t rx_data[2] = {0};
    uint16_t r_value = 0;

    veml7700_read(command,rx_data);
    r_value = ((rx_data[1] << 8) | rx_data[0]);
    return (r_value & mask) >> shift;
}

static void veml7700_set_light_sensor_value(uint8_t value,uint8_t command,uint16_t mask,uint8_t shift)
{
    uint8_t rx_data[2] = {0};
    uint8_t tx_data[2] = {0};
    uint16_t r_value = 0;
    uint16_t tmp_value = 0;
    veml7700_read(command,rx_data);
    r_value = ((rx_data[1] << 8) | rx_data[0]);
    tmp_value = r_value & ~(mask);
    tmp_value |= ((value << shift) & mask);

    tx_data[0] = tmp_value & 0xff;
    tx_data[1] = ((tmp_value >> 8) & 0xff); 
    veml7700_write(command,tx_data);
} 

static uint16_t get_power_enable()
{
    return veml7700_get_light_sensor_value(COMMAND_ALS_SD,ALS_SD_MASK,ALS_SD_SHIFT);
}

static void set_power_enable(int enable)
{
    return veml7700_set_light_sensor_value(enable,COMMAND_ALS_SD,ALS_SD_MASK,ALS_SD_SHIFT);
}

static uint16_t get_gain_value()
{
    return veml7700_get_light_sensor_value(COMMAND_ALS_GAIN,ALS_GAIN_MASK,ALS_GAIN_SHIFT);
}

static void set_gain_value(uint16_t gain)
{
    veml7700_set_light_sensor_value(gain,COMMAND_ALS_GAIN,ALS_GAIN_MASK,ALS_GAIN_SHIFT);
}

static uint16_t get_interrupt_enable()
{
    return veml7700_get_light_sensor_value(COMMAND_ALS_INT_EN,ALS_INT_EN_MASK,ALS_INT_EN_SHIFT);
}

static void set_interrupt_enable(uint16_t enable)
{
    veml7700_set_light_sensor_value(enable,COMMAND_ALS_INT_EN,ALS_INT_EN_MASK,ALS_INT_EN_SHIFT);
}

static int get_integration_time() 
{
    return veml7700_get_light_sensor_value(COMMAND_ALS_IT,ALS_IT_MASK,ALS_IT_SHIFT);
   
}

static void set_integration_time(int time)
{
    veml7700_set_light_sensor_value(time,COMMAND_ALS_IT,ALS_IT_MASK,ALS_IT_SHIFT);
}

static int get_power_saving_mode() 
{
    return veml7700_get_light_sensor_value(COMMAND_PSM_EN,PSM_EN_MASK,PSM_EN_SHIFT);
}


static void set_power_saving_mode(int mode)
{
    veml7700_set_light_sensor_value(mode,COMMAND_PSM_EN,PSM_EN_MASK,PSM_EN_SHIFT);
}

static uint16_t get_als_reg_data()
{
    uint8_t rx_data[2] = {0};
    uint16_t r_value = 0;
 
    veml7700_read(COMMAND_ALS_DATA,rx_data);
    r_value = ((rx_data[1] << 8) | rx_data[0]);
    return r_value;
}

static int normalize_resolution(int value)
{
    switch (get_gain_value())
    {

        case ALS_GAIN_X2:
        value /= 2.0;
        break;
        case ALS_GAIN_d4:
            value *= 4;
            break;
        case ALS_GAIN_d8:
            value *= 8;
            break;
        case ALS_GAIN_X1:
        default:break;
        
    }
    switch (get_integration_time()){

        case ALS_INTEGRATION_25ms:
            value *= 4;
            break;
        case ALS_INTEGRATION_50ms:
            value *= 2;
            break;
        case ALS_INTEGRATION_200ms:
            value /= 2.0;
            break;
        case ALS_INTEGRATION_400ms:
            value /= 4.0;
            break;
        case ALS_INTEGRATION_800ms:
            value /= 8.0;
            break;
        case ALS_INTEGRATION_100ms:
        default:break;
    }
    return value;    

} 

int get_lux_data(void)
{
    return normalize_resolution(get_als_reg_data() * 0.0576);
}

void veml7700_init(void)
{
    uint16_t default_value;
    get_veml7700_default_value(&default_value);
 
    if (default_value == 0x0001)
    {
        printf("Have Fined Veml7700!\r\n");
    }
    else
    {
        printf("Veml7700 not exsit %x\r\n",default_value);
        //return ;
    }

    set_power_enable(ALS_POWER_SHUTDOWN);
    printf("get_power_enable %d\r\n",get_power_enable());

    set_interrupt_enable(ALS_INTERRUPT_DISABLE);

    set_gain_value(ALS_GAIN_d8);
    printf("get_gain_value == %d\r\n",get_gain_value());

    set_integration_time(ALS_INTEGRATION_100ms);

    set_power_saving_mode(ALS_POWER_MODE_DISABLE);

    set_power_enable(ALS_POWER_ON);
}

.h 文件

	#ifndef __VEML_7700_H__
	#define __VEML_7700_H__
	
	#define ENABLE_VEML7700  1
	
	#define VEML_SLAVE_ADDR 0x20
	
	#define COMMAND_ALS_DEFAULT_VALUE       0x01  
	// Gain Register
	#define COMMAND_ALS_GAIN                0x00  
	#define ALS_GAIN_MASK                   0x1800  
	#define ALS_GAIN_SHIFT                  11  
	// ALS IT Register
	#define COMMAND_ALS_IT                  0x00  
	#define ALS_IT_MASK                     0x03C0  
	#define ALS_IT_SHIFT                    6  
	// ALS Persistence Register
	#define COMMAND_ALS_PER                 0x00  
	#define ALS_PER_MASK                    0x0030  
	#define ALS_PER_SHIFT                   4  
	// ALS INT EN Register
	#define COMMAND_ALS_INT_EN              0x00  
	#define ALS_INT_EN_MASK                 0x0002  
	#define ALS_INT_EN_SHIFT                1  
	// ALS SD Register
	#define COMMAND_ALS_SD                  0x00  
	 #define ALS_SD_MASK                     0x0001  
	#define ALS_SD_SHIFT                    0  
	// ALS Window High
	#define COMMAND_ALS_WH                  0x01  
	// ALS Window Low
	#define COMMAND_ALS_WL                  0x02  
	// ALS Power Save Mode
	#define COMMAND_PSM                     0x03  
	#define PSM_MASK                        0x0006  
	#define PSM_SHIFT                       1  
	// ALS Power Save Mode Enable
	#define COMMAND_PSM_EN                  0x03  
	#define PSM_EN_MASK                     0x0001  
	#define PSM_EN_SHIFT                    0  
	// ALS High Resolution Output Data
	#define COMMAND_ALS_DATA                0x04  
	//White Channel Output Data
	#define COMMAND_WHITE_DATA              0x05  
	// Interrupt Status
	#define COMMAND_ALS_IF_L                0x06  
	#define ALS_IF_L_MASK                   0x8000  
	#define ALS_IF_L_SHIFT                  15  
	#define COMMAND_ALS_IF_H                0x06  
	#define ALS_IF_H_MASK                   0x4000  
	#define ALS_IF_H_SHIFT                  14  
	
	#define ALS_GAIN_X1                      0x0  
	#define ALS_GAIN_X2                      0x1  
	#define ALS_GAIN_d8                      0x2  
	#define ALS_GAIN_d4                      0x3  
	
	#define ALS_INTEGRATION_25ms             0xC  
	#define ALS_INTEGRATION_50ms             0x8  
	#define ALS_INTEGRATION_100ms            0x0  
	#define ALS_INTEGRATION_200ms            0x1  
	#define ALS_INTEGRATION_400ms            0x2  
	#define ALS_INTEGRATION_800ms            0x3  
	
	#define ALS_PERSISTENCE_1                0x0  
	#define ALS_PERSISTENCE_2                0x1  
	#define ALS_PERSISTENCE_4                0x2  
	#define ALS_PERSISTENCE_8                0x3  
	
	#define ALS_POWER_MODE_1                 0x0  
	#define ALS_POWER_MODE_2                 0x1  
	#define ALS_POWER_MODE_3                 0x2  
	#define ALS_POWER_MODE_4                 0x3  
	
	#define ALS_POWER_MODE_ENABLE            0x1  
	#define ALS_POWER_MODE_DISABLE           0x0  
	
	#define ALS_INTERRUPT_ENABLE             0x1  
	#define ALS_INTERRUPT_DISABLE            0x0  
	
	#define ALS_POWER_ON                     0x0  
	#define ALS_POWER_SHUTDOWN               0x1  
	
	void veml7700_init(void);
	int get_lux_data(void);
	#endif

main函数调用,先调用init函数,然后在while循环中点用get_lux_data函数。
在这里插入图片描述
在这里插入图片描述
5、打印以及现象:
在这里插入图片描述
6、代码路径:https://gitee.com/xiaoguo-tec_0/gd32-iap-code.git

### 关于VEML7700器的详细参数 VEML7700 是一款高精度环境数字16位分辨率传器,其设计用于精确测量不同环境下的线强度。该设备具有广泛的探测范围(从 0 lx 到 120 klx),分辨率为 0.0036 lx/count[^3]。 #### 主要特性 - **封装尺寸**: 微型透明封装 (6.8 mm × 2.35 mm × 3.0 mm)[^4]。 - **电二极管**: 高灵敏度电二极管集成在芯片内部。 - **放大器**: 内置低噪声放大器以提高信号质量。 - **A/D 转换器**: 支持高达 16 位的模数转换能力。 - **通信接口**: 提供 I²C 总线接口以便于与其他微控制器连接。 - **工作电压**: 工作电压范围为 2.7 V 至 5.5 V。 #### 探测性能 - 测量范围覆盖从完全黑暗条件至强烈阳直射情况下的亮度水平。 - 可配置不同的增益设置来适应各种照场景需求,例如室内弱或室外强日条件下均能保持良好表现。 --- ### VEML7700 的典型应用方法 为了实现对 VEML7700 的有效控制并获取准确的数据读取结果,通常需要遵循以下几个方面: #### 初始化过程 通过 I²C 协议向寄存器写入特定命令字节完成初始化操作。具体来说,可以通过修改 ALS_CONF 寄存器中的字段定义采样频率以及积分时间等参数值。 以下是基于 Arduino 平台的一个简单示例程序片段展示如何启动 VEML7700 进行基本功能测试: ```cpp #include <Wire.h> #define VEML7700_ADDR 0x10 // 设备地址 void setup() { Wire.begin(); // 初始化I2C库 Serial.begin(9600); // 开启串口调试 // 设置ALS模式开启, 默认增益和积分周期 writeRegister(VEML7700_ADDR, 0x00, 0b00000001); } uint16_t readLightLevel(){ uint16_t highByte, lowByte; Wire.requestFrom((int)VEML7700_ADDR, 2); while(Wire.available()) { highByte = Wire.read(); lowByte = Wire.read(); } return ((highByte << 8 ) | lowByte ); } void loop() { uint16_t lightValue = readLightLevel(); float lux = calculateLux(lightValue); Serial.print("Ambient Light Level: "); Serial.println(lux); delay(1000); } float calculateLux(uint16_t raw){ const float sensitivityFactor = 0.0036; // 分辨率因子 return raw * sensitivityFactor; } // 辅助函数:写入指定寄存器 void writeRegister(int deviceAddress, int regAddr, byte value){ Wire.beginTransmission(deviceAddress); Wire.write(regAddr); Wire.write(value); Wire.endTransmission(); } ``` 上述代码实现了如下功能: 1. 向 VEML7700 发送指令使其进入 ALS 模式; 2. 定期查询当前环境照度数值并通过串口打印出来。 注意,在实际项目开发过程中可能还需要考虑更多细节问题比如电源管理策略或者抗干扰措施等等。 --- ###
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值