STM32驱动BH1750采集环境光照强度

简介

BH1750FVI是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以用于收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化。

在这里插入图片描述

特征参数

  1. 支持 I2C BUS 接口(f/s Mode Support)。
  2. 接近视觉灵敏度的光谱灵敏度特性(峰值灵敏度波长典型值:560nm)。
  3. 输出对应亮度的数字值。
  4. 对应广泛的输入光范围(相当于 1-65535lx)。
  5. 通过降低功率功能,实现低电流化。
  6. 通过 50Hz/60Hz 除光噪音功能实现稳定的测定
  7. 支持 1.8V 逻辑输入接口。
  8. 无需其他外部件。
  9. 光源依赖性弱(白炽灯,荧光灯,卤素灯,白光 LED,日光灯)。
  10. 有两种可选的 I2C slave 地址。
  11. 可调的测量结果影响较大的因素为光入口大小。
  12. 使用这种功能能计算 1.1 lx 到 100000 lx 马克斯/分钟的范围。
  13. 最小误差变动在±20%。
  14. 受红外线影响很小。

电气参数

工作电压: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”时怎样计算?

在这里插入图片描述

接线

STM32BH1750OLED
PB8SCL-
PB9SDA-
PB10-PB10
PB11-PB11
5VVCCVCC

代码

测量程序步骤如下:
在这里插入图片描述
首先是模块供电,烧录程序执行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位数据后,需要对数据进行合并,然后根据手册的公式得到最终的数据即为实际的光照值。
需要完整工程的小伙伴可以在评论区留下邮箱哦!!!

评论 57
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值