打印
[活动专区]

【AutoChips 7801x MCU评测报告】+光强检测仪

[复制链接]
817|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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);

配合器件读取的辅助函数有:
void BH1750_Start()
{
           IIC_OUTPUT_MODE_SET();
           SDA_Set();
           SCL_Set();
          udelay(5);
           SDA_Clr();
           udelay(5);
           SCL_Clr();
}
void BH1750_Stop()
{
         IIC_OUTPUT_MODE_SET();
         SDA_Clr();
         SCL_Set();
         udelay(5);
         SDA_Set();
         udelay(5);
}

读取光强的函数为:
void Multiple_Read_BH1750()
{  
         BH1750_Start();
         BH1750_SendByte(SlaveAddress+1);
         BH1750_RecvACK();
         BUF[0] = BH1750_RecvByte();
         BH1750_SendACK(0);
         BUF[1] = BH1750_RecvByte();
         BH1750_SendACK(1);
         BH1750_Stop();
         mdelay(5);
}

显示光强测量值得函数为:
void Get_Sunlight_Value()
{
         int dis_data=0;
         float temp;
         char i=0;
         unsigned int sd;
         Single_Write_BH1750(0x01);  // power on
         Single_Write_BH1750(0x10);  // H- resolution mode
         mdelay(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;
         printf("Sunlight=%0.2f lx\r\n",temp);
         sd=temp;
         OLED_ShowNum(0,4,sd,5,16);
}

实现图1和图2显示效果的主程序为:
int main(void)
{
           InitDelay();
           InitDebug();
           OLED_Init();
           OLED_Clear();
           OLED_ShowString(0,0,"AC8710 TEST",16);
           OLED_ShowString(0,2,"BH1750:",16);
           OLED_ShowString(48,4,"lx",16);
           IIC_Init();
           while(1)
           {
                     Get_Sunlight_Value();
                     mdelay(1000);
           }
}


                              
1 串口显示效果

2 光强显示效果

使用特权

评论回复

相关下载

相关帖子

沙发
Cjy_JDxy| | 2020-6-8 14:34 | 只看该作者
你的小模块不少

使用特权

评论回复
板凳
jinglixixi|  楼主 | 2020-6-8 22:33 | 只看该作者
贵的买不起只好买些小玩意儿了!

使用特权

评论回复
地板
caizhiwei| | 2020-6-9 09:00 | 只看该作者
赞!

使用特权

评论回复
5
jinglixixi|  楼主 | 2020-6-9 13:40 | 只看该作者

感谢支持!

使用特权

评论回复
6
renzheshengui| | 2020-7-7 14:19 | 只看该作者
非常感谢楼主分享

使用特权

评论回复
7
wakayi| | 2020-7-7 14:20 | 只看该作者
有没有使用中环境的限制呢

使用特权

评论回复
8
wowu| | 2020-7-7 14:24 | 只看该作者
代码太规矩了

使用特权

评论回复
9
xiaoqizi| | 2020-7-7 14:24 | 只看该作者
不是用的io口模拟的iic是吗

使用特权

评论回复
10
木木guainv| | 2020-7-7 14:25 | 只看该作者
感谢楼主的分享

使用特权

评论回复
11
jinglixixi|  楼主 | 2020-7-8 00:11 | 只看该作者
xiaoqizi 发表于 2020-7-7 14:24
不是用的io口模拟的iic是吗

是的

使用特权

评论回复
12
jinglixixi|  楼主 | 2020-7-8 00:12 | 只看该作者
wakayi 发表于 2020-7-7 14:20
有没有使用中环境的限制呢

非强磁、强电场的环境应该没问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

446

主题

2675

帖子

37

粉丝