光照强度传感器-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();

posted @ 2025-11-05 15:19  张大帅哥  阅读(21)  评论(0)    收藏  举报