BH1750是一种用于光照强度检测的传感器,它采用I2C接口的方式来工作,可借助板载的I2C接口来进行连接。
图1 传感器
板上的I2C接口有多个,见图2所示。但由于BH1750传感器模块的引脚排列比较随意,因此无法实现直接的插接使用,所以只好以杜邦线来对应连接。
图2 传感器接口
BH1750与开发板的连接关系为:
SCL---PB6
SDA---PB7
为便于引脚来输出高低电平及读取引脚的状态,为其引脚所作的相应定义为:
#define SCL_Set() GPIO_WritePin(CW_GPIOB,
GPIO_PIN_6,GPIO_Pin_SET)
#define SCL_Clr() GPIO_WritePin(CW_GPIOB,
GPIO_PIN_6,GPIO_Pin_RESET)
#define SDA_Set() GPIO_WritePin(CW_GPIOB,
GPIO_PIN_7,GPIO_Pin_SET)
#define SDA_Clr() GPIO_WritePin(CW_GPIOB,
GPIO_PIN_7,GPIO_Pin_RESET)
#define IIC_SDA_IN GPIO_ReadPin(CW_GPIOB, GPIO_PIN_7)
配置所用引脚工作模式的函数为:
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_6| GPIO_PIN_7;
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();
for (i=0;i<8;i++)
{
if(data&0x80) SDA_Set();
else SDA_Clr();
data <<= 1;
SCL_Set();
SCL_Clr();
}
}
以GPIO口实现字节数据接收的函数为:
char BH1750_RecvByte()
{
char i;
char data = 0;
IIC_INPUT_MODE_SET();
for (i=0;i<8;i++)
{
SCL_Clr();
SCL_Set();
data <<= 1;
SCL_Set();
if(IIC_SDA_IN==GPIO_Pin_SET) data|=0x01;
}
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;
ShowNum(20,100,GRAY0,RED,sd,3);
}
在TFT显示屏上,为了实现检测结果的显示所配置的数值显示函数为:
void ShowNum(uint8_t x,uint8_ty,unsigned int fc,unsigned int bc,uint32_t num,uint8_t len)
{
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)
{
ShowChar(x+8*t,y,fc,bc,' ');
continue;
}
else enshow=1;
}
ShowChar(x+8*t,y,fc,bc,temp+'0');
}
}
在TFT显示屏的配合下,实现光照强度检测与显示的主程序为:
int32_t main(void)
{
RCC_HSI_Enable(RCC_HSIOSC_DIV6);
Lcd_Init();
Lcd_Clear(RED);
Gui_DrawFont_GBK16(20,20,GRAY0,RED,"BH1750Test");
Gui_DrawFont_GBK16(20,60,GRAY0,RED,"Light:(lx)");
Gui_DrawFont_GBK16(20,140,GRAY0,RED,"jinglixixi");
ShowNum(20,100,GRAY0,RED,123,3);
Gui_DrawLine(0,136,127,136,GRAY0);
BH1750_Init();
while(1)
{
Get_Sunlight_Value();
Delay(0xFFFF);
Delay(0xFFFF);
Delay(0xFFFF);
}
}
经程序的编译和下载,其运行效果如图3所示。至此,就实现了对所处环境下的光照强度检测功能。
图3 检测效果