張保新 張春霞 梁進(jìn)龍
摘 ?要:典型的傳感器數(shù)據(jù)輸出接口類型,包括模擬型、數(shù)字狀態(tài)型(0、1型)、1-Wire型、I2C型和SPI型。使用這些類型的傳感器及相應(yīng)特定編寫(xiě)的驅(qū)動(dòng)程序,Arduino平臺(tái)能獲得被測(cè)環(huán)境多種狀態(tài)的數(shù)字化表述數(shù)據(jù)。通過(guò)適當(dāng)?shù)臄?shù)據(jù)融合處理、增加信息傳輸(Wi-Fi+4G)及云端應(yīng)用(OneNet平臺(tái))等功能,這種平臺(tái)可用于物聯(lián)網(wǎng)的感知層、傳輸層、應(yīng)用層的教學(xué)活動(dòng)之中,也適合實(shí)際網(wǎng)絡(luò)的建設(shè)。
關(guān)鍵詞:傳感器;Arduino;驅(qū)動(dòng)程序
中圖分類號(hào):TP212.9;TN92 ? ? 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):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 ?引 ?言
當(dāng)前最受關(guān)注的技術(shù)以“云大物智”為首,這里的“物”,是指物聯(lián)網(wǎng)技術(shù)及其應(yīng)用。隨著RFID的誕生,物聯(lián)網(wǎng)就成為人們重點(diǎn)關(guān)注的技術(shù)領(lǐng)域,許多國(guó)家將物聯(lián)網(wǎng)的建設(shè)確立為國(guó)家戰(zhàn)略;眾多商業(yè)集團(tuán)在看到物聯(lián)網(wǎng)的巨大發(fā)展前景后,紛紛加大了投資力度;教育領(lǐng)域也紛紛跟進(jìn)。但由于物聯(lián)網(wǎng)發(fā)展迅速,許多配套的設(shè)施無(wú)法跟上現(xiàn)實(shí)的需要。既能適合教學(xué)需要,又能支撐物聯(lián)網(wǎng)實(shí)際建設(shè)需要的平臺(tái),顯然有廣闊的需求空間。本文擬在構(gòu)建這類平臺(tái)方面做一些探索。通過(guò)對(duì)現(xiàn)有的技術(shù)進(jìn)行分析發(fā)現(xiàn),沒(méi)有哪一種技術(shù)(或平臺(tái))能獨(dú)立完成物聯(lián)網(wǎng)三層結(jié)構(gòu)的構(gòu)建,只有整合多平臺(tái)(如傳感器+Arduino+OneNet),才可以達(dá)到目的。
1 ?Arduino平臺(tái)的技術(shù)特點(diǎn)
Arduino平臺(tái)由硬件和軟件兩個(gè)部分構(gòu)成。
1.1 ?硬件
基于ATmega328P型號(hào)單片機(jī)構(gòu)建,該芯片的主要特性如下:
(1)高性能低功耗的AVR8位微處理器,工作頻率可達(dá)到20Hz;
(2)長(zhǎng)持久性非易失性內(nèi)存33k Bytes FLASH+1k Bytes EEPROM;
(3)大容量?jī)?nèi)存:2k Bytes SRAM;
(4)在線系統(tǒng)可編程能力;
(5)8比特/16比特計(jì)數(shù)器;
(6)6個(gè)PMW端口(模擬輸出);
(7)6個(gè)10比特ADC端口(模擬輸入);
(8)通信口:USART、SPI、I2C各一個(gè)。
這些先進(jìn)的、多功能的特性,再加上合理的功能組合(如將USART轉(zhuǎn)換成USB功能),使Arduino平臺(tái)越來(lái)越受到高校師生的青睞,況且,單獨(dú)使用ATmega328P芯片開(kāi)發(fā)產(chǎn)品,在Arduino的配合下,容易實(shí)現(xiàn)目標(biāo)。
1.2 ?軟件
Arduino有自己的軟件開(kāi)發(fā)IDE,這個(gè)軟件的易用性非常高,甚至沒(méi)有軟件基礎(chǔ)的人都能掌握。該軟件的另一個(gè)特點(diǎn),就是官方提供了常用元器件的驅(qū)動(dòng)庫(kù),同時(shí),極客群體也有相當(dāng)多的貢獻(xiàn)。
基于以上的特點(diǎn)及其低成本的優(yōu)勢(shì),選擇Arduino平臺(tái)作為物聯(lián)網(wǎng)感知層的基礎(chǔ)控件是非常明智的。
1.3 ?常用傳感器的選擇
雖然RFID的出現(xiàn),是物聯(lián)網(wǎng)得以成熟的里程碑事件,但大多數(shù)的時(shí)間,感知層的感知任務(wù)還得靠各種傳感器來(lái)完成。物聯(lián)網(wǎng)的應(yīng)用領(lǐng)域非常廣,用到的傳感器也是五花八門(mén),這里僅以智能家居領(lǐng)域的應(yīng)用為例來(lái)選擇傳感器。
智能家居至少要包括三大功能:家庭安全防范、家庭設(shè)備自動(dòng)化、家庭通信。
根據(jù)這些要求,做出如下選擇:
(1)高精度溫度傳感器(LM35),主要用途:環(huán)境感知和控制;
(2)人體紅外傳感器(HC-SR50),主要用途:家庭安全;
(3)溫濕度傳感器(DHT11或DHT20),主要用途:環(huán)境感知和控制;
(4)光強(qiáng)度傳感器(BH1750),主要用途:改善生活環(huán)境;
(5)加速度傳感器(ADXL345),主要用途:居家養(yǎng)老等。
這些傳感器除了能夠完成智能家居中的數(shù)據(jù)感應(yīng)功能外,另一個(gè)選擇的理由是,它們的數(shù)據(jù)輸出接口也非常典型,涵蓋了模擬型、數(shù)字狀態(tài)型(0、1型)、1-Wire型、I2C型和SPI型,這些接口是當(dāng)今傳感器主要采用的數(shù)據(jù)接口,便于構(gòu)建學(xué)生知識(shí)的完整性。
2 ?基于Arduino平臺(tái)的傳感器驅(qū)動(dòng)
通過(guò)包含相關(guān)庫(kù)函數(shù)、端口設(shè)置、防干擾措施等軟件編程來(lái)實(shí)現(xiàn)傳感器驅(qū)動(dòng)。由于大部分傳感器輸出信息均已數(shù)字化,硬件連接電器工藝要求不高;如果使用模擬接口,需要注意抗干擾問(wèn)題。
2.1 ?模擬類接口型器件的驅(qū)動(dòng)
這類接口的傳感器,使用連續(xù)變化的電壓(或電流)來(lái)反應(yīng)其感知物理量的變化情況,如LM35型傳感器。如果是電壓型器件,可以直接讀取其輸出值。對(duì)于電流型器件,先進(jìn)行I/U轉(zhuǎn)換后再讀取,驅(qū)動(dòng)程序主要語(yǔ)句如下:
pinMode(n,INPUT); ? ? ? ? ?//定義端口為輸入屬性
int in = analogRead(n); ? ?//讀取端口模擬數(shù)據(jù)
注意事項(xiàng):具體數(shù)值換算方式為inX(5/1024),其中in取值范圍0~1023,5為參考電壓值。n為端口(Pin)號(hào),只能使用A0—A5端口。
2.2 ?數(shù)字狀態(tài)類接口型器件的驅(qū)動(dòng)
這類傳感器的輸出只有兩種狀態(tài):在感知到有人或無(wú)人狀態(tài)時(shí),分別用高電平或低電平來(lái)表示。如HC-SR50型傳感器,其驅(qū)動(dòng)程序主要語(yǔ)句如下:
pinMode(n,INPUT_PULLUP); ? //定義內(nèi)部上拉的輸入口
int sta = digitalRead(n); ? ? ? //讀取數(shù)字化信息
注意事項(xiàng):端口類型設(shè)置成內(nèi)部上拉,避免空接時(shí)輸入狀態(tài)不確定。這種配置如果無(wú)法與傳感器匹配,可以改用外接上拉(或下拉)10kΩ電阻來(lái)進(jìn)行匹配。
2.3 ?1-Wire數(shù)字串口類接口型器件的驅(qū)動(dòng)
這類接口已經(jīng)數(shù)字化,以某種固定數(shù)據(jù)格式表示數(shù)據(jù),數(shù)據(jù)長(zhǎng)度為8~16位。由于是單線通信,數(shù)據(jù)信號(hào)實(shí)行分時(shí)雙向傳輸,時(shí)序圖如圖1所示。
其驅(qū)動(dòng)程序主要語(yǔ)句如下:
#include <dht11.h> ? ? ? ? ? ? //加載驅(qū)動(dòng)庫(kù),分原生與外來(lái)兩類庫(kù)
dht11 DHT; ? ? ? ? ? ? ? ? ? ? //聲明具體實(shí)例
#define DHT11Pin 2 ? ? ? ? ? ?//定義通信管腳
int val = DHT.read(DHT11Pin); ?//讀取傳感器數(shù)值
注意事項(xiàng):網(wǎng)上流行有多個(gè)版本的DHT11庫(kù),引用時(shí)需要注意其細(xì)微差別,首選官方庫(kù)。數(shù)據(jù)讀出后注意數(shù)據(jù)的后期處理。
2.4 ?I2C數(shù)字串口類接口型器件的驅(qū)動(dòng)
I2C數(shù)字化串口類接口,采用雙線(SDA、SCL)方式進(jìn)行雙向分時(shí)通信,通過(guò)串口地址可以識(shí)別總線上的不同類型器件,是器件間主要接口類型,時(shí)序圖如圖2所示。
I2C接口,利用這兩條線上信號(hào)的變化,實(shí)現(xiàn)物理比特傳輸,并按規(guī)定的數(shù)據(jù)格式進(jìn)行信息交換,完成控制命令和數(shù)據(jù)傳輸。不同廠家定義的數(shù)據(jù)格式略有不同,使用時(shí)請(qǐng)閱讀數(shù)據(jù)手冊(cè)。
其驅(qū)動(dòng)程序主要語(yǔ)句如下:
#include <Wire.h> ? ? ? ? ?//使用官方Wire庫(kù)
#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); ? ? ? ? ? ? ? ?//測(cè)量使能
Wire.endTransmission();
Wire.beginTransmission(ADXAddress); //數(shù)據(jù)讀取操作
Wire.write(Register_X0);
Wire.write(Register_X1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2)
{X0 = Wire.read();X1 = Wire.read();}
注意事項(xiàng):命令設(shè)置要在程序?qū)Γ╓ire.beginTransmission
() /Wire.endTransmission())中執(zhí)行,要注意傳感器的響應(yīng)時(shí)間,確保其執(zhí)行完命令后再進(jìn)行下一條操作。器件不同和數(shù)據(jù)格式不同,導(dǎo)致處理方式也不同。
2.5 ?SPI數(shù)字串口類接口型器件的驅(qū)動(dòng)
SPI數(shù)字化串口類接口,采用四線(SDI、SDO、SCLK、CS)或三線、主從方式進(jìn)行實(shí)時(shí)雙向通信。主機(jī)通過(guò)片選信號(hào),實(shí)現(xiàn)一主多從的工作模式。圖3為四線制ADXL345型加速度傳感器寫(xiě)狀態(tài)時(shí)序,其他部分不再贅述。由于SPI的協(xié)議較復(fù)雜,一些廠家只實(shí)現(xiàn)了部分功能,應(yīng)用時(shí)注意閱讀原廠數(shù)據(jù)手冊(cè)。
其驅(qū)動(dòng)程序主要語(yǔ)句如下:
#include <SPI.h>
SPI.beginTransaction(SPISettings(4000000,MSBFIRST, SPI_MODE3)); ? //初始化SPI接口 傳輸速率400k、權(quán)重位MSB、工作方式MODE3
digitalWrite(SSPin,LOW); ? ? //片選置“0”
SPI.transfer16(0x710B); ? ? //
digitalWrite(SSPin,HIGH); ? //片選置“1”
digitalWrite(SSPin,LOW);
SPI.transfer(rBuffer,7); ? //數(shù)據(jù)傳送(收發(fā)同時(shí)進(jìn)行,多單字節(jié)),一個(gè)樣值包括6個(gè)數(shù)。
digitalWrite(SSPin,HIGH);
注意事項(xiàng):命令和讀取操作必須在片選的控制下進(jìn)行(digitalWrite(SSPin,LOW)/ digitalWrite(SSPin,HIGH)),要注意傳感器的響應(yīng)時(shí)間,確保其執(zhí)行完命令后再進(jìn)行下一條操作。器件工作狀態(tài)可選。
通過(guò)上面的程序設(shè)置,傳感器可以正常工作并將數(shù)據(jù)上傳給Arduino平臺(tái),完成數(shù)據(jù)的采集工作。
3 ?數(shù)據(jù)融合的思考
物聯(lián)網(wǎng)的一項(xiàng)主要工作,就是如何利用獲得的數(shù)據(jù)(大數(shù)據(jù)),為服務(wù)對(duì)象提供更多、更高效的服務(wù),數(shù)據(jù)處理貫穿整個(gè)網(wǎng)絡(luò)。由于感知層形成的數(shù)據(jù)量非常龐大,如果不加甄別和篩選,對(duì)通信設(shè)施及應(yīng)用服務(wù)器均構(gòu)成重大壓力;這些數(shù)據(jù)的冗余性較高,直接傳送也是沒(méi)有必要的;對(duì)于實(shí)時(shí)性要求較高的安全類信息,需要在感知層立即進(jìn)行分析并啟動(dòng)相關(guān)處理裝置。在Arduino平臺(tái)上,只要實(shí)現(xiàn)數(shù)據(jù)的采集與上報(bào)、安全類信息的處理即可。
參考文獻(xiàn):
[1] ATmega328P數(shù)據(jù)手冊(cè) [Z].Atmel Corporation,2009.
[2] ADXL345數(shù)據(jù)手冊(cè) [Z].Analog Devices,Inc.,2010-11.
[3] LM35數(shù)據(jù)手冊(cè) [Z].National SemiconductorCorporation,2000-11.
[4]DHT11產(chǎn)品手冊(cè) [Z].廣州奧松電子有限公司,2017-03.
[5] BH1750FVC數(shù)據(jù)手冊(cè) [Z].ROHM SEMICONDUCTOR,2016-06.
[6] OneNet.設(shè)備開(kāi)發(fā)指南 [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.
作者簡(jiǎn)介:張保新(1965.08-),男,漢族,內(nèi)蒙古通遼人,高級(jí)工程師,學(xué)士學(xué)位,研究方向:光通信技術(shù)、物聯(lián)網(wǎng)應(yīng)用技術(shù)。