GY-30是一款采用了ROHM-BH1750FVI芯片的数字输出的感光模块,可以测量的光照度范围为0~65535勒克斯,最小误差变动为±20%,分辨度为1勒克斯。
GY-30是一个五针脚模块,包含VCC、SCL、SDA、ADDR、GND五个引脚。其中VCC接电源正极,其电压范围在3~5V之间;GND接地;SCL为时钟线;SDA为数据线;并且,SCL和SDA与单片机相连时接上一个5k阻值的上拉电阻;ADDR为寄存器的地址引脚,其接地时器件地址为0100011,接电源正极时器件地址为1011100。
GY-30与STM32单片机之间的通讯采用IIC通讯协议,这里简单讲解一下IIC通讯。
上图中,左边是起始信号,拉高数据线,再拉高时钟线,然后在时钟线为高电平时将数据线拉低,产生起始信号,之后再将时钟线拉低,等待发送数据。右边是停止信号(数据传递结束时,时钟线和数据线都为低电平),先拉高时钟线,在时钟线为高电平时将数据线拉高,产生停止信号。
数据的传递由数据线承载,保证时钟线拉高时,数据线保持稳定。发送数据1,保持时钟线为低电平,将数据线拉高;在数据线拉高过程中,将时钟线拉高,等待几us后,将时钟线拉低。发送数据0与其同理,只需要将数据线保持为低电平即可。
IIC协议在每发送完一条指令之后都会由接受指令的设备产生一个应答;若应答则继续,不应答则停止。
说完IIC同通讯,我们再来具体讲解一下BH1750芯片的通讯流程。
测量流程为:单片机发送器地址(7位)和写命令(1位)→传感器应答→单片机发送测量指令→传感器应答
其读取测量结果流程位:单片机发送器地址和读命令→传感器应答→传感器给单片机发送高8位数据→单片机应答→传感器发送低8为数据→单片机不应答(通讯结束)
下面附上程序代码(这里关于IIC协议的代码就不给出了,网上有很多,我这里采用的是正点原子编写的myiic.c文件)
bh1750.c
//写入
void Single_Write_BH1750(unsigned char REG_Address)
{IIC_Start(); IIC_Send_Byte(BHAddWrite); IIC_Send_Byte(REG_Address); IIC_Stop();
}
//发送
void bh_data_send(u8 command)
{do{IIC_Start(); IIC_Send_Byte(BHAddWrite); }while(IIC_Wait_Ack()); IIC_Send_Byte(command); IIC_Wait_Ack(); IIC_Stop();
}
//接受
u16 bh_data_read(void)
{u16 buf;u8 a;u8 b;IIC_Start(); IIC_Send_Byte(BHAddRead); IIC_Wait_Ack(); b=IIC_Read_Byte(1);a=IIC_Read_Byte(0);buf=b*256+a; IIC_Stop(); return buf;
}
//初始化
void Init_BH1750(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStruct); Single_Write_BH1750(0x01); delay_ms(180);
}
bh1750.h
//各个命令代码的具体含义可以参考相关的使用说明(绝不是因为我看字太多懒得打)
#define ADDR 0x23//0100011
#define BHAddWrite 0x46
#define BHAddRead 0x47
#define BHPowDown 0x00
#define BHPowOn 0x01
#define BHReset 0x07
#define BHModeH1 0x10
#define BHModeH2 0x11
#define BHModeL 0x13
#define BHSigModeH 0x20
#define BHSigModeH2 0x21
#define BHSigModeL 0x23 void Single_Write_BH1750(unsigned char REG_Address);
void Init_BH1750(void);
void bh_data_send(u8 command);
u16 bh_data_read(void);
附上一个我当时做实验的测试结果图
懒人程序下载通道 :
https://download.csdn.net/download/qq_42560288/12673151
如果本文真的帮助到你的话,请动动小手点个赞吧!