4.3 读取BH1750测量结果
BH1750返回两字节的测量结果数据
/*
*==============================================================================
*函数名称:Drv_Bh1750_Read_Measure
*函数功能:读取BH1750测量数据
*输入参数:无
*返回值:0:读取失败;其他:光照强度
*备 注:无
*==============================================================================
*/
u16 Drv_Bh1750_Read_Measure (void)
{
u16 receData = 0;
I2C_Start();
// 发送从设备地址,1:读
Send_Byte(BH1750_Addr | 1);
if(I2C_WaitAck() == 1)
{
return 0;
}
// 读取高八位
receData = IIC_Read_Byte();
IIC_Ack();
// 读取低八位
receData = (receData << 8) + IIC_Read_Byte();
IIC_NAck();
I2C_Stop();
return receData; // 返回读取到的数据
}
复制代码
4.4 获取光照强度
/*
*==============================================================================
*函数名称:Med_Bh1750_GetLightIntensity
*函数功能:获取光照强度
*输入参数:无
*返回值:光照强度
*备 注:分辨率 光照强度(单位lx)=(High Byte + Low Byte)/ 1.2 * 测量精度
*==============================================================================
*/
float Med_Bh1750_GetLightIntensity (void)
{
return (float)(Drv_Bh1750_Read_Measure() / 1.1f * Resolurtion); //返回测量光照强度
}
复制代码
4.5 相关宏定义
// BH1750的地址(ADDR=“H”)
#define BH1750_Addr 0x46
// BH1750指令
#define POWER_OFF 0x00
#define POWER_ON 0x01
#define MODULE_RESET 0x07
#define CONTINUE_H_MODE 0x10
#define CONTINUE_H_MODE2 0x11
#define CONTINUE_L_MODE 0x13
#define ONE_TIME_H_MODE 0x20
#define ONE_TIME_H_MODE2 0x21
#define ONE_TIME_L_MODE 0x23
//测量模式
#define Measure_Mode CONTINUE_H_MODE
//分辨率 光照强度(单位lx)=(High Byte + Low Byte)/ 1.2 * 测量精度
#if ((Measure_Mode == CONTINUE_H_MODE2)|(Measure_Mode == ONE_TIME_H_MODE2))
#define Resolurtion 0.5
#elif ((Measure_Mode == CONTINUE_H_MODE)|(Measure_Mode == ONE_TIME_H_MODE))
#define Resolurtion 1
#elif ((Measure_Mode == CONTINUE_L_MODE)|(Measure_Mode == ONE_TIME_L_MODE))
#define Resolurtion 4
#endif
// SCL
#define BH1750_SCL_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_6)
#define BH1750_SCL_Set() GPIO_SetBits(GPIOB,GPIO_Pin_6)
// SDA
#define BH1750_SDA_Clr() GPIO_ResetBits(GPIOB,GPIO_Pin_7)
#define BH1750_SDA_Set() GPIO_SetBits(GPIOB,GPIO_Pin_7)
// 读取SDA电平
#define BH1750_SDA_DATA() GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_7)
复制代码
五、应用实例
使用串口打印光照强度,main函数如下
float gLingtIntensity = 0;
int main(void)
{
Med_Mcu_Iint(); // 系统初始化
while(1)
{
gLingtIntensity = Med_Bh1750_GetLightIntensity(); // 获取光照强度
printf ("Light:%.1f lx",gLingtIntensity); // 串口打印光照强度
delay_ms(500); //延时500ms = 0.5s
}
}
复制代码
六、拓展应用
利用BH1750获取到的周围环境光强可用于许多方面,这里举几个例子,比如设计一个教室灯光控制系统,根据实际环境光强来调节灯光亮度,使室内环境光强保持在一个稳定的值。另外,比如做颜色识别时,周围环境的光照强度不同,识别的效果也不同。可以利用BH1750实时监测周围环境光照强度变化,不同的光照强度下,切换不同的颜色阈值,可以改善颜色识别的效果。这里简单介绍一下实现思路。
6.1 实时调节LED亮度
可以用PWM来控制LED的亮度。根据周围环境的光照强度的变化,实时调节PWM的占空比,达到LED亮度根据周围环境光照强度变化而变化的效果。但是需要注意光照强度与占空比的换算关系。
6.2 实时调整颜色阈值
比如使用Open MV做颜色是别时,在不同光照强度下,同一种颜色的颜色阈值不同,可以根据不同的光照强度,匹配不同的颜色阈值。
|