单⽚机——BH1750光照传感器篇
⽬录
BH1750光照传感器篇
这⾥推荐⼀位博主写的这个传感器的⽂章,可以看下
1、产品介绍
(1)概述:
BH1750FVI 是⼀种⽤于两线式串⾏总线接⼝的数字型光强度传感器集成电路。这种集成电路可以根据收集的光线强度数据来调整液晶或者键盘背景灯的亮度。利⽤它的⾼分辨率可以探测较⼤范围的光强度变化( 1lx-65535lx)。这个模块可以接⼊3.3~5v的电压 它常常应⽤在移动电话,液晶电视,笔记本电脑,便携式游戏机,数码相机,数码摄像机,汽车定位系统,液晶显⽰器等上⾯。黄斑对焦
(2)特点:
这⾥只列举⼀些特点,详细说明请参考芯⽚⼿册:
【】
1. ⽀持 I2C BUS 接⼝(f/s Mode Support)。
2. 输出对应亮度的数字值。(范围: 1-65535lx)
3. 有两种可选的 I2C 从设备地址(即⼀根IIC上可以最多接⼊两个这种传感器)。
4. 最⼩误差变动在± 20%。
5. 受红外线影响很⼩。
(3)引脚定义:
我们对这个芯⽚有了简单的了解后,接下来我们该考虑如何控制这个模块,从⽽获取出光照值了。从芯⽚⼿册中我们可以知道它⽀持IIC总线接⼝,即我们可以通过IIC总线使MCU和传感器之间进⾏收发数据。⾄于IIC的知识可以看下博主的这篇⽂章 【】,这⾥就不在进⾏过多的叙述。
液压卸车翻板
从芯⽚⼿册中的图可知,要想测量出关照值,只⽤按照上⾯的步骤执⾏就⾏。
双人雨披
前提:芯⽚先供电,然后依次发送【断电—>通电—>测量指令—>进⾏测量】的指令即可即可。那我怎么去这些指令呢?其实万能的芯⽚⼿册就告诉我们了,请看相关指令部分截图:
这些指令该如何通过单⽚机发送给这个芯⽚呢?芯⽚⼿册中也说过是通过IIC总线进⾏数据收发的。所以我们只⽤严格按照IIC总线协议格式,按照上⾯步骤依次发送相关指令就可以了。
螺蛳剪尾机注意上⾯流程图中的测量指令指的是分辨率模式,简单区别如下:
⾄于其它详细的区别,请看数据⼿册。
(1)发送断电指令
芯⽚⼿册中有说明芯⽚的地址
指令发送格式:
软件代码如下:
//函数功能:⽤于向芯⽚发送数据
//函数参数:具体的指令数据
void Bh1750Write(unsigned char dat)
{
I2cStart();//发送开始信号
I2cSendByte(0x46);//发送器件地址和写⽅向
I2cSendByte(dat);//发送要写⼊的数据(各种指令,包括通电、分辨率模式的等),具体参考芯⽚⼿册
I2cStop();//停⽌本次通信
}
所以要发送断电指令只需要调⽤上⾯的函数即可:
Bh1750Write(0x00);
(2)发送通电指令
同上,同理可得发送通电指令只需要调⽤上⾯的函数即可:
Bh1750Write(0x01);
(3)发送测量指令
测量指令,我这⾥选择的芯⽚⼿册推荐的连续⾼分辨率模式。
同上,同理可得发送通电指令只需要调⽤上⾯的函数即可:
Bh1750Write(0x10);
!!!注意,发送测量指令后不能马上去读数据,因为要等待⼀定的时间让芯⽚测量数据,这个时间
在芯⽚⼿册中也有说明,测量时间最⼤为180us.所以我们在发送测量指令后,最好必须严格等待180us以上的时间,以保证数据正确和稳定
**
(4)读取测量结果
注意:取得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;
}
最后附上最简单的⼯程代码(就串⼝打印光照值),⾥边有两份,⼀份是⽹上的,⼀份是我⾃⼰写的。代码简洁、注释详细、便于学习:【】