1326|4

1577

帖子

1

TA的资源

五彩晶圆(初级)

楼主
 

[N32WB031_STB开发板测评]+光照强度检测与显示 [复制链接]

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所示。至此,就实现了对所处环境下的光照强度检测功能。

检测效果图

 
 

查看本帖全部内容,请登录或者注册
此帖出自无线连接论坛

最新回复

光照强度传感器的采样周期事多少?建议多久采集一次     详情 回复 发表于 2023-6-6 07:45
点赞 关注
 

回复
举报

6972

帖子

0

TA的资源

五彩晶圆(高级)

沙发
 

光照强度检测的结果出来没有问题,很赞

就是一个问题,这个勒克斯Lx数值是否准确,如果不准与什么有关

此帖出自无线连接论坛

点评

应该可以相信,其测量值是出厂前标定好的。  详情 回复 发表于 2023-6-6 08:29
 
 

回复

6803

帖子

10

TA的资源

版主

板凳
 

光照强度传感器的采样周期事多少?建议多久采集一次  

此帖出自无线连接论坛
个人签名

在爱好的道路上不断前进,在生活的迷雾中播撒光引

 
 
 

回复

1577

帖子

1

TA的资源

五彩晶圆(初级)

4
 
Jacktang 发表于 2023-6-6 07:29 光照强度检测的结果出来没有问题,很赞 就是一个问题,这个勒克斯Lx数值是否准确,如果不准与什么有关

应该可以相信,其测量值是出厂前标定好的。

此帖出自无线连接论坛
 
 
 

回复

1577

帖子

1

TA的资源

五彩晶圆(初级)

5
 

此帖出自无线连接论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
快速回复 返回顶部 返回列表