本帖最后由 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 光强显示效果
|