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

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

图2 基本参数

图3 引脚作用
在检测时,它与开发板的连接关系为:
SCL---P400
SDA--- P401
为便于提供高低电平的输出,所定义的语句为:
#define SCL_Set() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_04_PIN_00, BSP_IO_LEVEL_HIGH)
#define SCL_Clr() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_04_PIN_00, BSP_IO_LEVEL_LOW)
#define SDA_Set() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_04_PIN_01, BSP_IO_LEVEL_HIGH)
#define SDA_Clr() R_IOPORT_PinWrite(&IOPORT_CFG_CTRL, BSP_IO_PORT_04_PIN_01, BSP_IO_LEVEL_LOW)
#define IIC_SDA_IN R_BSP_PinRead(BSP_IO_PORT_04_PIN_01)
#define IIC_WRITE 0
#define IIC_READ 1
#define SlaveAddress 0x46
BH1750启动与停止的函数内容为:
void BH1750_Start()
{
IIC_OUTPUT_MODE_SET();
SDA_Set();
SCL_Set();
R_BSP_SoftwareDelay(5, BSP_DELAY_UNITS_MICROSECONDS);
SDA_Clr();
R_BSP_SoftwareDelay(5, BSP_DELAY_UNITS_MICROSECONDS);
SCL_Clr();
}
void BH1750_Stop()
{
IIC_OUTPUT_MODE_SET();
SDA_Clr();
SCL_Set();
R_BSP_SoftwareDelay(5, BSP_DELAY_UNITS_MICROSECONDS);
SDA_Set();
R_BSP_SoftwareDelay(5, BSP_DELAY_UNITS_MICROSECONDS);
}
BH1750的应答函数为:
char BH1750_RecvACK()
{
int cnt=0;
IIC_OUTPUT_MODE_SET();
SDA_Set();
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MICROSECONDS);
SCL_Set();
IIC_INPUT_MODE_SET();
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MICROSECONDS);
while(IIC_SDA_IN)
{
cnt++;
R_BSP_SoftwareDelay(1, BSP_DELAY_UNITS_MICROSECONDS);
if(cnt>=250)
{
BH1750_Stop();
return 1;
}
}
SCL_Clr();
return 0;
}
BH1750发送字节数据的函数为:
void BH1750_SendByte(char data)
{
char i;
IIC_OUTPUT_MODE_SET();
SCL_Clr();
R_BSP_SoftwareDelay(2, BSP_DELAY_UNITS_MICROSECONDS);
for (i=0;i<8;i++)
{
if(data&0x80)
{
SDA_Set();
}
else
{
SDA_Clr();
}
data <<= 1;
SCL_Set();
R_BSP_SoftwareDelay(2, BSP_DELAY_UNITS_MICROSECONDS);
SCL_Clr();
R_BSP_SoftwareDelay(2, BSP_DELAY_UNITS_MICROSECONDS);
}
}
BH1750接收字节数据的函数为:
char BH1750_RecvByte()
{
char i;
char data = 0;
IIC_INPUT_MODE_SET();
for (i=0;i<8;i++)
{
SCL_Clr();
R_BSP_SoftwareDelay(2, BSP_DELAY_UNITS_MICROSECONDS);
SCL_Set();
data <<= 1;
SCL_Set();
if(IIC_SDA_IN) data|=0x01;
R_BSP_SoftwareDelay(2, BSP_DELAY_UNITS_MICROSECONDS);
}
SCL_Clr();
return data;
}
获取传感器检测数据的函数为:
void Get_Sunlight_Value()
{
int dis_data=0;
float temp;
char i=0;
unsigned int sd;
Single_Write_BH1750(0x01);
Single_Write_BH1750(0x10);
R_BSP_SoftwareDelay(180, BSP_DELAY_UNITS_MILLISECONDS);
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)
{
err = R_SCI_UART_Open(&g_uart9_ctrl, &g_uart9_cfg);
assert(FSP_SUCCESS == err);
err = R_SCI_UART_Read(&g_uart9_ctrl, uart_rx_buffer, 1);
assert(FSP_SUCCESS == err);
BH1750_Init();
while (1)
{
Get_Sunlight_Value();
R_BSP_SoftwareDelay(500, BSP_DELAY_UNITS_MILLISECONDS);
}
}
经程序的编译和下载,在图4所示的器件连接情况下,其检测效果如图5和图6所示。

图4 器件连接

图5 检测效果1(夜晚灯光下)

图6 检测效果2(手电照射下)