1、BH1750FVI是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。
2、传感器特点:
- 支持I2CBUS接口
- 接近视觉灵敏度的光谱灵敏度特性
- 输出对应亮度的数字值
- 对应广泛的输入光范围。(相当于1-65535lx)
- 通过降低功率功能,实现低电流化。
- 通过50Hz/60Hz除光噪音功能实现稳定的测定。
- 支持1.8v逻辑输入接口。
- 无需其他外部件。
- 光源依赖性弱。
- 有两种可选的I2Cslave地址。
- 可调的测量结果影响较大的因素为光入口大小。
- 使用这种功能计算1.1lx到100000lx马克斯/分钟的范围。
- 最小误差变动在±20%。
- 受红外线影响很小。
3、测量程序步骤:
4、指令集合结构:
5、测量模式说明:
6、
测量流程如下(连续H分辨率模式):
- 发送设备地址(写)并等待ACK,发送高分辨率测量指令,等待ACK,停止时序。
- 等待传感器第一次测量完成。
- 读取测量结果。发送设备地址(读),读取高字节和低字节数据,等待ACK,停止时序。
测量结果为2字节(高字节High Byte和低字节Low Byte)数据,计算公式为:
光照强度(单位lx)=(High Byte + Low Byte)/ 1.2 * 测量精度
7、 Sensor_Light.c程序
#include "sensor_light.h"
#include "bsp_soft_i2c.h"
#include "bsp_systick.h"
// 写传感器函数
bool BH1750_Write(uint8_t SlaveAddress, uint8_t REG_Address)
{
if(!I2C2_Start()) return false;
I2C2_Send_Byte(SlaveAddress);
if(!I2C2_Wait_Ack()) { I2C2_Stop(); return false; }
I2C2_Send_Byte(REG_Address);
if(!I2C2_Wait_Ack()) { I2C2_Stop(); return false; }
if(!I2C2_Stop()) return false;
return true;
}
// 读传感器函数
bool BH1750_Read(uint8_t SlaveAddress, uint8_t* buf, uint8_t len)
{
if(!I2C2_Start()) return false;
I2C2_Send_Byte(SlaveAddress | 1);
if(!I2C2_Wait_Ack()) { I2C2_Stop(); return false; }
for(uint16_t i=0; i<len; i++)
{
buf[i] = I2C2_Read_Byte();
if(i<len-1)
{
I2C2_Ack();
}
}
I2C2_NAck();
if(!I2C2_Stop()) return false;
return true;
}
// 对传感器进行初始化
void BH1750_Init(void)
{
BH1750_Write(BH1750_SlaveAddress, BH1750_ON); // 通电
BH1750_Write(BH1750_SlaveAddress, RESOLUTION); // 设置分辨率
}
// 从传感器获取数据
float BH1750_ReadData(void)
{
uint8_t buf[2];
BH1750_Read(BH1750_SlaveAddress, buf, 2);
return (float)(((uint16_t)buf[0]<<8) + buf[1]) / 1.2f * SCALE_INTERVAL;
}
7、Sensor_Light.h程序
#ifndef _SENSOR_LIGHT_H_
#define _SENSOR_LIGHT_H_
#include "stm32f0xx.h"
#define BH1750_SlaveAddress 0x46 // 设备地址
#define BS1750_DOWN 0x00 // 断电指令
#define BH1750_ON 0x01 // 通电指令
#define BH1750_RSET 0x07 // 重置指令
#define BH1750_CON_H 0x10 // 连续高分辨率模式,1lx,120ms
#define BH1750_CON_H2 0x11 // 连续高分辨率模式,0.5lx,120ms
#define BH1750_CON_L 0x13 // 连续低分辨率模式,4lx,16ms
#define BH1750_ONE_H 0x20 // 一次高分辨率模式,1lx,120ms
#define BH1750_ONE_H2 0x21 // 一次高分辨率模式,0.5lx,120ms
#define BH1750_ONE_L 0x23 // 一次低分辨率模式,4lx,16ms
#define RESOLUTION BH1750_CON_H2 // 连续高分辨率模式,0.5lx
#if RESOLUTION == BH1750_CON_H || RESOLUTION == BH1750_ONE_H
#define SCALE_INTERVAL 1
#elif RESOLUTION == BH1750_CON_H2 || RESOLUTION == BH1750_ONE_H2
#define SCALE_INTERVAL 0.5f
#elif RESOLUTION == BH1750_CON_L || RESOLUTION == BH1750_ONE_L
#define SCALE_INTERVAL 4
#endif
void BH1750_Init(void);
float BH1750_ReadData(void);
#endif
8、主函数程序:
int main()
{
SYSTICK_Init(1); // 滴答定时器初始化
I2C2_Soft_Init(); // IIC初始化
USART1_Init(); // 串口初始化
BH1750_Init();
SYSTICK_DelayMs(180);
while(1)
{
printf("Light is : %flx\r\n", BH1750_ReadData());
SYSTICK_DelayMs(120);
}
}
I2C通讯请参考:https://blog.csdn.net/qq_41422043/article/details/99688493
参考资料:https://wenku.baidu.com/view/57203d05856a561252d36ff6.html