BH1750是一种基于I2C接口的光照强度传感器,它相较于使用光敏二极管的检测方法要更规范化,其检测结果要更具可靠性。
BH1750与开发板的连接关系为:
SCL---PB10
SDA---PB1
为便于引脚来输出高低电平及读取引脚的状态,为其引脚所作的相应定义为:
#define SCL_Set() GPIO_SetBits(GPIOB, GPIO_PIN_10)
#define SCL_Clr() GPIO_ResetBits(GPIOB, GPIO_PIN_10)
#define SDA_Set() GPIO_SetBits(GPIOB, GPIO_PIN_1)
#define SDA_Clr() GPIO_ResetBits(GPIOB, GPIO_PIN_1)
#define IIC_SDA_IN GPIO_ReadInputDataBit(GPIOB, GPIO_PIN_1)
配置所用引脚工作模式的函数为:
- void BH1750_Init(void)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- __RCC_GPIOB_CLK_ENABLE();
- GPIO_InitStruct.IT = GPIO_IT_NONE;
- GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
- GPIO_InitStruct.Pins = GPIO_PIN_1| GPIO_PIN_10;
- GPIO_InitStruct.Speed = GPIO_SPEED_HIGH;
- GPIO_Init(CW_GPIOB, &GPIO_InitStruct);
- }
-
以GPIO口实现字节数据发送的函数为:
- void BH1750_SendByte(char data)
- {
- char i;
- IIC_OUTPUT_MODE_SET();
- SCL_Clr();
- Delay_Us(2);
- for (i=0;i<8;i++)
- {
- if(data&0x80) SDA_Set();
- else SDA_Clr();
- data <<= 1;
- SCL_Set();
- Delay_Us(2);
- SCL_Clr();
- Delay_Us(2);
- }
- }
-
以GPIO口实现字节数据接收的函数为:
- char BH1750_RecvByte()
- {
- char i;
- char data = 0;
- IIC_INPUT_MODE_SET();
- for (i=0;i<8;i++)
- {
- SCL_Clr();
- Delay_Us(2);
- SCL_Set();
- data <<= 1;
- SCL_Set();
- if(IIC_SDA_IN) data|=0x01;
- Delay_Us(2);
- }
- SCL_Clr();
- return data;
- }
-
实现光照强度读取的函数为:
- void Get_Sunlight_Value()
- {
- int dis_data=0;
- float temp;
- char i=0;
- unsigned int sd;
- Single_Write_BH1750(0x01);
- Single_Write_BH1750(0x10);
- Delay(0xFFFF);
- 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;
- sd=temp;
- OLED_ShowNum(36,2,sd,5,16);
- }
-
在OLED显示屏上,为了实现检测结果的显示所配置的数值显示函数为:
- void OLED_ShowNum(uint8_t x,uint8_t y,uint32_t num,uint8_t len,uint8_t size2)
- {
- uint8_t t,temp;
- uint8_t enshow=0;
- for(t=0;t<len;t++)
- {
- temp=(num/oled_pow(10,len-t-1))%10;
- if(enshow==0&&t<(len-1))
- {
- if(temp==0)
- {
- OLED_ShowChar(x+(size2/2)*t,y,' ',size2);
- continue;
- }
- else enshow=1;
- }
- OLED_ShowChar(x+(size2/2)*t,y,temp+'0',size2);
- }
- }
-
时间与光照强度显示函数为:
- void RTC_TimeShow(void)
- {
- RTC_GetTime(RTC_FORMAT_BIN, &RTC_TimeStructure);
- (void)RTC->DATE;
- OLED_ShowNum(20,4,RTC_TimeStructure.Hours,2,16);
- OLED_ShowNum(44,4,RTC_TimeStructure.Minutes,2,16);
- OLED_ShowNum(68,4,RTC_TimeStructure.Seconds,2,16);
- Get_Sunlight_Value();
- }
-
在OLED显示屏的配合下,实现光照强度检测与显示的主程序为:
- int main(void)
- {
- Delay(0XFFFF);
- log_init();
- log_info("\r\nRTC calendar demo\r\n");
- RTC_DateAndTimeDefaultVale();
- RTC_CLKSourceConfig(2);
- RTC_PrescalerConfig();
- log_info("RTC configured....");
- RTC_ConfigInt(RTC_INT_WUT, DISABLE);
- RTC_EnableWakeUp(DISABLE);
- RTC_DateRegulate();
- RTC_TimeRegulate();
- TIM3_Configuration();
- OLED_gpio();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(20,0,"N32WB031",16);
- OLED_ShowString(20,2,"L= lx",16);
- OLED_ShowString(20,4," : :",16);
- BH1750_Init();
- while(1);
- }
-
经程序的编译和下载,其运行效果如图3所示。至此,就实现了对所处环境下的光照强度检测功能。
检测效果图