BH1750是一种数字式光照强度传感器,其特点是采用I2C接口工作,故占用的引脚少。此外,由于是数字式传感器故无需对检测值进行标定。 尽管以前曾在其它开发板上进行过测试,但在PIC18F57Q43上还是首次。 为进行检测和显示,其引脚配置如图1所示,相应的引脚命名如图2所示。 图1 引脚配置 图2 引脚命名 其中,BH1750所连接的引脚如下: CLK---RC0 DIN ---RC1 而OLED屏所连接的引脚为: SCL ---RB1 SDA ---RB2 为此,对BH1750所做的语句定义为: #define SCL_Clr() CLK_SetLow() #define SCL_Set() CLK_SetHigh() #define SDA_Clr() DIN_SetLow() #define SDA_Set() DIN_SetHigh() unsigned char BUF[8]; #define IIC_WRITE 0 #define IIC_READ 1 #define SlaveAddress 0x46 #define IIC_SDA_IN DIN_GetValue() 与OLED屏的驱动不同,OLED屏只是使用输出模式,而BH1750的数据引脚既使用输出模式也使用输入模式。 为便于引脚工作模式的切换,使用配置了2个函数来进行切换,其内容如下: void IIC_INPUT_MODE_SET()
{
DIN_SetDigitalInput();
}
void IIC_OUTPUT_MODE_SET()
{
DIN_SetDigitalOutput();
}
BH1750的初始化函数为: void BH1750_Init(void)
{
DIN_SetDigitalOutput();
}
以GPIO口模拟I2C方式字节数据的函数为: 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);
}
}
获取光照强度值的函数为: 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_ms(180);
Multiple_Read_BH1750();
dis_data=BUF[0];
dis_data=(dis_data<<8)+BUF[1];
temp=(float)dis_data/1.2;
sd=temp;
OLED_ShowNum(0,6,sd,5,16);
}
实现图3所示检测效果的主程序为: int main(void)
{
SYSTEM_Initialize();
KEY_SetDigitalOutput();
KEY_SetHigh();
LED_SetHigh();
BH1750_Init();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"PIC18F57Q43 TEST",16);
OLED_ShowString(0,2,"OLED & BH1750",16);
OLED_ShowString(0,4,"Sunlight=",16);
OLED_ShowString(48,6,"lx",16);
while(1)
{
Get_Sunlight_Value();
LED0_Toggle();
__delay_ms(500);
}
}
图3 检测效果 需指出的是:无不影响程序的下载,这里是以RA4和RA5输出高电平来为OLED屏和BH1750通过电源支持。
|