,
(1.成都理工大學(xué) 信息科學(xué)與技術(shù)學(xué)院,成都 610059;2.上海艾能電力工程有限公司)
智能家居不僅為人們提供了安全的、便利的、舒適的基礎(chǔ)生活設(shè)施,而且還能保證人們的居住環(huán)境環(huán)保節(jié)能。但在國(guó)內(nèi),目前智能家居還只是處于技術(shù)推廣階段,并未實(shí)際應(yīng)用于百姓的日常生活中,造成這種狀況的原因有很多方面,比如軟件操作復(fù)雜、人機(jī)交互性差、價(jià)格昂貴等。
Android系統(tǒng)于2007年11月5日由谷歌公司公布以來,其憑借開源、自由的優(yōu)勢(shì),面世以后就受到了移動(dòng)終端生產(chǎn)商的青睞。Android開發(fā)環(huán)境所需的開發(fā)工具包括Java SDK、Eclipse、Android SDK、Android ADT。其中,Android SDK是Android的專屬軟件開發(fā)包。百度語音SDK Android版(簡(jiǎn)稱BDVRClient)是運(yùn)行在Android 平臺(tái)的一體化語音識(shí)別解決方案。百度語音合成客戶端Android版SDK(簡(jiǎn)稱BDTTSClient)是面向Android移動(dòng)設(shè)備的語音合成解決方案。STC89C52是STC公司生產(chǎn)的一種低功耗、高性能CMOS 8位微控制器,具有8 KB在系統(tǒng)可編程Flash存儲(chǔ)器。在單芯片上,擁有靈巧的8 位CPU 和在系統(tǒng)可編程Flash,使得STC89C52為眾多嵌入式控制應(yīng)用系統(tǒng)提供了高靈活、超有效的解決方案。
本設(shè)計(jì)將采用BDVRClient和BDTTSClient方案。系統(tǒng)將人類語音發(fā)送至云端引擎進(jìn)行處理,返回計(jì)算機(jī)可讀的字符串輸入,對(duì)字符串進(jìn)行處理,采用TTS技術(shù)實(shí)現(xiàn)智能應(yīng)答,結(jié)合藍(lán)牙實(shí)現(xiàn)數(shù)據(jù)(指令)無線傳輸,使用嵌入式技術(shù)實(shí)現(xiàn)對(duì)家居系統(tǒng)的控制、定時(shí)等功能。
本設(shè)計(jì)包括主界面、藍(lán)牙管理界面、指令管理界面三個(gè)界面,分別使用嵌套布局、相對(duì)布局、線性布局,使用的控件有Button、TextView、EditText、ListView、togglebutton等。界面設(shè)計(jì)如圖1所示。
圖1 界面設(shè)計(jì)
1.2.1 語音識(shí)別模塊
(1) 權(quán)限聲明
(2) 創(chuàng)建對(duì)話框
mDialog=new BaiduASRDigitalDialog(context,params);
(3) 設(shè)置回調(diào)
mRecognitionListener=newDialogRecognitionListener(){
publicvoidonResults(Bundle results){
ArrayList
if(rs!=null){ } } };
mDialog.setDialogRecognitionListener(mRecognitionListener);
(4) 調(diào)用mDialog.show()開始識(shí)別
BDVRClient在開始識(shí)別后,會(huì)啟動(dòng)錄音、預(yù)處理、上傳到服務(wù)器并獲取識(shí)別結(jié)果。
1.2.2 語音合成模塊
(1) 權(quán)限聲明
(2) Tts初始化與授權(quán)等參數(shù)設(shè)置
speechSynthesizer = SpeechSynthesizer.getInstance();
speechSynthesizer.setContext(Context);
speechSynthesizer.setSpeechSynthesizerListener(SpeechSynthesizerListener);
AuthInfo authInfo = speechSynthesizer.auth(TtsMode);
speechSynthesizer.initTts(TtsMode);
(3) 參數(shù)設(shè)置
設(shè)置PARAM_VOLUME、PARAM_SPEED、PARAM_PITCH、PARAM_SPEAKER、PARAM_AUDIO_ENCODE、PARAM_AUDIO_RATE等參數(shù)。
(4) 授權(quán)驗(yàn)證接口
AuthInfo authInfo=speechSynthesizer.auth(TtsMode ttsMode);
(5) Tts初始化接口
int initTts(TtsMode ttsMode);
(6) 合成并播放
調(diào)用speak()即可實(shí)現(xiàn)合成并播放。
1.2.3 藍(lán)牙模塊
(1) 打開/關(guān)閉藍(lán)牙
獲得藍(lán)牙適配器:
blueadapter=BluetoothAdapter.getDefaultAdapter();
調(diào)用blueadapter.enable()和blueadapter.disable()打開或者關(guān)閉藍(lán)牙。
(2) 搜索藍(lán)牙
調(diào)用diblueadapter.startDiscovery( )發(fā)送廣播搜索藍(lán)牙,在發(fā)送廣播之前需要注冊(cè)藍(lán)牙搜索廣播接收者、定義廣播接收,當(dāng)廣播的事件是注冊(cè)的事件時(shí)就會(huì)觸發(fā)廣播接收器,然后觸發(fā)廣播接收的onReceiver(),從Intent中獲取設(shè)備對(duì)象:
BluetoothDevice device=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
通過listview控件顯示遠(yuǎn)端設(shè)備列表。
(3) 藍(lán)牙配對(duì)
藍(lán)牙首次配對(duì)之后,隨后的通信連接就不必每次都要做確認(rèn)。
(4) 建立connect線程完成連接并發(fā)送socket連接完成的廣播事件
部分代碼如下:
socket=this.device.createRfcommSocketToServiceRecord(this.myUID);
socket.connect();
Intent tent=new Intent(MainActivity.CONNECT_FINAL_ACTION);
MainActivity.this.sendBroadcast(tent);
(5) 指令發(fā)送
廣播接收onReceiver()中,獲得blueSocket對(duì)象:
blueSocket=MainActivity.this.connect_thread.getSocket();
通過blueSocket對(duì)象獲取輸出流:
tmpOut=blueSocket.getOutputStream();
通過調(diào)用tmpOut.write(bytes[])發(fā)送指令。
1.2.4 SQLite數(shù)據(jù)庫模塊
(1) 創(chuàng)建zhiling表
使用SQLiteOpenHelper抽象類創(chuàng)建一個(gè)ZHILING.db的數(shù)據(jù)庫,然后在代碼中執(zhí)行db.execSQL(CREATE_ZHILING)創(chuàng)建一張zhiling表。
(2) 添加數(shù)據(jù)
獲取SQLiteDatabase對(duì)象:
SQLiteDatabase db=dbHelper.getWritableDatabase();
然后使用ContentValues來對(duì)要添加的數(shù)據(jù)進(jìn)行組裝,最后調(diào)用db.insert()將數(shù)據(jù)添加到zhiling表中。
(3) 顯示列表
通過SimpleCursorAdapter類與數(shù)據(jù)綁定,借助listview顯示數(shù)據(jù)。
(4) 數(shù)據(jù)庫查詢
使用db.query()遍歷數(shù)據(jù)庫進(jìn)行查詢,獲取單字節(jié)指令。
Toast可以反映當(dāng)前控制端的變化,提醒用戶當(dāng)前應(yīng)用的狀態(tài)。Toast 提示的內(nèi)容如下:藍(lán)牙連接狀態(tài)改變提示、查詢指令成功提示和指令發(fā)送成功提示等。
下位機(jī)以單片機(jī)STC89C52為核心控制器,通過串口與HC-06藍(lán)牙模塊連接,接收來自上位機(jī)的指令;P1^7 I/O口與P3^2 I/O連接,可產(chǎn)生外部中斷,用于LED照明系統(tǒng)的定時(shí);P1^0、P1^1、P1^2 I/O口通過限流電阻與LED燈連接構(gòu)成LED照明系統(tǒng);與LCD1602顯示模塊的連接構(gòu)成液晶顯示電路;與紅外發(fā)射管和相應(yīng)的保護(hù)電路構(gòu)成紅外發(fā)射電路等;下位機(jī)硬件原理圖(藍(lán)牙模塊、LCD1602液晶顯示模塊以相應(yīng)的接口形式體現(xiàn))如圖2所示。
圖2 下位機(jī)硬件原理圖
下位機(jī)實(shí)物圖如圖3所示。
圖3 下位機(jī)實(shí)物圖
下位機(jī)軟件的主要功能包括接收來自上位機(jī)的指令、對(duì)指令進(jìn)行判斷、或控制LED照明系統(tǒng)、或產(chǎn)生中斷進(jìn)行定時(shí)、或控制紅外發(fā)射、或控制液晶顯示。
對(duì)于中斷服務(wù)程序,首先對(duì)指令進(jìn)行判斷,調(diào)用顯示子程序,然后程序延時(shí)2分鐘,熄滅對(duì)應(yīng)的LED燈,中斷返回。對(duì)于紅外發(fā)送部分,采用定時(shí)方式0產(chǎn)生中斷的方式產(chǎn)生載波,使用定時(shí)方式1延時(shí)的方式實(shí)現(xiàn)引導(dǎo)碼、“1”、“0”的發(fā)送。
對(duì)于液晶顯示部分,其操作時(shí)序?yàn)椋?/p>
① 讀狀態(tài):輸入RS=L,RW=H,E=H;輸出D0~D7=狀態(tài)字。
② 寫指令:輸入RS=L,RW=L,D0~D7=指令碼,E=高脈沖; 輸出無。
③ 讀數(shù)據(jù):輸入RS=H,RW=H,E=H;輸出D0~D7=數(shù)據(jù)。
④ 寫數(shù)據(jù):輸入RS=H,RW=L,D0~D7=數(shù)據(jù),E=高脈沖;輸出無。
下位機(jī)軟件程序流程圖如圖4所示。
圖4 下位機(jī)軟件程序流程圖
將smarthome.apk發(fā)送至Android手機(jī)進(jìn)行安裝,編輯指令列表,將xiaweiji.hex燒寫至單片機(jī),連接電路,接通電源,連接藍(lán)牙,部分測(cè)試用例和測(cè)試記錄見表1。
表1 部分測(cè)試用例和測(cè)試記錄
[1] 張濤.基于Android的智能家居系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].合肥:安徽大學(xué),2015.
[2] 韓迪,李建慶.Android實(shí)例詳解項(xiàng)目實(shí)訓(xùn)開發(fā)[M].北京:北京郵電大學(xué)出版社,2016.
[3] 侯殿有.單片機(jī)C語言程序設(shè)計(jì)[M].北京:人民郵電出版社,2010.
[4] David Kammer.藍(lán)牙應(yīng)用開發(fā)指南近程互聯(lián)解決方案[M].李靜,等譯.北京:科學(xué)出版社,2003.
[5] 王玉鳳.基于紅外、無線通信和語音識(shí)別的智能家電網(wǎng)絡(luò)控制系統(tǒng)[D].長(zhǎng)沙:長(zhǎng)沙理工大學(xué),2005.
[6] 北京百度網(wǎng)訊科技有限公司.百度語音識(shí)別SDK Android版開發(fā)手冊(cè)[EB/OL].[2017-09].http://yuyin.baidu.com/docs/asr/166.
[7] 百度在線網(wǎng)絡(luò)技術(shù)(北京)有限公司.百度語音合成SDK Android版開發(fā)手冊(cè)[EB/OL].[2017-09].http://yuyin.baidu.com/docs/tts.
[8] 鄧奕.Altium Designer原理圖與PCB設(shè)計(jì)[M].武漢:華中科技大學(xué)出版社,2015.
單片機(jī)與嵌入式系統(tǒng)應(yīng)用2018年1期