VCNL4040是集成了接近传感器(PS)+环境光传感器(ALS)的I²C接口器件,在STM32上通过I²C通信即可读取其接近距离和环境光数据。

一、传感器基础信息

  • 通信协议:I²C(默认地址0x60
  • 供电电压:2.5~3.6V(可直接用STM32的3.3V供电)
  • 功能:支持接近检测(最大200mm)、环境光检测(0.01~160k lux)

二、硬件接线(以STM32F103为例)

传感器引脚

连接STM32引脚

说明

VDD

3.3V

传感器供电

GND

GND

共地

SDA

PB7(I2C1_SDA)

I²C数据引脚(可自定义)

SCL

PB6(I2C1_SCL)

I²C时钟引脚(可自定义)

PS_LED

无需额外接线(内部集成LED)

接近检测的红外LED内置

三、软件配置(HAL库示例)

1. 初始化I²C外设

通过STM32CubeMX配置I²C(时钟频率设为100kHz),生成代码后添加传感器驱动。

2. VCNL4040驱动函数
#include "stm32f1xx_hal.h"
#include <stdint.h>

#define VCNL4040_ADDR 0x60 << 1  // I²C地址(7位地址左移1位)
I2C_HandleTypeDef hi2c1;

// VCNL4040寄存器地址
#define VCNL4040_PS_CONF1   0x03  // 接近传感器配置1
#define VCNL4040_PS_CONF2   0x04  // 接近传感器配置2
#define VCNL4040_PS_DATA    0x08  // 接近传感器数据(16位)
#define VCNL4040_ALS_DATA   0x09  // 环境光传感器数据(16位)


// I²C写寄存器
uint8_t vcnl4040_write_reg(uint8_t reg, uint8_t data) {
    uint8_t buf[2] = {reg, data};
    return HAL_I2C_Master_Transmit(&hi2c1, VCNL4040_ADDR, buf, 2, 100) == HAL_OK ? 0 : 1;
}

// I²C读寄存器(16位数据)
uint8_t vcnl4040_read_reg16(uint8_t reg, uint16_t *data) {
    uint8_t buf[2];
    if (HAL_I2C_Master_Transmit(&hi2c1, VCNL4040_ADDR, &reg, 1, 100) != HAL_OK) {
        return 1;
    }
    if (HAL_I2C_Master_Receive(&hi2c1, VCNL4040_ADDR, buf, 2, 100) != HAL_OK) {
        return 2;
    }
    *data = (buf[0] << 8) | buf[1];
    return 0;
}

// 初始化VCNL4040
uint8_t vcnl4040_init(void) {
    // 配置接近传感器:启用LED、设置周期测量模式
    if (vcnl4040_write_reg(VCNL4040_PS_CONF1, 0x08) != 0) { // PS_EN=1,启动接近检测
        return 1;
    }
    // 配置LED电流(默认200mA)
    if (vcnl4040_write_reg(VCNL4040_PS_CONF2, 0x00) != 0) {
        return 2;
    }
    return 0;
}

// 读取接近传感器数据(数值越大,距离越近)
uint8_t vcnl4040_read_ps(uint16_t *ps_data) {
    return vcnl4040_read_reg16(VCNL4040_PS_DATA, ps_data);
}

// 读取环境光传感器数据(单位:lux)
uint8_t vcnl4040_read_als(float *als_lux) {
    uint16_t als_raw;
    if (vcnl4040_read_reg16(VCNL4040_ALS_DATA, &als_raw) != 0) {
        return 1;
    }
    // 转换为lux(VCNL4040的转换系数:1 count ≈ 0.01 lux)
    *als_lux = als_raw * 0.01f;
    return 0;
}

3. 主函数中调用
int main(void) {
    HAL_Init();
    SystemClock_Config();
    MX_I2C1_Init(); // 初始化I²C
    
    uint16_t ps_val;
    float als_val;
    
    if (vcnl4040_init() != 0) {
        printf("VCNL4040初始化失败\r\n");
        while(1);
    }

    while (1) {
        // 读取接近数据
        if (vcnl4040_read_ps(&ps_val) == 0) {
            printf("接近传感器数据:%d\r\n", ps_val);
        }
        // 读取环境光数据
        if (vcnl4040_read_als(&als_val) == 0) {
            printf("环境光强度:%.2f lux\r\n", als_val);
        }
        
        HAL_Delay(500); // 500ms读取一次
    }
}

四、注意事项

  1. 接近数据与距离的关系:VCNL4040的接近数据是相对值,需实际校准(例如:距离10cm对应数据约500,距离5cm对应数据约1000)。
  2. LED电流配置:可通过VCNL4040_PS_CONF2寄存器调整LED电流(0x00=200mA,0x01=100mA等),电流越大检测距离越远。
  3. 测量周期:默认是单次测量,若需连续测量,可配置VCNL4040_PS_CONF1的周期模式。

Logo

更多推荐