1 引言
在农业生产中,仅仅依靠人力对多个大棚进行环境监测,显然是一种效率低、实时性差又耗费人力资源的做法。甚至当未排查到的大棚存在安全隐患时,由于农主无法及时获得大棚的环境信息,使作物受到恶劣环境的侵害。由此,自动环境监测系统应运而生。该系统实现了在无人监守的情况下对大棚环境的自动监测,减轻人员工作量,提高生产效率。设计优势在于系统可自动采集各项环境指标,并通过无线网络传输数据。用户不必亲临现场,仅通过一台主机就可监测多个大棚的环境状态。系统还可根据需要,将各个大棚的环境指标进行存储与分析,以便用户安排部署下一步工作。系统主控器选用32位ARM处理器STM32f103,在实现系统显示采集传输等功能的前提下降低了成本。数据传输也不再使用传统的布线方式,而是选用ZigBee无线组网方式,免除了手工布线的麻烦与不便。不同的农作物对环境的要求不同,设定报警值时,用户可根据农作物的习性对大棚光照强度、空气湿度、土壤温度、土壤水分等上下限报警值做手动调整。当某项指标高于或低于报警值时,系统自动开启报警功能。报警功能采用的是PC机、手机、大棚蜂鸣器三方报警机制,以便用户可第一时间了解大棚环境状况,并及时采取措施消除隐患。
2 系统整体设计方案
如图1所示,从控制的角度来说,系统由上位机主控制器与下位机的采集部分构成。从组网角度看,系统分为三层,即包含主机部分的协调器层,数据汇集点路由层,及集成环境指标采集功能的终端节点层,结构如图1所示。协调器层仅有一台主机和一个连接MAX232的CC2530无线模块,系统仅通过协调器层的PC机实现了对所有大棚的上下限参数设定与环境状况监测。终端节点装配有STM32f103控制器、CC2530模块与传感器,节点分布在各个大棚中执行采集数据、传输数据、显示数据三项功能。用户可以通过终端节点的人机交互界面了解其他大棚环境信息。为保证远距离传输条件下数据的完整性与可靠性,仅装有CC2530模块的路由层仅负责存储或转发父子节点数据[1]。当有状况发生,大棚蜂鸣器自动报警,同时将状态信息通过CC2530和GPRS模块分别传输到主站PC机及用户手机上,方便用户及时了解大棚状态。
3 下位机系统的硬件及程序设计
(1) 下位机电路设计
以STM32f103作为主控器,利用其串行外设接口SPI、I2C总线分别连接无线设备CC2530、存储设备24C512以及温湿度传感器SHT71。时间由芯片DS1302提供,手机短信收发模块使用华为公司生产的GPRS模块GTM900。光照采集选用太阳能光电池,由于采集信号为0~600mV的电压量,经过LM358放大连接到STM32f103的12位AD转换器接口。土壤湿度传感器FDS100输出的模拟信号量可以直接使用STM32f103的内部AD转换器进行模数转换。如图2所示,利用STM32f103处理器的FSMC接口驱动TFT-LCD以及利用SPI接口与ADS7246连接,通过ADS7246获取触摸屏返回数据。
(2) UCOS-II与UCGUI的移植
UCOS-II系统可管理多项任务,而任务、函数与服务执行时间具有可确定性,不依赖任务数目的多少。和大多数商业内核相同,UCOS-II是完全可剥夺的实时内核,即任务调度时总是执行就绪列表中优先级最高的任务。此外,UCOS-II提供多种系统服务及中断管理功能,使系统具有很高的灵活性。UCGUI是嵌入式用户图形界面,为编写人机交互界面提供了方便[5]。
移植的准备工作:先把UCOS-II文件系统所有的文件加载到工程中,修改OS_CPU.H,OS_CPU_C.C,OS_CPU.ASM三个相关文件。其中OS_CPU.H仅仅是设置处理器与编译器相关的代码,包括定义数据类型、处理器堆栈数据类型字长,堆栈增长方向,任务切换宏和临界区访问处理[4]。OS_CPU_C.C中主要改写OSTaskStkInit()函数,为任务堆栈做初始化工作。OS_CPU.ASM中用汇编语言编写四个函数:启动多任务调度的函数OSStartHighRdy();实现用户级任务上下文切换的函数OSCtxSw();时钟节拍中断服务子函数OSTickISR(),该函数保证时钟节拍为10~100次/秒;中断任务切换函数OSIntCtSw()。移植UCGUI则需更改三个配置文件GUIConf.H,GUITouchconf.H,LCDConf.H,并将GUI底层驱动文件中的初始化函数、画点函数与获取某点颜色函数进行修改,或利用宏定义配置成之前自己已经优化好的函数。
(3) 下位机程序设计
UC/OS-II程序的运行基于各项任务的执行与切换。因此要实现期望的功能,首先必须建立任务并定义各项任务的优先级。创建主任务TASK_START,并在主任务中建立各项任务,包括UC/GUI用户界面任务TASK_USERIF,触摸屏任务TASK_KBD,室内温湿度检测任务TASK_SHT71,土壤水分及光照检测任务TASK_FDS100及TASK_ILLU,执行上位机命令任务TASK_CC2530,读取记录任务TASK_READ,存储记录任务TASK_SAVE,当然还要包括优先级最低空闲任务OS_TaskIdle,以及优先级次低统计运行时间的任务OS_TaskStat。
由于各个任务之间需要彼此合作,有些任务执行要有先后次序才能保证系统顺利进行。因而要引入事件控制块来协调各个任务,保证任务有序运行。
建立任务TASK_CC2530时首先建立消息邮箱CC2530_MBOX=OSMboxCreate((void *) 0)。当STM32f103模块接收到CC2530通过SPI总线发送的命令帧时,进入中断,在中断根据不同的命令再次进行消息投递。处理函数中通过消息邮箱向执行上位机命令任务TASK_CC2530投递处理命令OSMBboxPost(CC2530_MBOX,msg)。任务TASK_CC2530通过消息邮箱OSMboxPend(CC2530_MBOX,0,&err)接收并执行命令。由于执行上位机命令的任务中包括很多种指示,为了将数据与命令区分开,所有数据均以十进制BCD码的格式传输,而命令字以十六进制数“A~F”的组合构成命令集合。
对于采集和存储的协调,程序引入信号量集做判断,当温湿度采集、光照强度和土壤水分采集工作结束,分别发送0、1、2位信号量。只有当三个信号量同时存在的时候系统才执行存储任务。这里仅写出TASK_SHT71任务发送信号量和TASK_SAVE接收三个信号量的代码。
TASK_SHT71任务中发送0位信号量函数:
OSFlagPost( Sem_F,
//发送信号量集
(OS_FLAGS)1,
//给第0位发信号
OS_FLAG_SET,
//信号置1
&err );
TASK_SAVE任务中等待三个信号量投递的函数:
OSFlagPend( Sem_F,
//请求信号量集
(OS_FLAGS)7,
//请求第0、1、2位信号
OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,
//第0、1位信号都有效,并清空信号量
0,
&err);
终端节点工作流程:STM32f103进入多任务系统运行状态后,依据各个任务优先级及延时时间执行任务。当未接收上位机命令时,执行各项采集任务与存储任务,并在存储数据时读取DS1302的时间,将当前AT24C512存储位置记录到STM32f103内部EEPROM的前两个字节,每次存储前先到芯片内部读取地址,保证本次数据顺序存储而不是覆盖原有数据。当上位机备发送的命令时,与下位机的无线模块CC2530接收数据并通过SPI总线将数据传输给STM32。STM32接收数据时进入中断,在中断函数中投递消息邮箱。由于执行上位机命令的任务优先级最高,因而CPU在下次调度的时候由于接受到消息邮箱投递的命令而从就绪态进入运行态。根据邮箱消息的不同,执行不同的操作。当没有接收上位机命令的时候,系统只执行采集存储任务,而将执行上位机命令这项任务挂起。
4 通信协议及上位机软件设计
(1) zigbee组网设计
基于IEEE802.15.4协议,zigbee强大的组网功能是保证无线传输距离的关键。整个网络是由协调器、路由器、终端节点构成簇树拓扑结构网络。当与PC机相连的具有组网功能的协调器节点被激活时,首先进行主动的信道扫描,选择最佳信道。信道选择成功后,协调器改为被动信道扫描方式,接收子节点入网申请。如果子节点找到网络并获取网络信息,就会向父节点协调器发送入网申请,协调器通过对请求信息的判断,决定是否响应子节点。如果协调器允许子节点加入网络,就会向该子节点一个分配给它的16位短地址码作为子节点的网络唯一标识符[2]。随后新建节点会向协调器节点发送一个包含自身物理地址和段地址码的信息,以便协调器了解是哪个子节点加入网络,协调器短地址为0x0000。流程图如图4所示。
终端节点的无线模块CC2530初始化后加入网络,进入休眠状态,等待父节点发送中断信号唤醒。父节点的作用是侦听信道,转发数据及分析数据包为上行数据还是下行数据。如果终端接收到父节点发送的命令则判断命令类型。如果是单次采集命令,则启动SPI总线,读取stm32f103最近一次历史记录。如果是连续采集命令,则定时读取STM32f103实时数据。如果是配置命令,则修改STM32f103的上下限报警值。如果是读取历史记录命令,则将历史记录连续读入到闪存,通过无线传上传到PC机上。完成上位机要求的传输任务,CC2530自动进入休眠状态。如图5所示,当一台终端设备向另一台终端设备发送数据时,必须通过其父节点,并由父节点通过轮询方式查找到相应的终端[3]。
(2) 上位机软件设计
上位机控制器使用Visual Basic 6.0进行编写。
串口设置:既进行选择串口取与波特率配置,可选串口为COM1到COM20,波特率为1200,2400,4800,9600,115200。
节点设置:包括读取当前在线节点的网络地址与物理地址,读取并校正下位机时间信息,指定温湿度探头,修正光照结果与设置下位机存储记录的间隔。其中对下位机存储间隔的修正参数savetime将直接写入任务TASK_SAVE任务中的OSTimeDlyHMSM(0, 0, savetime, 0)中,最小单位为分钟。
数据采集:用户可根据需要,手动或自动读取各个大棚实时监测结果。自动读取时可设定读取间隔,及是否进行在线大棚轮询读取。而读取历史记录时,用户可以任意输入要读取的条数,上位机根据读取条数进行命令投递与读取的总记录数自减操作,命令投递包括下位机节点地址与要读取的记录在24C512中的位置,待读取24C512的首地址值在上位机中自行更正。下位机接收到上位机发送的读取命令,从24C512中读取记录,并发送数据与校验和。用户也可手动终止读取记录操作,而下次读取记录操作又从最近一次记录开始回读。如果回读到最低地址,则从最高地址继续回读。读回的数据显示在listview表格中。
报警指示:当某项指数超标,或者线路收到干扰传输错误数据的时候,在报警指示栏中显示错误信息。
数据存储:调用txt存储数据,存储时自动去除残缺记录并对校验和正确的完整进行存储。
绘制曲线:读取已存储的txt文件,显示在listview表格中,并绘制连续曲线。标识时间间隔与起始停止时间。坐标轴刻度根据读取点数变化,直观显示近期环境变化情况。
5 数据采集结果
实地温室检测实验读取1号到4号大棚的历史记录,在采集存储记录大棚地址栏中分别输入大棚地址及读取记录组数。并矫正5号大棚时间,然后按照存储间隔读取5号大棚实时数据,如图6所示。如果用户勾选轮询读取信息复选键时,上位机每隔5s显示下一个大棚的实时环境信息;在没有勾选轮询读取键时,上位机不做轮询显示,只是实时显示当前大棚的环境信息。当有异常情况时,报警指示状态栏将显示当前状况。
6 结束语
基于STM32f103的农业大棚环境监测系统实现了对多个大棚的实时监测,在很大程度上节约了人力资源,方便农业生产的统一管理,加速了农业生产自动化的进程。同时,系统选用价格低廉、可靠性高的CC2530及32位处理器STM32f103做网络节点传输及主控芯片,在节约成本的基础上,体现出zigbee与arm7结合应用的优势,最终实现大棚环境自动监测功能。实验结果表明,系统稳定性高,总功耗低,网络节点灵活,实现了对农业大棚环境的自动监测,为农业灌溉的实施提供有利依据。
参考文献:
[1] 金晓龙.基于Zigbee的粮仓无线测温系统的设计[J].测控技术,2011,30(10):44-47.
[2] 杨啸宇,孙杰,熊瑛.基于STM32的无线传感器网关设计[J].天津理工大学学报,2011,27(2):21-26.
[3] 丁凡,周永明.基于STM32和ZigBee的无线校园火灾报警系统设计[J].微型机与应用,2012,31(6):43-45.
[4] 刘波文.ARM Cortex-M3应用开发实例详解[M].北京:电子工业出版社,2011,2.
[5] 任哲.嵌入式实时操作系统UC/OS-II原理及应用(第2版)[M].北京:北京航空航天大学出版社,2009,10.
[6] 江虹,刘骊.ZigBee技术在智能家居控制器中的应用研究[J].云南大学学报(自然科学版),2009,31(S1):109-113.
作者简介:李西(1988-),女,硕士研究生,研究方向:物联网技术与嵌入式应用。