[MM32软件] 【EV Board (MM32L0136C7P)测评】+光照强度检测与显示

[复制链接]
 楼主| jinglixixi 发表于 2022-12-2 00:15 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2022-12-2 00:16 编辑

当初申请的目标是一个环境状态检测器,光照强度检测是其中的一项指标,所使用的检测模块是BH1750
使用它与OLED屏相结合,可轻松地完成显示的要求,其效果如图1所示。
1.jpg
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的检测中,既有数据的输出,又有数据的输入,故其数据引脚需要在引脚的输入、输出模式间切换。

为此,需要为其配置相应的输入与输出模式的配置函数,其内容如下:
  1. void IIC_INPUT_MODE_SET()
  2. {
  3.     gpio_init.Pins  = GPIO_PIN_8;
  4.     gpio_init.PinMode  = GPIO_PinMode_In_PullUp;
  5.     gpio_init.Speed = GPIO_Speed_50MHz;
  6.     GPIO_Init(GPIOA, &gpio_init);
  7.     GPIO_PinAFConf(GPIOA, gpio_init.Pins, GPIO_AF_15);
  8. }

  9. void IIC_OUTPUT_MODE_SET()
  10. {
  11.     gpio_init.Pins  = GPIO_PIN_8;
  12.     gpio_init.PinMode  = GPIO_PinMode_Out_PushPull;
  13.     gpio_init.Speed = GPIO_Speed_50MHz;
  14.     GPIO_Init(GPIOA, &gpio_init);
  15.     GPIO_PinAFConf(GPIOA, gpio_init.Pins, GPIO_AF_15);
  16. }

此外,在BH1750的检测过程中还相应相应的字节数据发送与接收函数,其内容为:
  1. void BH1750_SendByte(char data)
  2. {
  3.     char i;
  4.     IIC_OUTPUT_MODE_SET();
  5.     SCL_Clr();
  6.     del_t(2);
  7.     for (i=0;i<8;i++)
  8.     {
  9.         if(data&0x80)
  10.         {
  11.                 SDA_Set();
  12.         }
  13.         else
  14.         {
  15.                 SDA_Clr();
  16.         }
  17.         data <<= 1;
  18.         SCL_Set();
  19.         del_t(2);
  20.         SCL_Clr();
  21.         del_t(2);
  22.     }
  23. }

  24. char BH1750_RecvByte()
  25. {
  26.     char i;
  27.     char data = 0;
  28.     IIC_INPUT_MODE_SET();
  29.     for (i=0;i<8;i++)
  30.     {
  31.         SCL_Clr();
  32.         del_t(5);
  33.         SCL_Set();
  34.         data <<= 1;
  35.         SCL_Set();
  36.         if(IIC_SDA_IN) data|=0x01;
  37.         del_t(5);
  38.     }
  39.     SCL_Clr();
  40.     return data;
  41. }

BH1750获取光照强度的函数为:
  1. void Get_Sunlight_Value()
  2. {
  3.     int dis_data=0;
  4.     float temp;
  5.     char i=0;
  6.     unsigned int sd;
  7.     Single_Write_BH1750(0x01);
  8.     Single_Write_BH1750(0x10);
  9.     del_t(4000);
  10.     Multiple_Read_BH1750();
  11.     for(i=0;i<3;i++)    dis_data=BUF[0];
  12.     dis_data=(dis_data<<8)+BUF[1];
  13.     temp=(float)dis_data/1.2;
  14.     sd=temp;
  15.     OLED_ShowNum(0,6,sd,5,16);
  16. }

实现图1所示效果的主程序为:
  1. int main(void)
  2. {
  3.     BOARD_Init();
  4.     OLED_Init();
  5.     OLED_Clear();
  6.     OLED_ShowString(20,0,"EVB-L0136",16);
  7.     OLED_ShowString(20,2,"BH1750",16);
  8.     OLED_ShowString(20,4,"light: (lx)",16);
  9.     BH1750_Init();
  10.     del_t(2000);
  11.     while (1)
  12.     {
  13.             Get_Sunlight_Value();
  14.             del_t(5000);
  15.     }
  16. }

此外,若使用LCD屏来进行显示,其程序为:
  1. int main(void)
  2. {
  3.       uint32_t dat;
  4.       BOARD_Init();
  5.       app_slcd_init();
  6.       BH1750_Init();
  7.       del_t(1000);
  8.       while (1)
  9.       {
  10.            Get_Sunlight_Value();
  11.            del_t(5000);
  12.       }
  13. }

在编译下载后,其效果如图2所示。
2.jpg
2  LCD显示效果


1988020566 发表于 2022-12-6 13:59 | 显示全部楼层
这个标定好的信号吗?              
10299823 发表于 2022-12-6 14:08 | 显示全部楼层
可以使用硬件iic驱动BH1750吗?
beacherblack 发表于 2022-12-6 16:26 | 显示全部楼层
BH1750怎么才能检测太阳强度,控制芯片呢。
mollylawrence 发表于 2022-12-10 08:08 | 显示全部楼层
BH1750好用很多。              
 楼主| jinglixixi 发表于 2022-12-10 11:11 | 显示全部楼层

没错,无需数值标度处理。
 楼主| jinglixixi 发表于 2022-12-10 11:11 | 显示全部楼层
10299823 发表于 2022-12-6 14:08
可以使用硬件iic驱动BH1750吗?

应该没问题
 楼主| jinglixixi 发表于 2022-12-10 11:12 | 显示全部楼层
beacherblack 发表于 2022-12-6 16:26
BH1750怎么才能检测太阳强度,控制芯片呢。

应该无差别
tpgf 发表于 2023-1-1 15:29 | 显示全部楼层
光照强度的检测结果和检测环境有关系吗
nawu 发表于 2023-1-1 15:40 | 显示全部楼层
我们一般买回来的这种检测光强度的传感器的通讯方式是什么呢
aoyi 发表于 2023-1-1 16:07 | 显示全部楼层
光照强度检测的精度都和什么参数有关系呢
zljiu 发表于 2023-1-1 16:33 | 显示全部楼层
这个光照强度的检测的实时性能达到多少啊
gwsan 发表于 2023-1-1 16:42 | 显示全部楼层
BH1750这个芯片用的还是非常多的  不过可能芯片比较老了  精度还是有待改善
tfqi 发表于 2023-1-1 16:51 | 显示全部楼层
这种检测器件的最大的特点就是非常的小巧  但是不知道应用环境是不是能禁得住考验
 楼主| jinglixixi 发表于 2023-1-2 00:08 | 显示全部楼层
tfqi 发表于 2023-1-1 16:51
这种检测器件的最大的特点就是非常的小巧  但是不知道应用环境是不是能禁得住考验 ...

那要看具体情况了,民用一般没问题。
 楼主| jinglixixi 发表于 2023-1-2 00:09 | 显示全部楼层
1988020566 发表于 2022-12-6 13:59
这个标定好的信号吗?

没错
 楼主| jinglixixi 发表于 2023-1-2 00:10 | 显示全部楼层
10299823 发表于 2022-12-6 14:08
可以使用硬件iic驱动BH1750吗?

应该可以,但不如这样方便。
 楼主| jinglixixi 发表于 2023-1-2 00:10 | 显示全部楼层
nawu 发表于 2023-1-1 15:40
我们一般买回来的这种检测光强度的传感器的通讯方式是什么呢

I2C
 楼主| jinglixixi 发表于 2023-1-2 00:12 | 显示全部楼层
zljiu 发表于 2023-1-1 16:33
这个光照强度的检测的实时性能达到多少啊

关心的话,查下手册。
Jacquetry 发表于 2023-1-5 17:16 | 显示全部楼层
10299823 发表于 2022-12-6 14:08
可以使用硬件iic驱动BH1750吗?

硬件iic有可能会出问题 吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

515

主题

2929

帖子

39

粉丝
快速回复 返回顶部 返回列表