,,,, ,,
(1.青岛科技大学 机电工程学院,青岛 266061;2.山东省高分子材料先进制造技术重点实验室)
农业生产环境复杂多变,传统农业生产过程对各项参数全凭经验进行模糊处理,农作物的生长环境参数无法实时监测及追溯,不利于精准农业的推进。尽管在实际监测工作中已有很多环境参数监测系统,但此类系统大多需要在各监测节点之间组网,将数据汇总至本地服务器后上传广域网,需开发配套的上位机软件系统复杂,可拓展性差,不利于远程实时监测。同时,系统线路铺设复杂,在湿度高、光照强的环境中使用极易使线路老化,缩短使用寿命[1-3]。为解决上述问题,本文提出基于Arduino、ESP-01S和乐联网的环境参数实时监测设计方案,本方案将各监测节点采集的环境参数通过数据透传直接上传乐联网,结构简单,扩展性好。系统现已完成可靠性试验,即将投入农业环境参数的监测中使用。
环境参数监测系统按功能分为三部分:数据采集、数据记录及云端上传、数据实时监测与导出,系统总体结构如图1所示。
图1 系统总体结构
① 数据采集。此部分包含温湿度传感器、光照强度传感器及时钟模块,是系统的参数感知层,Arduino读取传感器传回的电信号并将其转换为环境参数。
② 数据记录及实时上传。此部分实现了数据存储、转发,是本系统的核心。系统根据时钟模块提供的时钟,每两分钟上传一次数据至乐联网服务器,每30 min系统存储一次数据至Micro SD卡。
③ 数据实时监测与报警。管理员可通过观察监测系统的LCD或通过手机等互联网设备获取实时数据。乐联网提供了参数超差提醒功能,用户可以对特别关注的参数定义报警区间,一旦检测到该参数超差,乐联网会自动发送短信或微信消息通知用户。
① Arduino UNO R3。
② ESP-01S WiFi模块。
③ DHT22温湿度传感器。
④ GY-30 光照强度传感器。
⑤ LCD5110。
⑥ DS3231 时钟模块。
⑦ Micro SD卡模块。
⑧ AMS1117-3.3 V降压模块。
硬件电路连接图如图2所示。
图2 系统硬件构成及连接
本系统的控制器选用Arduino UNO R3。 Arduino是一种开源硬件,用户可从开源网站上获取丰富的第三方库和示例程序,实现快速开发。Arduino UNO的微控制器核心是ATmega328,该处理器核心有14个数字输入/输出端口,其中6个可作为PWM输出,6个模拟输入端口[4]。Arduino支持标准串口通信、SPI通信以及I2C通信,这使Arduino传感器的选择范围大大增加。
ESP-01S是一款低功耗UART-WiFi模组,用户可通过AT指令将设备接入互联网。该模块使用ESP8266微型MCU作为核心芯片,模块集成有板载天线,支持IEEE802.11 b/g/n协议,完整的 TCP/IP协议栈。Arduino通过串口与ESP-01S通信,波特率为115 200,能高效地将数据发送至互联网。由于ESP-01S的工作电压为3.3 V,本系统使用AMS1117-3.3 V将Arduino输出的5 V电源降压后为模块供电。ESP-01S接入Arduino前,使用串口调试工具对其进行工作模式配置:
① 将ESP-01S预设为SoftAP+Station模式,并将此配置保存到Flash。管理员如需变更WiFi名称密码,只需用手机接入ESP-01S发射的WiFi热点进行配置,无需再次编程烧录,配网界面如图3所示。
图3 网络配置界面
② 将ESP-01S与乐联建立TCP透传。透传即透明传送,整个传输过程中不对数据进行二次加工,即不加密、不分组、不编码等,信息原封不动地到达数据接收端。ESP8266芯片提供了保存透传到Flash指令,将透传模式及建立的TCP连接保存在Flash区域,重新上电时自动建立与乐联网的TCP透传连接。
本系统选用LCD5110作为参数实时显示单元,其芯片核心为Philips PCD8544。PCD8544是低功耗CMOS LCD控制驱动器,芯片上集成所有的显示功能,通过SPI总线与Arduino通信,传输速度快。LCD5110内置背光,拥有52×52像素分辨率,可显示6行西文字符,单屏即可显示所有信息[5-6]。该屏幕驱动电压位宽,耗电量低,价格低廉,适合作为本系统的显示器。
DHT22温湿度传感器集成了一个NTC测温元件和一个电容式感湿元件,与8位单片机连接,该传感器具有响应速度快、性价比高、抗干扰能力强等优点。传感器采集数据过程中调用内部储存的校准系数进行校正,测量精度高。传感器采用单总线输出,与Arduino连接简单、传输距离远。
GY-30数字光强传感器通过I2C总线接入Arduino。I2C总线是一种多主机总线,可以灵活拓展传感器数量,如需增加传感器,将从端设备时钟线、数据线连接在一起,通过访问不同的地址即可读取目标传感器[7]。GY-30拥有接近视觉的光谱灵敏度特性,测量范围为1~65 535 lx,受红外线影响小。GY-30提供了三种测量模式,分别为高分辨率模式1、高分辨率模式2和低分辨率模式。本系统采用高分辨率模式2,此模式下采集的数据可抑制部分噪声,数据采集精度高。
该模块与Arduino通信方式为SPI总线通信,MISO、MOSI、SCK为SPI总线。通过文件系统及SPI接口驱动程序,Arduino即可完成对Micro SD卡的文件的读写。该模块内置电平转换电路,接口电平支持5 V和3.3 V。 Arduino IDE提供了SD卡读写库,用户可方便的在SD卡上创建、读取、更新、删除文件。本系统设定的数据存储间隔为30 min,存储格式为逗号分隔符格式(Comma-Separated Values, CSV),用此格式存储数据,可直接用EXCEL打开。
DS3231是高精度的I2C总线实时时钟,工作温度宽,内部集成的温补晶振和晶体使得DS3231的计时精度高达±2分钟/年。此模块内置的电池可以使时钟在断电情况下仍保持运行,是系统理想的时钟单元。
系统上电后首先初始化各传感器、时钟、各总线及串口。同时ESP-01S自动与乐联平台建立透传连接,WiFi接入点信息及透传建立命令存储于ESP-01S Flash中,无需Arduino再对其发送指令控制,节省了Arduino的内存开销,提高了程序循环效率。程序采用轮询方式判断是否需要上传数据及记录数据到Micro SD卡。程序流程图如图4所示。
图4 程序流程图
本系统有两个关键子程序:
① 向服务器发送数据。我们定义一个函数PostData()完成数据推送。其中,全局变量temp、humi、light分别存储当前温度、湿度及光照强度数值。在数据包透传过程中,要使用大量字符串,但Arduino UNO只有2 KB主存储器(SRAM)空间,字符串使用过多导致系统动态内存不足,运行不稳定,本程序对字符串存储进行了优化,将字符串存储于Flash中,程序执行时自动从Flash中调用字符串,大大节省了内存空间[8]。源程序如下所示:
void PostData() {
Serial.print(F("{"method":"update","gatewayNo":"01","userkey":"af5c50f620"}&^! "));
Serial.print(F("{"method":"upload","data":[{"Name":"TEMP","Value":""));
Serial.print(temp);
Serial.print(F(""},{"Name":"HUMI","Value":""));
Serial.print(humi);
Serial.print(F(""},{"Name":"LIGHT","Value":""));
Serial.print(light);
Serial.print(F(""}]}&^! "));
}
② 向Micro SD卡中存储当前各参数及时间。我们编写了函数dataLog()来完成数据存储,每天新建一个文件存储当天数据,以日期作为文件名。程序首先改变标志位recordFlag,避免了同一分钟内数据记录多次,随后使用逗号分隔符格式向文件写入表头,最后写入各项参数。源程序如下:
void dataLog() {
recordFlag = tm.minute();
pinMode(CS_PIN, OUTPUT);
StringlogFileName;
logFileName = String(tm.month()) + "-" + String(tm.day()) + ".csv";
SD.begin(CS_PIN);
//向新创建的文件写入表头
if (SD.exists(logFileName) == 0 ) {
FiledataFile = SD.open(logFileName,FILE_WRITE);
dataFile.print("DATE");
dataFile.print(F(","));
dataFile.print("Time");
dataFile.print(F(","));
dataFile.print("Humidity");
dataFile.print(F(","));
dataFile.print("Temperature");
dataFile.print(F(","));
dataFile.println("Illuminance");
dataFile.close();}
FiledataFile = SD.open(logFileName, FILE_WRITE);
dataFile.print(sDate);
dataFile.print(F(","));
sTime=String(tm.hour())+":"+String(tm.minute());
dataFile.print(sTime);
dataFile.print(F(","));
dataFile.print(humi);
dataFile.print(F(","));
dataFile.print(temp);
dataFile.print(F(","));
dataFile.println(light);
dataFile.close();
}
数据实时监测:经测试,环境参数上传稳定,无丢包。使用电脑或微信访问乐联网即可查看各参数实时数据、历史走势、数据分布等,图5给出乐联平台微信端实时数据查询界面。
图5 实时数据查询
历史数据导出:管理员可登陆乐联平台进入下载历史数据导出界面,选择时间段导出数据,也可使用读卡器读取本地的Micro SD卡导出历史数据。本系统存储的数据可直接在Excel中操作,管理员可利用Excel高效地对采集的环境参数进行统计学分析,如图6所示。
图6 导出数据并分析
数据采集精度:本系统测得的环境参数值与温湿度计、光照度计测试结果非常近似,达到了预期要求,精度完全满足农业监测需求。
参考文献
[1] 李岩. 基于Arduino与LabVIEW的农作物生长环境检测系统的设计与实现[D]. 滁州:安徽科技学院,2017.
[2] 毛敏, 马艳. 基于Arduino和Labview的蔬菜大棚温湿度监测系统[J]. 中国仪器仪表,2017(9):65-68.
[3] 朱晓雷. 基于单片机的温室环境数据监测系统的设计[D]. 呼和浩特:内蒙古农业大学,2015.
[4] 张亮. 轻松玩转Arduino[M]. 北京:电子工业出版社,2016.
[5] 蒙克. Arduino编程指南:75个智能硬件程序设计技巧[M].张家进,译. 北京:人民邮电出版社,2016.
[6] 宋楠,韩广义. Arduino开发从零开始学—学电子的都玩这个[M]. 北京:清华大学出版社,2014.
[7] 马格里斯. Arduino权威指南[M].2版.杨云坤,译. 北京:人民邮电出版社,2015.
[8] 赵英杰. 完美图解Arduino互动设计入门[M]. 北京:科学出版社,2014.