3.环境光传感器
·
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, ®, 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读取一次
}
}
四、注意事项
- 接近数据与距离的关系:VCNL4040的接近数据是相对值,需实际校准(例如:距离10cm对应数据约500,距离5cm对应数据约1000)。
- LED电流配置:可通过
VCNL4040_PS_CONF2寄存器调整LED电流(0x00=200mA,0x01=100mA等),电流越大检测距离越远。 - 测量周期:默认是单次测量,若需连续测量,可配置
VCNL4040_PS_CONF1的周期模式。
更多推荐





所有评论(0)