本帖最后由 jinglixixi 于 2022-12-2 00:16 编辑
当初申请的目标是一个环境状态检测器,光照强度检测是其中的一项指标,所使用的检测模块是BH1750。 使用它与OLED屏相结合,可轻松地完成显示的要求,其效果如图1所示。 图1 OLED屏显示效果
整个电路的连接情况为: OLED: SCL---B9 SDA---B10
BH1750: SCL---D5 SDA---A8 使引脚输出高低电平的语句定义为: #define SCL_Set() GPIO_WriteBit(GPIOD, GPIO_PIN_5, 1u) #define SCL_Clr() GPIO_WriteBit(GPIOD, GPIO_PIN_5, 0u); #define SDA_Set() GPIO_WriteBit(GPIOA, GPIO_PIN_8, 1u); #define SDA_Clr() GPIO_WriteBit(GPIOA, GPIO_PIN_8, 0u); 由于在BH1750的检测中,既有数据的输出,又有数据的输入,故其数据引脚需要在引脚的输入、输出模式间切换。
为此,需要为其配置相应的输入与输出模式的配置函数,其内容如下: - void IIC_INPUT_MODE_SET()
- {
- gpio_init.Pins = GPIO_PIN_8;
- gpio_init.PinMode = GPIO_PinMode_In_PullUp;
- gpio_init.Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &gpio_init);
- GPIO_PinAFConf(GPIOA, gpio_init.Pins, GPIO_AF_15);
- }
- void IIC_OUTPUT_MODE_SET()
- {
- gpio_init.Pins = GPIO_PIN_8;
- gpio_init.PinMode = GPIO_PinMode_Out_PushPull;
- gpio_init.Speed = GPIO_Speed_50MHz;
- GPIO_Init(GPIOA, &gpio_init);
- GPIO_PinAFConf(GPIOA, gpio_init.Pins, GPIO_AF_15);
- }
此外,在BH1750的检测过程中还相应相应的字节数据发送与接收函数,其内容为: - void BH1750_SendByte(char data)
- {
- char i;
- IIC_OUTPUT_MODE_SET();
- SCL_Clr();
- del_t(2);
- for (i=0;i<8;i++)
- {
- if(data&0x80)
- {
- SDA_Set();
- }
- else
- {
- SDA_Clr();
- }
- data <<= 1;
- SCL_Set();
- del_t(2);
- SCL_Clr();
- del_t(2);
- }
- }
- char BH1750_RecvByte()
- {
- char i;
- char data = 0;
- IIC_INPUT_MODE_SET();
- for (i=0;i<8;i++)
- {
- SCL_Clr();
- del_t(5);
- SCL_Set();
- data <<= 1;
- SCL_Set();
- if(IIC_SDA_IN) data|=0x01;
- del_t(5);
- }
- SCL_Clr();
- return data;
- }
BH1750获取光照强度的函数为: - void Get_Sunlight_Value()
- {
- int dis_data=0;
- float temp;
- char i=0;
- unsigned int sd;
- Single_Write_BH1750(0x01);
- Single_Write_BH1750(0x10);
- del_t(4000);
- 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,6,sd,5,16);
- }
实现图1所示效果的主程序为: - int main(void)
- {
- BOARD_Init();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(20,0,"EVB-L0136",16);
- OLED_ShowString(20,2,"BH1750",16);
- OLED_ShowString(20,4,"light: (lx)",16);
- BH1750_Init();
- del_t(2000);
- while (1)
- {
- Get_Sunlight_Value();
- del_t(5000);
- }
- }
此外,若使用LCD屏来进行显示,其程序为: - int main(void)
- {
- uint32_t dat;
- BOARD_Init();
- app_slcd_init();
- BH1750_Init();
- del_t(1000);
- while (1)
- {
- Get_Sunlight_Value();
- del_t(5000);
- }
- }
在编译下载后,其效果如图2所示。 图2 LCD显示效果
|