0 概述
20世纪以来我国民用航空事业飞速发展,空管的保障压力也与日俱增,越来越多的导航台站和雷达台站的投入使用。对于这类事关航空安全的重要外部台站,对这类精密设备的运行环境有着更加严格的要求,实时准确的监控机房温湿度,保证设备在一个稳定的空气环境中运行对提高设备的可靠运行和延长设备的工作寿命有着重要的意义。本文主要是介绍如何利用开源硬件arduino和enc28j60来快速搭建一个温湿度监控系统。
1 系统主要结构
系统主要分为硬件部分和软件部分。硬件部分主要有arduino控制板,以太网模块enc28j60和温湿度传感器sht15。通过arduino控制板控制温湿度传感器实时测量周围环境的温湿度数据,通过以太网模块将采集到的温湿度分发到交换机中。软件上主要是采用C/S模式的结构,各个传感器测量到的数据通过udp传输到服务器端,在服务器端用html和javascript开发部署一个web站点。值班人员过web页面就能实时监控到各个外台站的机房环境。系统的整体框图如下所示。
2 系统的硬件结构及工作原理
2.1 arduino 硬件结构及工作原理
本次系统中采用的arduino控制板型号主要是arduino uno。UNO的处理器核心是ATmega328,包括了片上32KB Flash,其中0.5KB用于Bootloader。同时还有2KB SRAM和1KB EEPROM。同时具有14路数字输入/输出口(其中6路可作为PWM输出),6路模拟输入,一个16MHz晶体振荡器,一个USB口,一个电源插座,一个ICSP header和一个复位按钮。同时还提供了一路串口信号RX(0号)、TX(1号): 与内部 ATmega8U2 USB-to-TTL 芯片相连,提供TTL电压水平的串口接收信号。USB口附近有一个可重置的保险丝,对电路起到保护作用。当电流超过500mA是会断开USB连接。UNO已经发布到第三版,与前两版相比有以下新的特点:在AREF处增加了两个管脚SDA和SCL,支持I2C接口;增加IOREF和一个预留管脚,将来扩展板将能兼容5V和3.3V核心板。改进了复位电路设计。USB接口芯片由ATmega16U2替代了ATmega8U2。控制器上还可以通过片上的DC-DC产生一个3.3V和5V的电压。
2.2 enc28j60硬件结构及工作原理
enc28j60是带有行业标准串行外设接口SPI的独立以太网控制器。它可作为任何配备有SPI的控制器的以太网接口。
enc28j60符合IEEE 802.3 的全部规范,采用了一系列包过滤机制以对传入数据包进行限制。它还提供了一个内部DMA 模块,以实现快速数据吞吐和硬件支持的IP校验和计算。与主控制器的通信通过两个中断引脚和SPI实现,数据传输速率高达10Mb/s。
enc28j60由七个主要功能模块组成:
(1)SPI 接口—充当主控制器和enc28j60之间通信通道。
(2)控制寄存器—用于控制和监视enc28j60。
(3)双端口RAM缓冲器—用于接收和发送数据包。
(4)判优器—当DMA、发送和接收模块发出请求时对RAM 缓冲器的访问进行控制。
(5)总线接口—对通过SPI 接收的数据和命令进行解析。
(6)MAC模块——实现符合IEEE 802.3 标准的MAC 逻辑。
(7)PHY(物理层)模块——对双绞线上的模拟数据进行编码和译码。
在本系统设计中,主要是用SPI接口和arduino进行通信,其对应管脚如下所示
表1
要能正常的使用enc28j60还需要库文件的支持,支持的第三方库有非常多,其中以GitHub上的EtherCard库和UIPEthernet库最为广泛使用,但是笔者在使用EtherCard库的时候,发现如果接入交换机或者路由器的话,服务器端就没有办法正确的接收到客户端发来的数据,所以本次系统设计中使用的是UIPEthernet库。将下载好的库文件放入到对应的库文件夹中就可以正常的调用了。本次实例中我们主要调用到的是库里面的udp.beginPacket()和udp.write()函数。
udp.beginPacket()函数用以初始化服务器的ip和udp端口号。
success = udp.beginPacket(IPAddress(192,168,1,5),5000);
udp.write()函数将传感器的数据通过udp数据包发送到服务器端。
success = udp.write(senorsdata);
2.3 sht15硬件结构及工作原理
sht15属于Sensirion温湿度传感器家族中的贴片封装系列。传感器将传感元件和信号处理电路集成在一块微型电路板上,输出完全标定的数字信号。传感器采用专利的CMOSens技术,确保产品具有极高的可靠性与卓越的长期稳定性。传感器包括一个电容性聚合体测湿敏感元件、一个用能隙材料制成的测温元件,并在同一芯片上,与14 位的A/D 转换器以及串行接口电路实现无缝连接。因此,该产品具有品质卓越、响应迅速、抗干扰能力强、性价比高等优点。
各个引脚的定义如下图所示:
表2 SHT1x引脚分配,NC保持悬空
其中sht15的供电电压范围为2.4V-5.5V,建议工作电压为3.3V。在电源引脚(VDD,GND)之间须加一个100nF的电容,用以去耦滤波。串行时钟输入SCK 用于微处理器与SHT1x之间的通讯同步。串行数据DATA 引脚为三态结构,用于读取传感器数据 。当向传感器发送命令时, DATA 在SCK 上升沿有效且在SCK 高电平时必须保持稳定。DATA 在SCK 下降沿之后改变。为确保通讯安全,DATA 的有效时间在SCK 上升沿之前和下降沿之后应该分别延长至 TSU and THO。 当从传感器读取数据时, DATA TV 在 SCK 变低以后有效,且维持到下一个SCK 的下降沿 。为避免信号冲突,微处理器应驱动DATA 在低电平。需要一个外部的上拉电阻(例如:10kΩ)将信号提拉至高电平。
典型的应用电路如下图所示:
图2
要使用sht15同样也是需要库文件的支持,在GitHub上下载好SHT1x库文件并放入库文件夹就可以调用库文件夹里已经写好的函数。本实例中主要用到的是sht1x.readTemperatureC()和sht1x.readHumidity()。具体的例子如下所示:
SHT1x sht1x(dataPin, clockPin); //初始化SHT实例
float temp_c, humidity; //初始化变量
temp_c = sht1x.readTemperatureC(); //读取机房温度
humidity = sht1x.readHumidity(); //读取机房湿度
2.4 系统的硬件结构图
系统整体的硬件结构图如下所示:
图3
3 系统服务器端的部署和应用
3.1 udp监听和数据存储
各个外台站的传感器数据通过udp的方式传输到服务器端,在服务器端,用Python脚本编写了2个小模块,一个是udpmonitor模块,用来监听udp数据包,另外一个是datacsv模块,用于将监听到的传感器数据存入到服务器上的csv文件中。
udpmonitor模块的代码如下:
#!/usr/bin/env python //如果服务器端是linux系统也可以兼容
# -*- coding:UTF-8 -*-
from socket import *
from time import ctime
HOST = ’127.0.0.1’ //服务器的ip
PORT = 21567 //服务器监听端口,不同传感器监听的端口号不一样
BUFSIZE = 1024
ADDR = (HOST,PORT)
udpSerSock = socket(AF_INET, SOCK_DGRAM)
udpSerSock.bind(ADDR)
while True:
sensordata, addr = udpSerSock.recvfrom(BUFSIZE)
udpSerSock.sendto(’[%s] %s’%(ctime(),sensordata),addr)
udpSerSock.close()
datacsv模块的代码如下:
import csv
writer = csv.writer(file(’sensordata.csv’, ’wb’))
writer.writerow([’sensorid’, ’temperature’, ’humidity’])
lines = [sensordata]
for line in lines:
writer.writerow(line)
3.2 webserver站点部署和应用
在服务器端可以使用IIS或者Apache部署web服务器,为了能够让数据更加直观的以图表的形式显示出来,在监控页面里调用了一个叫做Highcharts的图表库,纯javascript编写的。为了能够引用highcharts文件,需要将下载好的文件放入本地的js目录中,同时还需要有jQuery的支持,所以还要引入jQuery文件。将下载好的文件放入js目录中后,在自己编写的监控主页里添加如下的代码:
打开浏览器输入主页的地址后显示以下的界面(图表中的数据为测试数据)
图4
4 总结
Arduino素来有电子积木的美称,通过这个温湿度监控系统的设计过程,我们也不难发现,只要通过引用正确的库文件和对库文件接口的简单认知,就能够将各个硬件简单快速搭建运行起来。而且正是由于开源硬件的发展,本次设计方案里所花费的总的成本不超过过60元,如果选用arduino mini板的话,成本可以更低至30元左右。当然,无论采用什么方案都好,都是为了更加准确和实时的监控各种导航设备的运行环境,为保障设备稳定运行,保障航空安全提供更有力的支持。