光照强度传感器-GY-30(BH1750)
光照强度传感器-GY-30(BH1750)
GY-30是一款采用了ROHM-BH1750FVI芯片的数字输出的感光模块。简而言之,BH1750是一个芯片,而GY-30则是基于这个芯片的一个感光模块。
具体来说,GY-30可以测量的光照度范围为0~65535勒克斯,具有±20%的最小误差变动和1勒克斯的分辨度。
它是一个五针脚模块,包括VCC、SCL、SDA、ADDR、GND五个引脚,
VCC接电源正极,电压范围在3~5V之间;GND接地;SCL为时钟线;SDA为数据线;ADDR为寄存器的地址引脚。
原理
首先第二个0x01打开电源,这个毫无疑问,我们一开始使用GY-30的时候肯定是要传输这个命令的。
接下来一堆都是设置模式的,我们也可以猜的出来这些就是指定我们采样光照强度的模式。
这一堆模式里分为两种,一种是连续模式,另一种是一次模式。
这个我们也能猜的出来,如果是连续模式,那么只需要发送一次命令即可,GY-30会不断地连续采集数据,而一次模式也就是我们每次要取数据之前都需要发送一次采集命令。所以我们等等选择的是连续模式。
一次和连续模式中又分为了三种,低(L)分辨,高(H)分辨和高分辨2,区别就在于分辨率分别是4lx,1lx,0.5lx以及采样的时间,我们这边就是折中一下,等等选择高分辨1模式。
那么接下来我们可以参考一下手册里提供的时序图了。
从上图可以得知,BH1750的从机地址为0100011,如果是要写命令的话,那么地址是0x46,如果是要读数据的话,那么地址是0x47。
我们首先需要先给GY-30发送上电命令,所以是先用I2C发送0x46,再发送0x01。
Z_I2C_Start();
Z_I2C_SendByte(0x46);
if(Z_I2C_ReveiceACK()!=0) return 0;
Z_I2C_SendByte(0x01);
if(Z_I2C_ReveiceACK()!=0) return 0;
Z_I2C_End();
接下来我们发送命令,指定BH1750为高分辨连续采集模式(指令为0x10),并且根据手册中的说法,发送完这个命令之后,我们需要等待最多180ms,我们这边凑个整,延时个200ms。
Z_I2C_Start();
Z_I2C_SendByte(0x46);
if(Z_I2C_ReveiceACK()!=0) return 0;
Z_I2C_SendByte(0x10);
if(Z_I2C_ReveiceACK()!=0) return 0;
Z_I2C_End();
Delay_ms(200);
上述代码完成之后,我们就可以开始读取数据了。
uint16_t Light=0;
Z_I2C_Start();
Z_I2C_SendByte(0x47);
if(Z_I2C_ReveiceACK()!=0) return 0;
Light|=Z_I2C_ReveiceByte();
Light<<=8;
Z_I2C_SendACK(0);
Light|=Z_I2C_ReveiceByte();
Z_I2C_SendACK(1);
Z_I2C_End();


浙公网安备 33010602011771号