单片机——BH1750光照传感器篇

目录

  • BH1750光照传感器篇
  • 1、产品介绍
    • (1)概述:
    • (2)特点:
    • (3)引脚定义:
  • 2、测量程序流程
    • (1)发送断电指令
    • (2)发送通电指令
    • (3)发送测量指令
    • (4)读取测量结果

BH1750光照传感器篇

这里推荐一位博主写的这个传感器的文章,可以看下

文章链接

1、产品介绍

(1)概述:

BH1750FVI 是一种用于两线式串行总线接口的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利用它的高分辨率可以探测较大范围的光强度变化( 1lx-65535lx)。这个模块可以接入3.3~5v的电压
单片机——BH1750光照传感器篇_第1张图片

它常常应用在移动电话,液晶电视,笔记本电脑,便携式游戏机,数码相机,数码摄像机,汽车定位系统,液晶显示器等上面。

(2)特点:

这里只列举一些特点,详细说明请参考芯片手册:

【BH1750芯片手册】

	1. 支持 I2C BUS 接口(f/s Mode Support)。
	2. 输出对应亮度的数字值。(范围: 1-65535lx)
	3. 有两种可选的 I2C 从设备 地址(即一根IIC上可以最多接入两个这种传感器)。
	4. 最小误差变动在± 20%。
	5. 受红外线影响很小。

(3)引脚定义:

单片机——BH1750光照传感器篇_第2张图片
我们对这个芯片有了简单的了解后,接下来我们该考虑如何控制这个模块,从而获取出光照值了。从芯片手册中我们可以知道它支持IIC总线接口,即我们可以通过IIC总线使MCU和传感器之间进行收发数据。至于IIC的知识可以看下博主的这篇文章 【IIC总线篇】,这里就不在进行过多的叙述。

2、测量程序流程

单片机——BH1750光照传感器篇_第3张图片
从芯片手册中的图可知,要想测量出关照值,只用按照上面的步骤执行就行。
前提:芯片先供电,然后依次发送【断电—>通电—>测量指令—>进行测量】的指令即可即可。那我怎么去找这些指令呢?其实万能的芯片手册就告诉我们了,请看相关指令部分截图:
单片机——BH1750光照传感器篇_第4张图片
这些指令该如何通过单片机发送给这个芯片呢?芯片手册中也说过是通过IIC总线进行数据收发的。所以我们只用严格按照IIC总线协议格式,按照上面步骤依次发送相关指令就可以了。

注意上面流程图中的测量指令指的是分辨率模式,简单区别如下:
单片机——BH1750光照传感器篇_第5张图片
至于其它详细的区别,请看数据手册。

(1)发送断电指令

芯片手册中有说明芯片的地址
单片机——BH1750光照传感器篇_第6张图片
指令发送格式:
在这里插入图片描述
软件代码如下:

//函数功能:用于向芯片发送数据
//函数参数:具体的指令数据
void Bh1750Write(unsigned char dat)
{
	I2cStart();			//发送开始信号
	I2cSendByte(0x46);	//发送器件地址和写方向
	I2cSendByte(dat);	//发送要写入的数据(各种指令,包括通电、分辨率模式的等),具体参考芯片手册
	I2cStop();			//停止本次通信
}

所以要发送断电指令只需要调用上面的函数即可:

Bh1750Write(0x00);

(2)发送通电指令

同上,同理可得发送通电指令只需要调用上面的函数即可:

Bh1750Write(0x01);

(3)发送测量指令

测量指令,我这里选择的芯片手册推荐的连续高分辨率模式。

同上,同理可得发送通电指令只需要调用上面的函数即可:

Bh1750Write(0x10);

!!!注意,发送测量指令后不能马上去读数据,因为要等待一定的时间让芯片测量数据,这个时间在芯片手册中也有说明,测量时间最大为180us.所以我们在发送测量指令后,最好必须严格等待180us以上的时间,以保证数据正确和稳定
**

(4)读取测量结果

单片机——BH1750光照传感器篇_第7张图片
注意:取得16位数据后,需要对数据进行合并,然后根据官方的公式得到最终的数据——即为实际的光照值。

软件代码如下:

void Bh1750Read(unsigned char *str)
{
	unsigned int dat,i;
	float num;
	unsigned char sbuf[2];

	I2cStart();			//发送开始信号
	I2cSendByte(0x47);	//发送器件地址和读方向	
	
	for(i=0;i<2;i++)		//开始读取数据,bh1750一次会发送16位数据,所以要接收两次
	{
		sbuf[i]=I2cReadByte();
	}
	I2cStop();			//停止本次通信
	
	dat=sbuf[0];
	dat=(dat<<8)+sbuf[1];	//合成16位数据
	num=(float)dat/1.2;		//根据芯片手册的具体公式得到最终值
	dat=num;
	
	//下面将数字分离每位后保存到数组
	str[0]=dat/10000+0x30;
	dat=dat%10000;
	str[1]=dat/1000+0x30;
	dat=dat%1000;	
	str[2]=dat/100+0x30;
	dat=dat%100;    
	str[3]=dat/10+0x30;
	dat=dat%10;      
	str[4]=dat+0x30; 
	
}

最后附上最简单的工程代码(就串口打印光照值),里边有两份,一份是网上的,一份是我自己写的。代码简洁、注释详细、便于学习:

【BH1750源代码】

你可能感兴趣的:(单片机,单片机,传感器,物联网,嵌入式)