张保新 张春霞 梁进龙
摘 要:典型的传感器数据输出接口类型,包括模拟型、数字状态型(0、1型)、1-Wire型、I2C型和SPI型。使用这些类型的传感器及相应特定编写的驱动程序,Arduino平台能获得被测环境多种状态的数字化表述数据。通过适当的数据融合处理、增加信息传输(Wi-Fi+4G)及云端应用(OneNet平台)等功能,这种平台可用于物联网的感知层、传输层、应用层的教学活动之中,也适合实际网络的建设。
关键词:传感器;Arduino;驱动程序
中图分类号:TP212.9;TN92 文献标识码:A 文章编号:2096-4706(2019)17-0137-03
Abstract:Typical types of sensors data output interfaces include analog,digital state (0,1),1-Wire,I2C and SPI. Using these types of sensors and the corresponding specific drivers,the Arduino platform can obtain the digital representation data of various states of the environment under test. Through proper data fusion processings,increasing information transmission (Wi-Fi plus 4G) and cloud application (OneNet platform),this platform can be used in the teaching activities. For example,the perception layer,transmission layer, application layer and other aspects of the internet of things,and also suitable for the construction of the actual network.
Keywords:sensor;Arduino;driver
0 引 言
当前最受关注的技术以“云大物智”为首,这里的“物”,是指物联网技术及其应用。随着RFID的诞生,物联网就成为人们重点关注的技术领域,许多国家将物联网的建设确立为国家战略;众多商业集团在看到物联网的巨大发展前景后,纷纷加大了投资力度;教育领域也纷纷跟进。但由于物联网发展迅速,许多配套的设施无法跟上现实的需要。既能适合教学需要,又能支撑物联网实际建设需要的平台,显然有广阔的需求空间。本文拟在构建这类平台方面做一些探索。通过对现有的技术进行分析发现,没有哪一种技术(或平台)能独立完成物联网三层结构的构建,只有整合多平台(如传感器+Arduino+OneNet),才可以达到目的。
1 Arduino平台的技术特点
Arduino平台由硬件和软件两个部分构成。
1.1 硬件
基于ATmega328P型号单片机构建,该芯片的主要特性如下:
(1)高性能低功耗的AVR8位微处理器,工作频率可达到20Hz;
(2)长持久性非易失性内存33k Bytes FLASH+1k Bytes EEPROM;
(3)大容量内存:2k Bytes SRAM;
(4)在线系统可编程能力;
(5)8比特/16比特计数器;
(6)6个PMW端口(模拟输出);
(7)6个10比特ADC端口(模拟输入);
(8)通信口:USART、SPI、I2C各一个。
这些先进的、多功能的特性,再加上合理的功能组合(如将USART转换成USB功能),使Arduino平台越来越受到高校师生的青睐,况且,单独使用ATmega328P芯片开发产品,在Arduino的配合下,容易实现目标。
1.2 软件
Arduino有自己的软件开发IDE,这个软件的易用性非常高,甚至没有软件基础的人都能掌握。该软件的另一个特点,就是官方提供了常用元器件的驱动库,同时,极客群体也有相当多的贡献。
基于以上的特点及其低成本的优势,选择Arduino平台作为物联网感知层的基础控件是非常明智的。
1.3 常用傳感器的选择
虽然RFID的出现,是物联网得以成熟的里程碑事件,但大多数的时间,感知层的感知任务还得靠各种传感器来完成。物联网的应用领域非常广,用到的传感器也是五花八门,这里仅以智能家居领域的应用为例来选择传感器。
智能家居至少要包括三大功能:家庭安全防范、家庭设备自动化、家庭通信。
根据这些要求,做出如下选择:
(1)高精度温度传感器(LM35),主要用途:环境感知和控制;
(2)人体红外传感器(HC-SR50),主要用途:家庭安全;
(3)温湿度传感器(DHT11或DHT20),主要用途:环境感知和控制;
(4)光强度传感器(BH1750),主要用途:改善生活环境;
(5)加速度传感器(ADXL345),主要用途:居家养老等。
这些传感器除了能够完成智能家居中的数据感应功能外,另一个选择的理由是,它们的数据输出接口也非常典型,涵盖了模拟型、数字状态型(0、1型)、1-Wire型、I2C型和SPI型,这些接口是当今传感器主要采用的数据接口,便于构建学生知识的完整性。
2 基于Arduino平台的传感器驱动
通过包含相关库函数、端口设置、防干扰措施等软件编程来实现传感器驱动。由于大部分传感器输出信息均已数字化,硬件连接电器工艺要求不高;如果使用模拟接口,需要注意抗干扰问题。
2.1 模拟类接口型器件的驱动
这类接口的传感器,使用连续变化的电压(或电流)来反应其感知物理量的变化情况,如LM35型传感器。如果是电压型器件,可以直接读取其输出值。对于电流型器件,先进行I/U转换后再读取,驱动程序主要语句如下:
pinMode(n,INPUT); //定义端口为输入属性
int in = analogRead(n); //读取端口模拟数据
注意事项:具体数值换算方式为inX(5/1024),其中in取值范围0~1023,5为参考电压值。n为端口(Pin)号,只能使用A0—A5端口。
2.2 数字状态类接口型器件的驱动
这类传感器的输出只有两种状态:在感知到有人或无人状态时,分别用高电平或低电平来表示。如HC-SR50型传感器,其驱动程序主要语句如下:
pinMode(n,INPUT_PULLUP); //定义内部上拉的输入口
int sta = digitalRead(n); //读取数字化信息
注意事项:端口类型设置成内部上拉,避免空接时输入状态不确定。这种配置如果无法与传感器匹配,可以改用外接上拉(或下拉)10kΩ电阻来进行匹配。
2.3 1-Wire数字串口类接口型器件的驱动
这类接口已经数字化,以某种固定数据格式表示数据,数据长度为8~16位。由于是单线通信,数据信号实行分时双向传输,时序图如图1所示。
其驱动程序主要语句如下:
#include <dht11.h> //加载驱动库,分原生与外来两类库
dht11 DHT; //声明具体实例
#define DHT11Pin 2 //定義通信管脚
int val = DHT.read(DHT11Pin); //读取传感器数值
注意事项:网上流行有多个版本的DHT11库,引用时需要注意其细微差别,首选官方库。数据读出后注意数据的后期处理。
2.4 I2C数字串口类接口型器件的驱动
I2C数字化串口类接口,采用双线(SDA、SCL)方式进行双向分时通信,通过串口地址可以识别总线上的不同类型器件,是器件间主要接口类型,时序图如图2所示。
I2C接口,利用这两条线上信号的变化,实现物理比特传输,并按规定的数据格式进行信息交换,完成控制命令和数据传输。不同厂家定义的数据格式略有不同,使用时请阅读数据手册。
其驱动程序主要语句如下:
#include <Wire.h> //使用官方Wire库
#define Register_2D 0x2D //变量定义
#define Register_X0 0x32
#define Register_X1 0x33
#define ADDRESS_BH1750FVI 0x23 //定义器件的串口地址
Wire.beginTransmission(ADXAddress); //初始化器件
Wire.write(Register_2D);
Wire.write(8); //测量使能
Wire.endTransmission();
Wire.beginTransmission(ADXAddress); //数据读取操作
Wire.write(Register_X0);
Wire.write(Register_X1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2)
{X0 = Wire.read();X1 = Wire.read();}
注意事项:命令设置要在程序对(Wire.beginTransmission
() /Wire.endTransmission())中执行,要注意传感器的响应时间,确保其执行完命令后再进行下一条操作。器件不同和数据格式不同,导致处理方式也不同。
2.5 SPI数字串口类接口型器件的驱动
SPI数字化串口类接口,采用四线(SDI、SDO、SCLK、CS)或三线、主从方式进行实时双向通信。主机通过片选信号,实现一主多从的工作模式。图3为四线制ADXL345型加速度传感器写状态时序,其他部分不再赘述。由于SPI的协议较复杂,一些厂家只实现了部分功能,应用时注意阅读原厂数据手册。
其驱动程序主要语句如下:
#include <SPI.h>
SPI.beginTransaction(SPISettings(4000000,MSBFIRST, SPI_MODE3)); //初始化SPI接口 傳输速率400k、权重位MSB、工作方式MODE3
digitalWrite(SSPin,LOW); //片选置“0”
SPI.transfer16(0x710B); //
digitalWrite(SSPin,HIGH); //片选置“1”
digitalWrite(SSPin,LOW);
SPI.transfer(rBuffer,7); //数据传送(收发同时进行,多单字节),一个样值包括6个数。
digitalWrite(SSPin,HIGH);
注意事项:命令和读取操作必须在片选的控制下进行(digitalWrite(SSPin,LOW)/ digitalWrite(SSPin,HIGH)),要注意传感器的响应时间,确保其执行完命令后再进行下一条操作。器件工作状态可选。
通过上面的程序设置,传感器可以正常工作并将数据上传给Arduino平台,完成数据的采集工作。
3 数据融合的思考
物联网的一项主要工作,就是如何利用获得的数据(大数据),为服务对象提供更多、更高效的服务,数据处理贯穿整个网络。由于感知层形成的数据量非常庞大,如果不加甄别和筛选,对通信设施及应用服务器均构成重大压力;这些数据的冗余性较高,直接传送也是没有必要的;对于实时性要求较高的安全类信息,需要在感知层立即进行分析并启动相关处理装置。在Arduino平台上,只要实现数据的采集与上报、安全类信息的处理即可。
参考文献:
[1] ATmega328P数据手册 [Z].Atmel Corporation,2009.
[2] ADXL345数据手册 [Z].Analog Devices,Inc.,2010-11.
[3] LM35数据手册 [Z].National SemiconductorCorporation,2000-11.
[4]DHT11产品手册 [Z].广州奥松电子有限公司,2017-03.
[5] BH1750FVC数据手册 [Z].ROHM SEMICONDUCTOR,2016-06.
[6] OneNet.设备开发指南 [EB/OL].https://open.iot. 10086.cn/doc/,2019-06-02.
[7] Arduino.Language Reference [EB/OL].https://www.arduino.cc/reference/en/,2019-06-02.
作者简介:张保新(1965.08-),男,汉族,内蒙古通辽人,高级工程师,学士学位,研究方向:光通信技术、物联网应用技术。