本帖最后由 jinglixixi 于 2020-6-11 13:51 编辑
BH1750是一款基于I2C接口的数字式光照强度传感器,测量单位为lx。使用它与OLED屏结合即可构成一个光强检测仪,并形成双I2C器件的构成结构,其中 OLED屏使用I2C_1接口,BH1750使用I2C_0接口。
为了使 BH1750工作,它的SDA接 PB8,SCLA接 PB7,所作的相关定义语句如下: #define IIC_SDA_IN GPIO_GetPinLevel(GPIOB, GPIO_PIN8)
#define IIC_INPUT_MODE_SET() GPIO_SetDir(GPIOB, GPIO_PIN8, GPIO_IN); #define IIC_OUTPUT_MODE_SET() GPIO_SetDir(GPIOB, GPIO_PIN8, GPIO_OUT);
#define IIC_WRITE 0 #define IIC_READ 1 #define SlaveAddress 0x46
#define SCL_Set() GPIO_SetPinLevel(GPIOB, GPIO_PIN7,GPIO_LEVEL_HIGH); // PB7 #define SCL_Clr() GPIO_SetPinLevel(GPIOB, GPIO_PIN7,GPIO_LEVEL_LOW);
#define SDA_Set() GPIO_SetPinLevel(GPIOB, GPIO_PIN8,GPIO_LEVEL_HIGH); // PB8 #define SDA_Clr() GPIO_SetPinLevel(GPIOB, GPIO_PIN8,GPIO_LEVEL_LOW);
配合器件读取的辅助函数有: void BH1750_Start()
{
IIC_OUTPUT_MODE_SET();
SDA_Set();
SCL_Set();
udelay(5);
SDA_Clr();
udelay(5);
SCL_Clr();
}
void BH1750_Stop()
{
IIC_OUTPUT_MODE_SET();
SDA_Clr();
SCL_Set();
udelay(5);
SDA_Set();
udelay(5);
}
读取光强的函数为: void Multiple_Read_BH1750()
{
BH1750_Start();
BH1750_SendByte(SlaveAddress+1);
BH1750_RecvACK();
BUF[0] = BH1750_RecvByte();
BH1750_SendACK(0);
BUF[1] = BH1750_RecvByte();
BH1750_SendACK(1);
BH1750_Stop();
mdelay(5);
}
显示光强测量值得函数为: void Get_Sunlight_Value()
{
int dis_data=0;
float temp;
char i=0;
unsigned int sd;
Single_Write_BH1750(0x01); // power on
Single_Write_BH1750(0x10); // H- resolution mode
mdelay(180);
Multiple_Read_BH1750();
for(i=0;i<3;i++)
dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];
temp=(float)dis_data/1.2;
printf("Sunlight=%0.2f lx\r\n",temp);
sd=temp;
OLED_ShowNum(0,4,sd,5,16);
}
实现图1和图2显示效果的主程序为: int main(void)
{
InitDelay();
InitDebug();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"AC8710 TEST",16);
OLED_ShowString(0,2,"BH1750:",16);
OLED_ShowString(48,4,"lx",16);
IIC_Init();
while(1)
{
Get_Sunlight_Value();
mdelay(1000);
}
}
图1 串口显示效果
图2 光强显示效果 |