简介
BH1750FVI是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以用于收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。
特征参数
- 支持 I2C BUS 接口(f/s Mode Support)。
- 接近视觉灵敏度的光谱灵敏度特性(峰值灵敏度波长典型值:560nm)。
- 输出对应亮度的数字值。
- 对应广泛的输入光范围(相当于 1-65535lx)。
- 通过降低功率功能,实现低电流化。
- 通过 50Hz/60Hz 除光噪音功能实现稳定的测定
- 支持 1.8V 逻辑输入接口。
- 无需其他外部件。
- 光源依赖性弱(白炽灯,荧光灯,卤素灯,白光 LED,日光灯)。
- 有两种可选的 I2C slave 地址。
- 可调的测量结果影响较大的因素为光入口大小。
- 使用这种功能能计算 1.1 lx 到 100000 lx 马克斯/分钟的范围。
- 最小误差变动在±20%。
- 受红外线影响很小。
电气参数
工作电压:3.3-5V
运行温度:-40-85℃
储存温度:40-100℃
反向电流:7ma
功率损耗:260mW
接口类型:IIC
原理图
功能框图
框图描述:
PD-接近人眼反应的光敏二极管。
AMP-集成运算放大器:将PD电流转换为 PD 电压。
ADC-模数转换获取 16 位数字数据。
Logic + IIC Interface(逻辑+II界面)-光强度计算和 I 2 C 总线接口,包括下列寄存器:
数据寄存器→光强度数据寄存。初始值是:“0000_0000_0000_0000”。
测量时间寄存器→时间测量数据寄存。初始值是:“0100_0101”。
OSC-内部振荡器(时钟频率典型值:320kHz)。该时钟为内部逻辑时钟。
指令集
※请勿输入其他功能码。
各指令在程序中声明:
#define BHAddWrite 0x46 //从机地址+最后写方向位
#define BHAddRead 0x47 //从机地址+最后读方向位
#define BHPowDown 0x00 //关闭模块
#define BHPowOn 0x01 //打开模块等待测量指令
#define BHReset 0x07 //重置数据寄存器值在PowerOn模式下有效
#define BHModeH1 0x10 //高分辨率 单位1lx 测量时间120ms
#define BHModeH2 0x11 //高分辨率模式2 单位0.5lx 测量时间120ms
#define BHModeL 0x13 //低分辨率 单位4lx 测量时间16ms
#define BHSigModeH 0x20 //一次高分辨率 测量 测量后模块转到 PowerDown模式
#define BHSigModeH2 0x21 //同上类似
#define BHSigModeL 0x23 // 上类似
IIC总线通路
1.I2 C总线接口时序图
写测量指令和读测量结果指令都是由 I2C 总线接口完成的。下面参考下 I2C 总线接口和时序图。
2.从属地址
从属地址有 2 中形式,由 ADDR 端口决定。
ADDR=“H”( ADDR ≧ 0.7VCC ) →“1011100”
ADDR=“L”( ADDR ≦ 0.3VCC ) →“0100011”
3.写格式
BH1750FVI 不能在停机状态接收复数指令。要在每一个 Opecode 后插入 SP。
4.读格式:
例:
High Byte = “1000_0011”
Low Byte = “1001_0000”
( 215 + 29 + 28 + 27 + 24 ) / 1.2 = 28067 [ lx ]
IIC通讯时序
BH1750测量模式有如下几种:
本次使用的是H-分辨率模式 2,下面介绍BH1750在该模式下从“写指令”到“读测量结果指令”的测量序列例子:
例:连续高分辨率模式 2(ADDR=“L”)
① 发送“连续高分辨率模式 2”指令
② 等待第一次连续高分辨率模式 2 测量(最大时间为 180ms)
③ 读出测量结果
当数据为高字节“00000000”和低字节“00010010”时怎样计算?
接线
STM32 | BH1750 | OLED |
---|---|---|
PB8 | SCL | - |
PB9 | SDA | - |
PB10 | - | PB10 |
PB11 | - | PB11 |
5V | VCC | VCC |
代码
测量程序步骤如下:
首先是模块供电,烧录程序执行BH1750上电接着复位并进入测试模式:
bh_data_send(BHPowOn); //BH1750上电
bh_data_send(BHReset); //BH1750复位
bh_data_send(BHModeH2); //BH1750写入测量模式:选择的是分辨率是0.5lx,测量时间是120ms的
main.c
#include "stm32f10x.h"
#include "led.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "bh1750.h"
int X=0;
float a;
int main(void)
{
SystemInit();//配置系统时钟为72M
delay_init(72);
LED_Init();
LED_On();
USART1_Config();//串口初始化
OLED_Init();
BH1750_Init();
printf("Start \n");
delay_ms(1000);
OLED_ShowString(1,6, "BH1750");//显示“BH1750”
OLED_ShowChinese(2,1, 4);//“光”
OLED_ShowChinese(2,2, 5);//“照”
OLED_ShowChinese(2,3, 27);//“值”
OLED_ShowChar(2,7, ':');
while (1)
{
X=(float)bh_data_read();
a=X/1.2;
printf("光照强度: %0.2f\r\n",a);
LED_Toggle();
//sprintf((char *)buff, "%5d", a) ;
OLED_ShowFNum(2,8,a,7,2);
delay_ms(500);
}
}
主函数中各项初始化后,OLED和串口打印对应文字符号以及光照强度值。
结果
OLED显示:
串口打印光照强度值:
总结
在使用过程中需要注意一些问题:
1.发送测量指令后不能马上去读数据,需要等待一定的时间让芯片测量数据,确保证数据正确和稳定;
2.取得16位数据后,需要对数据进行合并,然后根据手册的公式得到最终的数据即为实际的光照值。
需要完整工程的小伙伴可以在评论区留下邮箱哦!!!