单有了显示单元还只是解决了人机交互的部分问题,要让机器具备感知能力就离不开传感器。传感器的种类有许多种,BH1750光照传感器就是其中的一种,它是一种基于I2C接口的数字式传感器,因此无需对获取的数据进行标度处理。 该传感器与MCU的连接关系如下: SCL ---PB6 SDA---PB7 为使该传感器工作,其相应引脚输出高低电平的语句为: #define SCL_Set() Gpio_SetIO(GpioPortB, GpioPin6) #define SCL_Clr() Gpio_ClrIO(GpioPortB, GpioPin6) #define SDA_Set() Gpio_SetIO(GpioPortB, GpioPin7) #define SDA_Clr() Gpio_ClrIO(GpioPortB, GpioPin7) 定义数据引脚为输入、输出功能的函数为:
void IIC_INPUT_MODE_SET()
{
stc_gpio_cfg_t stcGpioCfg;
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
stcGpioCfg.enDir = GpioDirIn;
stcGpioCfg.enDrv = GpioDrvL;
stcGpioCfg.enPu = GpioPuDisable;
stcGpioCfg.enPd = GpioPdDisable;
stcGpioCfg.enOD = GpioOdDisable;
stcGpioCfg.enCtrlMode = GpioAHB;
Gpio_Init(GpioPortB, GpioPin7, &stcGpioCfg);
}
void IIC_OUTPUT_MODE_SET()
{
stc_gpio_cfg_t stcGpioCfg;
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
stcGpioCfg.enDir = GpioDirOut;
stcGpioCfg.enPu = GpioPuDisable;
stcGpioCfg.enPd = GpioPdEnable;
Gpio_Init(GpioPortB, GpioPin7, &stcGpioCfg);
}
复制代码 BH1750的初始化函数为:
void BH1750_Init(void)
{
stc_gpio_cfg_t stcGpioCfg;
Sysctrl_SetPeripheralGate(SysctrlPeripheralGpio, TRUE);
stcGpioCfg.enDir = GpioDirOut;
stcGpioCfg.enPu = GpioPuDisable;
stcGpioCfg.enPd = GpioPdEnable;
Gpio_Init(GpioPortB, GpioPin6, &stcGpioCfg);
Gpio_Init(GpioPortB, GpioPin7, &stcGpioCfg);
}
复制代码 获取光照值得函数为:
void Get_Sunlight_Value()
{
int dis_data=0;
float temp;
char i=0;
unsigned int sd;
Single_Write_BH1750(0x01);
Single_Write_BH1750(0x10);
delay1ms(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;
sd=temp;
OLED_ShowNum(0,2,sd,5,16);
}
复制代码 显示演示效果的主函数为:
int32_t main(void)
{
App_OLEDInit();
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"HC32l072_BH1750",16);
OLED_ShowString(48,2,"lx",16);
BH1750_Init();
while (1)
{
Get_Sunlight_Value();
delay1ms(1000);
}
}
复制代码
经程序的编译和下载,其运行效果如下图所示。
光照度测量效果图
演示代码: |