引言
随着人们越来越多地关注环境质量,基于各类传感器的环境检测系统得到广泛的应用。本文设计了一种成本低、可靠性高、可实时、远程对所在地进行温湿度和灰尘状况监测的方案。该方案基于Arduino UNO硬件平台,这是一种目前应用广泛的Arduino硬件电路,可扩展性强;传感器选用AM2303和DSM501A,两者都是目前常用的,可靠性和精确度高,价格便宜,使用方便。在软件方面,Arduino有自己的基于Eclipse的IDE开发环境,类似于JAVA和C/C++,可以配合Flash或Processing等软件完成开发[1]。后端使用了国内的物联网平台yeelink,与国外的同类物联网云Xlively、Nimbits等相比,除了中文操作语言带来的便捷外,它还与国内该领域相关公司和技术小组建立了合作关系,便于技术上的创新和应用,进一步降低了研发和使用的门槛。
1 监测系统设计
1.1 系统原理
系统原理流程图如图1所示。置于监测环境的温湿度传感器AM2303和灰尘传感器DSM501A分别将采集到的数据传给Arduino的输入端,其中AM2303输出形式是单总线串行信号,DSM501A输出的是PWM脉宽调制信号。Arduino搭载的ATmega328P完成对各传感器信号的处理、存储和传输,因所使用的Arduino为UNO版,需要加入网络模块ENC28J60,对需要上传网络的数据按照以太网数据传输的格式和规则进行编码。在yeelink平台配置好系统的API后,就可通过因特网在yeelink网站远程、异地、实时地查看传感器的数据,对环境状态进行监测。

图1系统原理流程图
1.2硬件设计
1.2.1 Arduino控制板
控制板采用Arduino平台,它是基于Atmel的AVR和ARM微控制器的开源软硬件平台,近年来发展迅速,应用广泛,在各种基于传感器的系统原型设计方面得到了广泛应用,其硬件设计采用CC BYSA3.0协议,软件采用类C++的高级语言。
Arduino UNO是基于ATmega328P微控制器的硬件平台,具有32 KB Flash、1 KB EEPROM、14路数字I/O口(其中6路可作为PWM输出)、6路模拟输入口。同时,UNO预置了Bootloader程序,不需要其他外部烧写器,可直接通过USB下载程序[2]。
1.2.2 温湿度传感器AM2303
AM2303包含一个电容式感湿元件和DS18B20感温器件,并与一个高性能8位单片机相连,具有响应快、抗干扰能力强、性价比高等优点。每个AM2303传感器都经过严格校准,校准系数以程序的形式存储在OTP内存中,传感器内部在检测信号的处理过程中要调用这些校准系数。AM2303的引脚封装如表1所列。
表1AM2303封装引脚

DATA引脚用于微处理器和AM2303之间的通信和同步,一次通信时间为5 ms左右,具体格式为:40位数据=16位湿度数据+16位温度数据+8位校验和,当温度低于0℃时,温度数据的最高位置1[3]。
1.2.3 灰尘传感器DSM501A
DSM501A内置加热器实现自动吸入空气,采用粒子计数原理,可灵敏检测直径为1 μm以上的粒子,其结构原理及引脚说明如图2所示。

图2 DSM501A结构原理及引脚图
在控制引脚1与GND之间加一个电阻,可调整Vout1的粒子最小检出水平(灵敏度),默认为Vout2的2.5倍;Vout2引脚为普通输出脚位,灵敏度已预设定,灵敏度为1 μm。当所接入电阻值为100 kΩ时,Vout1输出为半敏感(2 μm以上);当接入27 kΩ电阻时,与Vout2同等敏感(1 μm以上),悬空时为默认敏感度(2.5 μm以上)。该传感器输出为PWM调制方式波形,以低脉冲率来表示粒子数量水平,输出原理如图3所示,低脉冲率Rt=Lt/Ut×100%[4]。

图3 DSM501A PWM输出原理
1.3 软件设计
1.3.1 Arduino数据采集
Arduino有着固定的流程和规范,每个Arduino程序只有一个setup()和一个loop()函数,setup()函数里面编写的代码在硬件上电时只执行一次,一般在这个函数中编写一些初始化和开机动画程序等。当setup()函数执行完后,就开始循环执行loop()函数内的代码[5]。传感器与Arduino板引脚连接如图4所示。

图4 传感器与Arduino板引脚连接
Setup函数里完成USB的初始化,loop函数中通过USB接收配置数据,完成配置参数读取、修改。整个软件通过Arduino的集成开发环境可完成调试、下载。打开串口和开始进行以太网连接的Arduino源程序如下所示:
void setup(){
Serial.begin(9600);
if (ether.begin(sizeof Ethernet::buffer, MyMac) == 0)
Serial.println( "Failed to access Ethernet controller");
Serial.println("Setting up DHCP");
if (!ether.dhcpSetup())
Serial.println( "DHCP failed");
ether.printIp("My IP: ", ether.myip);
ether.printIp("Netmask: ", ether.mymask);
ether.printIp("GW IP: ", ether.gwip);
ether.printIp("DNS IP: ", ether.dnsip);
ether.dnsLookup(website);
sensor.attach(AM_PIN);
pinMode(DSM_PIN_10, INPUT);
}
如下所示,源程序为Arduino中传感器ID、PC MAC地址、yeelink API和网关等的设置,在yeelink中设置4个传感器展示变量,分别为温度、湿度、PM>1.0和1.0<PM<2.5(MP为可吸入颗粒物)。PostingInterval为发送到服务器时间间隔,每个传感器发送的时间间隔为PostingInterval*N。
#define N 4
const uint16_t PostingInterval = 5000;
const uint16_t SensorID[N] = {×××,×××,×××,×××};
const uint8_t MyMac[6] = { 0x××,0x××,0x××,0x××,0x××,0x××};
char APIKey[] PROGMEM = "c01ac2f5f79c74fb5176cbe662561acc";
char DeviceID[] PROGMEM = "×××";
char website[] PROGMEM = "api.yeelink.net";
1.3.2 yeelink云端配置
要完成Arduino与yeelink的数据对接和传递,必须在源程序中对传感器进行配置(包括传感器个数和对应ID),以及对API key进行申请。 API key用来授权对设备、传感器、数据等的操作,在yeelink中可以在“我的账户设置”中找到自己的API key。
一个设备表示一组传感器的组合,一个设备支持多个传感器。在yeelink中创建一个新设备的要点如表2所列,通过对该URL的一个HTTP POST请求创建一个新的设备。
表2 在yeelink上创建设备

表3为创建一个新传感器的要点说明,对该URL的一个HTTP POST请求将为指定的设备创建一个新的传感器,其中<device_id>为指定设备的ID。
表3 在yeelink上创建传感器

在yeelink上创建数据点的要点说明如表4所列,对该URL的一个HTTP POST请求会为指定的传感器创建一个新的数据点,使用此API来为传感器存储历史数据。一个数据点是由key和value组成的键值对,对大多数种类的传感器来说,key为唯一索引,一般为timestamp(ISO 8601标准时间格式,默认时区为中国标准时间CST),而value根据传感器的类型可以为数值、JSON格式、图像二进制信息等[6]。
表4 在yeelink上创建数据点

2 系统运行及测试
该系统自2013年11月16日起在yeelink平台运行,传感器置于实验室内,图5~图8分别展示了温度、湿度、PM>1.0和1.0<PM<2.5一周时间内的数据折线图。当鼠标定位在其中某个点(数据采集点)处,将显示该时刻的标准时间和数据值。

图5 一周内温度值折线图

图6 一周内湿度值折线图

图7 一周内可吸入PM>1.0折线图

图8 一周内1.0<PM<2.5折线图
结语
本设计将各类传感器与Arduino相连,连接网线即可使用,自动获取IP并连入yeelink平台。通过yeelink平台实现了环境状态的远距离、实时监测,可从UTC时间服务器获取精确时间,无须对表,同时可以修改,随意对板子进行烧写。此外,可加入新的传感器来扩展新的功能,yeelink平台的开放API也可进一步与社交网络等互联,增强交互性。整体设计成本低、功能多、可靠性高,具有很高的实用性,可以满足小型项目的需要。