BH1750是用于I2C总线接口的数字环境光传感器IC。该集成电路适合于获取环境光数据,用于调整手机液晶屏和键盘背光功率,在高分辨率下,其检测范围可达1-655351x。
其之所以具有如此的精度,是因为它内置了16 bitA/D转换器。此外,它采用直接的数字式输出,省取了略复杂的计算和标定处理。其分辨精度可达1勒克斯。
勒克斯是光照度单位,是指被光均匀照射的物体,在1平方米面积上得到的光通量是1流明时,其照度就是1勒克斯。

图1 块外观
该模块的基本参数见图2所示,其引脚作用如图3所示。

图2 基本参数

图3 引脚作用
在检测时,它与开发板的连接关系为:
SCL---PIN_62
SDA---PIN_61
为此在 VE文件中所建立的映射关系如下:
GPIO5_0 PIN_62 #CLK
GPIO5_1 PIN_61 #SDA
为便于提供高低电平的输出,所定义的语句为:
#define SCL_Set() GPIO_SetHigh(GPIO5,GPIO_BIT0)
#define SCL_Clr() GPIO_SetLow(GPIO5,GPIO_BIT0)
#define SDA_Set() GPIO_SetHigh(GPIO5,GPIO_BIT1)
#define SDA_Clr() GPIO_SetLow(GPIO5,GPIO_BIT1)
#define IIC_SDA_IN GPIO_GetValue(GPIO5,GPIO_BIT1)
#define IIC_WRITE 0
#define IIC_READ 1
#define SlaveAddress 0x46
BH1750启动与停止的函数内容为:
void BH1750_Start()
{
IIC_OUTPUT_MODE_SET();
SDA_Set();
SCL_Set();
UTIL_IdleUs(5);
SDA_Clr();
UTIL_IdleUs(5);
SCL_Clr();
}
void BH1750_Stop()
{
IIC_OUTPUT_MODE_SET();
SDA_Clr();
SCL_Set();
UTIL_IdleUs(5);
SDA_Set();
UTIL_IdleUs(5);
}BH1750的回答函数为:
void BH1750_SendACK(char ack)
{
IIC_OUTPUT_MODE_SET();
SCL_Clr();
if(ack)
{
SDA_Set();
}
else
{
SDA_Clr();
}
UTIL_IdleUs(2);
SCL_Set();
UTIL_IdleUs(2);
SCL_Clr();
}BH1750发送字节数据的函数为:
void BH1750_SendByte(char data)
{
char i;
IIC_OUTPUT_MODE_SET();
SCL_Clr();
UTIL_IdleUs(2);
for (i=0;i<8;i++)
{
if(data&0x80)
{
SDA_Set();
}
else
{
SDA_Clr();
}
data <<= 1;
SCL_Set();
UTIL_IdleUs(2);
SCL_Clr();
UTIL_IdleUs(2);
}
}BH1750接收字节数据的函数为:
char BH1750_RecvByte()
{
char i;
char data = 0;
IIC_INPUT_MODE_SET();
for (i=0;i<8;i++)
{
SCL_Clr();
UTIL_IdleUs(2);
SCL_Set();
data <<= 1;
SCL_Set();
if(IIC_SDA_IN) data|=0x01;
UTIL_IdleUs(2);
}
SCL_Clr();
return data;
}BH1750向指定寄存器发送数据的函数为:
void Single_Write_BH1750(char REG_Address)
{
BH1750_Start();
BH1750_SendByte(SlaveAddress);
BH1750_RecvACK();
BH1750_SendByte(REG_Address);
BH1750_RecvACK();
BH1750_Stop();
}BH1750读取数据的函数为:
void Multiple_Read_BH1750()
{
BH1750_Start();
BH1750_SendByte(SlaveAddress+1);
BH1750_RecvACK();
BUF[0] = BH1750_RecvByte();
BH1750_SendACK(0);
BUF[1] = BH1750_RecvByte();
BH1750_SendACK(1);
BH1750_Stop();
UTIL_IdleUs(5e3);
BACK_COLOR=WHITE;
POINT_COLOR=RED;
}获取传感器检测数据的函数为:
void Get_Sunlight_Value()
{
int dis_data=0;
float temp;
char i=0;
unsigned int sd;
BACK_COLOR=WHITE;
POINT_COLOR=RED;
Single_Write_BH1750(0x01);
Single_Write_BH1750(0x10);
UTIL_IdleUs(180e3);
Multiple_Read_BH1750();
for(i=0;i<3;i++) dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];
temp=(float)dis_data/1.2;
sd=temp;
printf("light: %d \r\n",sd);
}在以上函数的配合下,实现光照强度检测的主程序为:
int main(void)
{
board_init();
BH1750_Init();
while (1)
{
Get_Sunlight_Value();
UTIL_IdleUs(500e3);
}
}经程序的编译和下载,在图4所示的器件连接情况下,其检测效果如图5所示。

图4 器件连接

图5 检测效果
若配上OLED显示 屏,就可以直接显示检测到的光照强度值。
我要赚赏金
