一、代码实现
上一篇已经对Vishay环境光传感器VEML4031X00进行了基本原理介绍。
接下来将根据前面介绍的这些点来编程实现对VEML4031X00传感器的配置,然后读取传感器检测到的亮度值,并根据亮度值控制LED(模拟显示屏的背光)。
1、初始化I2C
设置I2C的通讯波特率为标准模式100kHz,这里主要是配置MCU主机的I2C外设,不涉及到对VEML4031X00传感器的操作。
void I2C_Init(void)
{
/*
* masterConfig.debugEnable = false;
* masterConfig.ignoreAck = false;
* masterConfig.pinConfig = kI2C_2PinOpenDrain;
* masterConfig.baudRate_Bps = 100000U;
* masterConfig.busIdleTimeout_ns = 0;
* masterConfig.pinLowTimeout_ns = 0;
* masterConfig.sdaGlitchFilterWidth_ns = 0;
* masterConfig.sclGlitchFilterWidth_ns = 0;
*/
I2C_MasterGetDefaultConfig(&masterConfig);
/* Change the default baudrate configuration */
masterConfig.baudRate_Bps = I2C_BAUDRATE;
/* Initialize the I2C master peripheral */
I2C_MasterInit(I2C_MASTER, &masterConfig, I2C_MASTER_CLOCK_FREQUENCY);
}bashccppcsharpcssdiffgographqlinijavajavascriptjsonkotlinluamakefilemarkdownobjectivecperlphpphp-templateplaintextpythonpython-replrrubyrustscssshellsqlswifttypescriptxmlyamlwasm
2、读取传感器ID CODE
前面讲到了VEML4031X00传感器的固定的ID code为0x0001,这个是传感器出厂时设置好的。如果读出来的ID CODE是对的,说明MCU与VEML4031X00传感器的通讯正常。可以进行下一步操作了。
// Check device ID
VEML_Read(CMD_DEV_ID_L, &data);
if (data != 0x0001)
{
PRINTF("Decice ID is incorrect\r\n");
}bashccppcsharpcssdiffgographqlinijavajavascriptjsonkotlinluamakefilemarkdownobjectivecperlphpphp-templateplaintextpythonpython-replrrubyrustscssshellsqlswifttypescriptxmlyamlwasm
3、配置VEML4031X00
首先开启传感器,因为上电默认为shutdown模式,传感器不工作,需要启动,然后传感器才工作。其次,设置积分时间为100ms,积分时间约大,传感器的分辨率越高,最高可设置为0.0026lx/cnt。接着将gain设置为2X,最后设置为4/4P模式。
// Read default data
if (VEML_Read(CMD_ALS_CONF_0, &data) != 0)
{
PRINTF("Read data failed\r\n");
}
PRINTF("Read data:0x%x\r\n", data);
// turn the sensor on
data &= ~((1<<0)|(1<<15));
// set integration time to 100ms
data |= (ALS_IT_100MS<<4);
// set gain to 2x
data |= (ALS_GAIN_2X<<11);
// set photodiode size to 4/4PD
data &= ~(1<<14);
PRINTF("Config:0x%x\r\n", data);
if (VEML_Write(CMD_ALS_CONF_0, &data) != 0)
{
PRINTF("Write data failed\r\n");
}bashccppcsharpcssdiffgographqlinijavajavascriptjsonkotlinluamakefilemarkdownobjectivecperlphpphp-templateplaintextpythonpython-replrrubyrustscssshellsqlswifttypescriptxmlyamlwasm
4、根据cnt(step)值控制LED
在while中循环读取ALS的step(cnt)值,然后乘以分辨率就得到了实际的亮度值,再通过亮度值去决定是否点亮LED。(TIPS:分辨率与配置的对应关系表可以查看官方的datasheet)
while (1)
{
if (VEML_Read(CMD_ALS_DATA_L, &data) != 0)
{
PRINTF("Read ALS_DATA failed\r\n");
}
uint16_t alS = data * 0.0103;
PRINTF("step:%d, ALS:%d\r\n", data, als);
if (alt >200)
{
led_on();
}
else
{
led_off();
}
SysTick_DelayTicks(200);
} bashccppcsharpcssdiffgographqlinijavajavascriptjsonkotlinluamakefilemarkdownobjectivecperlphpphp-templateplaintextpythonpython-replrrubyrustscssshellsqlswifttypescriptxmlyamlwasm
二、视频演示
三、源代码
源代码是基于NXP FRDM-RW612开发板编写的代码,想移植到其它MCU平台其实也是非常容易的。
lpc_i2c_polling_b2b_master.doc (1.6 MB)
(下载后将doc后缀修改为zip,然后解压即可得到所有源代码)
四、总结
VEML4031X00传感器的使用并不复杂,寄存器也不多,大部分的内容还是很容易理解的,但是datasheet上有几个地方不太明白怎么用,比如IR的用处是什么呢?另外,还有中断是怎么用的呢,因为没有单独的中断引脚,还是得通过I2C去查询中断标志吗?那这个中断的意义在哪里呢?文档中对这些描述不是很多,不太理解,希望能够在datasheet中做简单的解释。不管怎么样,总的来说还是非常不错的,而且是车规级的,安全性没得说,建议在项目中使用。