今天给大家介绍一块嵌入式毕设中也经常用到的一款传感器——BH1750光照传感器,如下图。(该传感器的购买链接和代码我已放在资料里,想要资料的同学,评论区留下邮箱即可)相比光敏传感器,它可以直接输出环境光照强度的数值(范围是0~65535lx),非常适合懒人党,各位的传感器买到手后,赶紧跟着文章试试吧!
首先,BH1750光照传感器上有5根引脚,分别是连接3.3V的VCC、接地的GND、连接IIC时钟线的SCL引脚,连接IIC数据线的SDA引脚和ADDR引脚。关于ADDR引脚,我们可以不用管它。拿到BH1750传感器模块后,按照资料提供的接线图(下图)用杜邦线将STM32、BH1750和USB转TTL模块连接起来,再通过烧录器将下面的例程代码烧录进STM32即可看到效果(USB转TTL要连接电脑)。
接下来讲解BH1750的STM32例程代码程序。
第11行 delay_init( ) 初始化延时函数,执行这条语句后,延时效果才会准确。
第13行 NVIC_PriorityGroupConfig( )是设置中断优先级分组。
第15行 USART_Config( ) 初始化串口1函数,该串口用来打印光照强度值。资料提供的程序用的串口1来打印,到时大家根据自身需要,在uart.h文件里面打开对应的串口注释就可以使用对应的串口了。
第17行 BH1750_Init( ) 初始化光照传感器模块。里面初始化了A6和PA7引脚来进行IIC通讯,和发送上电指令给BH1750传感器。
第19~20行 BH1750_Data_Send( )的作用是将括号里的数据通过IIC方式发送给BH1750传感器模块,BH1750传感器接收到数据后就会去执行相关操作。
比如第19行的BH1750_Data_Send(0x07)是让BH1750传感器内部存储光照数值的寄存器的值重置为默认值。BH1750_Data_Send(0x10)是设置BH1750传感器工作在高精度测量模式。
第22行 delay_ms(180) 延时180ms,等待模块准备完成并开始测量。以上,我们就设置好了BH1750传感器模块的工作模式,到时候程序运行完第17~20行这段代码就会按照我们设置的模式开始工作,剩下的就是在while(1)里调用第26行的 BH1750_Data_Read( ) 进行读取光照值数据即可。
第26行 是获取真实的光照轻度值,BH1750_Data_Read( )函数会返回BH1750传感器检测到的光照值,然后除以1.2得到的就是真实的光照强度值了。
第27行 串口1打印真实的光照强度值—LIGHTstreng,其中" %8.2f "的作用是让输出的数据保留两位小数。
实现效果如下:
串口助手显示BH1750光照值
在上面我们已经学会了使用BH1750模块测量周围环境的光照强度并进行光强的数值打印。接下来我们结合第七章(STM32+OLED+DHT11)的代码,实现OLED上显示光照强度值。
首先打开BH1750的工程文件和第七章的工程文件,因为BH1750与STM32之间是通过I2C进行通讯的,所以我们把I2C驱动源码文件移植到第七章的工程文件中,按下图操作。
移植完I2C驱动源码文件后,我们就可以将包含STM32与BH1750通讯的函数代码文件也移植过来。由于BH1750的代码工程已将这部分内容都整合在上面移植的BH1750文件内了,所以文件方面的移植只要完成上图的操作就可以了。
接下来打开第七章的代码,进行下图操作,将包含I2C驱动源码和STM32与BH1750通讯的函数代码C文件添加进工程中。
在弹出的窗口进行下图操作。
所需的C文件添加进来后,再将移植过来的BH1750文件添加到编译路径。具体操作如下:
1.点击图中红色框的“魔法棒”图标。
2.点击“魔法棒”后会弹出下图中的窗口,先点击窗口顶部的 C/C++ (图中1号标位置),然后点击图中2号标位置。
3.完成2的步骤后,会弹出下图中的窗口,先点击1号标的位置,会弹出下面蓝色区域的长条框,长条框里面就可以添加我们要新的编译路径。怎么添加呢?我们点击长条框右侧的地方(2号标位置),找到刚从BH1750工程文件移植过来的BH1750文件即可。
4.如下图所示就是将移植过来的BH1750文件添加到代码编译路径的结果图,然后点击OK推出就可以啦。
做完上图操作,我们就可以调用bh1750.c里面函数了。
1.首先在第七章代码的main.c开头添加bh750.h头文件(第1个箭头指示);
2.声明一个float类型变量lightvalue和两个uint32_t类型的变量lightV_H和lightV_L(第2个箭头指示,变量lightvalue存储光照强度数值,变量lightV_H和lightV_L分别用来存储光照强度数值的整数位和小数位);
3.然后再调用BH1750模块初始化函数、重置BH1750内部数据寄存器函数和设置其工作模式的函数让BH1750开始工作(第3个箭头指示);
4.第4个红框的代码实现在OLED上显示”光照:lx”的字样;
5.第5个红框的代码就是将BH1750获取到的光照值转换成光照强度值赋值并将光照强度值的整数和小数位分别复制给变量lightV_H和lightV_L;
6.然后再调用第6个框框的代码将光照强度值得整数位和小数位进行显示,到此就大功告成啦。
按照下面的接线图,用杜邦线将每个模块接到STM32上,然后将上面移植完成的代码烧录进STM32就可以看到效果了。
实现效果如下:
STM32+OLED+BH1750显示光照值强度