張保新 張春霞 梁進龍



摘 ?要:典型的傳感器數據輸出接口類型,包括模擬型、數字狀態型(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-),男,漢族,內蒙古通遼人,高級工程師,學士學位,研究方向:光通信技術、物聯網應用技術。