[活动专区] 【AutoChips 7801x MCU评测报告】+光强检测仪

[复制链接]
1514|11
 楼主| jinglixixi 发表于 2020-6-8 08:32 | 显示全部楼层 |阅读模式
本帖最后由 jinglixixi 于 2020-6-11 13:51 编辑

BH1750是一款基于I2C接口的数字式光照强度传感器,测量单位为lx。使用它与OLED屏结合即可构成一个光强检测仪,并形成双I2C器件的构成结构,其中
OLED屏使用I2C_1接口,BH1750使用I2C_0接口。

为了使 BH1750工作,它的SDA接 PB8,SCLA接 PB7,所作的相关定义语句如下:
#define IIC_SDA_IN    GPIO_GetPinLevel(GPIOB, GPIO_PIN8)

#define IIC_INPUT_MODE_SET()   GPIO_SetDir(GPIOB, GPIO_PIN8, GPIO_IN);         
#define IIC_OUTPUT_MODE_SET()  GPIO_SetDir(GPIOB, GPIO_PIN8, GPIO_OUT);

#define IIC_WRITE      0   
#define IIC_READ       1   
#define     SlaveAddress   0x46  

#define SCL_Set()        GPIO_SetPinLevel(GPIOB, GPIO_PIN7,GPIO_LEVEL_HIGH);  // PB7
#define SCL_Clr()        GPIO_SetPinLevel(GPIOB, GPIO_PIN7,GPIO_LEVEL_LOW);

#define SDA_Set()        GPIO_SetPinLevel(GPIOB, GPIO_PIN8,GPIO_LEVEL_HIGH);  // PB8
#define SDA_Clr()        GPIO_SetPinLevel(GPIOB, GPIO_PIN8,GPIO_LEVEL_LOW);

配合器件读取的辅助函数有:
  1. void BH1750_Start()
  2. {
  3.            IIC_OUTPUT_MODE_SET();
  4.            SDA_Set();
  5.            SCL_Set();
  6.           udelay(5);
  7.            SDA_Clr();
  8.            udelay(5);
  9.            SCL_Clr();
  10. }
  1. void BH1750_Stop()
  2. {
  3.          IIC_OUTPUT_MODE_SET();
  4.          SDA_Clr();
  5.          SCL_Set();
  6.          udelay(5);
  7.          SDA_Set();
  8.          udelay(5);
  9. }

读取光强的函数为:
  1. void Multiple_Read_BH1750()
  2. {  
  3.          BH1750_Start();
  4.          BH1750_SendByte(SlaveAddress+1);
  5.          BH1750_RecvACK();
  6.          BUF[0] = BH1750_RecvByte();
  7.          BH1750_SendACK(0);
  8.          BUF[1] = BH1750_RecvByte();
  9.          BH1750_SendACK(1);
  10.          BH1750_Stop();
  11.          mdelay(5);
  12. }

显示光强测量值得函数为:
  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);  // power on
  8.          Single_Write_BH1750(0x10);  // H- resolution mode
  9.          mdelay(180);
  10.          Multiple_Read_BH1750();
  11.          for(i=0;i<3;i++)
  12.          dis_data=BUF[0];
  13.          dis_data=(dis_data<<8)+BUF[1];
  14.          temp=(float)dis_data/1.2;
  15.          printf("Sunlight=%0.2f lx\r\n",temp);
  16.          sd=temp;
  17.          OLED_ShowNum(0,4,sd,5,16);
  18. }

实现图1和图2显示效果的主程序为:
  1. int main(void)
  2. {
  3.            InitDelay();
  4.            InitDebug();
  5.            OLED_Init();
  6.            OLED_Clear();
  7.            OLED_ShowString(0,0,"AC8710 TEST",16);
  8.            OLED_ShowString(0,2,"BH1750:",16);
  9.            OLED_ShowString(48,4,"lx",16);
  10.            IIC_Init();
  11.            while(1)
  12.            {
  13.                      Get_Sunlight_Value();
  14.                      mdelay(1000);
  15.            }
  16. }


360截图16190827142262.png
                              
1 串口显示效果

a.png
2 光强显示效果
Cjy_JDxy 发表于 2020-6-8 14:34 | 显示全部楼层
你的小模块不少
 楼主| jinglixixi 发表于 2020-6-8 22:33 来自手机 | 显示全部楼层
贵的买不起只好买些小玩意儿了!
caizhiwei 发表于 2020-6-9 09:00 | 显示全部楼层
 楼主| jinglixixi 发表于 2020-6-9 13:40 | 显示全部楼层
renzheshengui 发表于 2020-7-7 14:19 | 显示全部楼层
非常感谢楼主分享
wakayi 发表于 2020-7-7 14:20 | 显示全部楼层
有没有使用中环境的限制呢
wowu 发表于 2020-7-7 14:24 | 显示全部楼层
代码太规矩了
xiaoqizi 发表于 2020-7-7 14:24 | 显示全部楼层
不是用的io口模拟的iic是吗
木木guainv 发表于 2020-7-7 14:25 | 显示全部楼层
感谢楼主的分享
 楼主| jinglixixi 发表于 2020-7-8 00:11 | 显示全部楼层
xiaoqizi 发表于 2020-7-7 14:24
不是用的io口模拟的iic是吗

是的
 楼主| jinglixixi 发表于 2020-7-8 00:12 | 显示全部楼层
wakayi 发表于 2020-7-7 14:20
有没有使用中环境的限制呢

非强磁、强电场的环境应该没问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

522

主题

2952

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部