杨世权,张谦述,周 聪
(西华师范大学电子信息工程学院,四川 南充 637009)
随着科学技术的不断发展,智能家居、智能农业和智能园林开始出现,其中光照强度是一项重要的环境参数。在家居环境中,光照度影响着人们的舒适度。农业种植中,适当的光照量对瓜果蔬菜的生长十分重要。园林中,适当光照度可以让花草生长得更好。文献[1]提出了单个BH1750光强检测系统的设计,但没有提到多个BH1750的应用和相应的实验数据。文献[2]给出了设计一种光照强度测试仪,但存在处理器较落后、处理速度慢和显示器分辨率低等不足。文献[3]提出将BH1750与串口相结合,将光强数据上传到电脑上显示,但没给出相应的软件实现程序。综上,本文提出并实现了多路BH1750光强检测系统,实验表明该系统具有精度高、可移植性强、输出范围广和稳定性好等优点。
系统主要由STM32F4控制器、BH1750传感器、TFTLCD显示器组成。
系统由室外环境和控制室的控制器两部分构成。采用STM32芯片作为控制芯片,首先室外场地光强通过BH1750进行采集,其内部AD器件把采集的模拟量转换为数字量,STM32F4处理器根据器件从地址的不同来读取不同传感器采集的光照数据,最后把读取并转换后的数据送给LCD进行显示。多路光强检测系统总体框图如图1所示。
图1 多路光强检测系统总体框图
系统总体设计原理图如下图2所示。
图2 总体设计原理图
在控制器选型方面,有两种方案,传统的51单片机和新兴的STM32F4单片机。两种控制器性能对比情况如下表1所示。
表1 控制器性能对比表
通过上表可以看出,STM32F4在许多方面优于51单片机,因此本系统采用意法半导体公司(ST)推出的基于ARM Cortex-M4内核处理器芯片STM32F407ZGT6作为系统的主控芯片[4]。
本系统光强传感器选用BH1750,BH1750是一种用于两线式串行总线接口的数字型光强传感器。BH1750传感器内部有16位模数转换器,传感器的测量范围为(1Lx-65535Lx)[5]。BH1750通过I2C协议与控制器STM32F4进行通信。本文用软件来模拟I2C协议,使系统运行速率和稳定性得到提高。模拟的I2C端口可接收数据和发送数据。发送时,将并行数据转换成串行数据;接收时,把串行数据转换成并行。传感器通过自身时钟引脚和数据引脚连接到I2C总线上,I2C总线运行速度可达100KHz~400KHz[6]。BH1750FVI有三中测量模式,每种测量模式又分两种方式,单次测量和连续测量。
本系统模拟两路I2C总线,而每一路根据器件从地址不同(即ADDR接高电平或低电平),可搭载两个BH1750,所以共有4个BH1750传感器,STM32F4与BH1750连接电路图如图3所示。
在LCD选型方面,有两种方案可供选择,LCD1602和2.8寸TFTLCD。2.8寸TFTLCD是彩色主动显示屏幕,分辨率为240*320;LCD1602是黑白TN显示屏幕,分辨率仅为5*8。可见,TFTLCD要明显优于LCD1602,因此本系统采用TFTLCD作为显示模块。
图3 STM32F4与BH1750连接电路图
系统软件设计流程为开启BH1750,等待测量指令。接着发送测量命令,BH1750以连续高分辨率模式进行数据测量。时分复用,开启第2个BH1750传感器。发送测量命令,BH1750以连续高分辨率模式进行数据测量。控制器读取并转换数据,将转换后的数据送给显示器。依次类推,直到读取最后一个传感器后,返回进行下一轮测量。软件设计流程如图4所示。
图4 软件设计流程图
I2C总线的SDA和SCL两条信号线同时处于高电平时,规定为总线的空闲状态。当SCL为高期间,SDA由高跳变到低,此时为启动信号;当SCL为高期间,SDA由低到跳变高,此时为停止信号。发送器每发送一个字节时,在时钟脉冲9期间释放数据线,由接收器反馈一个应答信号。应答信号为低电平时,规定为有效应答位(ACK简称应答位),表示接收器成功接收了该字节;应答信号为高电平时,规定为非应答位(NACK),一般表示接收器接收该字节没有成功。为保证数据有效传送,数据在SCL的上升沿到来之前就需准备好,并在下降沿到来之前必须稳定[7]。I2C总线接口时序图如图5所示。
图5 I2C总线接口时序图
从属地址有两种类型,它是被ADDR端口决定。
ADDR=‘H’(ADDR≥0.7VCC)→“1011100”
ADDR=‘L’(ADDR≤0.3VCC)→“0100011”
从“写指令”到“读出测试结果”设计实例如下。
实例:连续高分辨率模式(ADDR=‘L’)
1)发送“连续高分辨率模式”指令:
2)等待完成第一次高分辨率模式测量。(允许最长时间180 ms);
3)读取测量结果:
当数据高字节是“10000011”和低字节是“10010000”
(215+29+28+27+24)/1.2=28067[Lux]
连续测量模式的结果是不断更新的。(高分辨率模式典型时间是120ms,低分辨率模式时间是16ms)
初始化程序:
extern float temp,temp1;//定义外部变量
extern float temp2,temp3;//定义外部变量
u16 i=0;
delay-init(168);//初始化延时函数
uart-init(115200); //初始化串口波特率为115200
LCD-Init();//LCD初始化
Init-BH1750(); //I2C初始化
Init-BH1751(); //I2C初始化
Init-BH17502(); //I2C初始化
Init-BH17503();//I2C初始化
delay-ms(180);//延时180ms
POINT-COLOR=RED;//设置显示字体为红色
LCD-ShowString(40,70,200,24,24,"Light:");//固定要显示的位置
LCD-ShowString(40,100,200,24,24,"Light1:");//固定要显示的位置
LCD-ShowString(40,100,200,24,24,"Light2:");//固定要显示的位置
LCD-ShowString(40,100,200,24,24,"Light3:");//固定要显示的位置
光照数据采集及显示程序:
Start-BH1750();//开启BH1750
Start-BH17501();//开启BH17501
Start-BH17502();//开启BH17502
Start-BH17503();//开启BH17503
delay-ms(180);//延时180ms,给传感器相应反应时间
Read-BH1750();//连续读取数据存储在buf中
Read-BH17501();//连续读取数据存储在buf中
Read-BH17502();//连续读取数据存储在buf中
Read-BH17503();//连续读取数据存储在buf中
Convert-BH1750();//将采集的数据转换成相应光照度
Convert-BH17501();//将采集的数据转换成相应光照度
Convert-BH17502();//将采集的数据转换成相应光照度
Convert-BH17503();//将采集的数据转换成相应光照度
LCD-ShowxNum(120,70,temp,6,12,0);//显示转换后的结果
LCD-ShowxNum(120,82,temp1,6,12,0);//显示转换后的结果
LCD-ShowxNum(120,94,temp2,6,12,0);//显示转换后的结果
LCD-ShowxNum(120,106,temp3,6,12,0);//显示转换后的结果
选取该系统一个BH1750传感器与照度计所测光照度进行对比,分时测试了20 组数据如图6所示,N表示测试次数。从图中可以看出,检测系统与照度计的测量值相差很小,几乎完全重合,反应出BH1750检测系统的准确性。随后对其它BH1750传感器进行测试,实验结论相同。
图6 系统和照度计测量值
保持各个场地光照度不变,四个传感器进行多次光强检测,检测数据如表2所示。
表2 检测数据
其系统平均相对误差、平均绝对误差和均方根误差如表3所示。
表3 系统误差分析
从表3可以看出,平均相对误差小于0.6%,平均绝对误差在1Lx以下,均方根误差最大仅为1.08Lx,反映出该系统稳定性好、精密度高、抗干扰性强。
通过对系统进行多次测试验证,该系统能准确测量不同场地的光强变化,把不同场地光强信息反馈给显示器,方便物主获取信息,并对不同场地进行管理。该系统具有体积小、功耗低、成本低、移植性好等特点,在农业种植和园林绿化等光照控制领域,具有广泛的应用价值。