智能家居應(yīng)用技術(shù) 課件5.-智云硬件層驅(qū)動(dòng)設(shè)計(jì)_第1頁
智能家居應(yīng)用技術(shù) 課件5.-智云硬件層驅(qū)動(dòng)設(shè)計(jì)_第2頁
智能家居應(yīng)用技術(shù) 課件5.-智云硬件層驅(qū)動(dòng)設(shè)計(jì)_第3頁
智能家居應(yīng)用技術(shù) 課件5.-智云硬件層驅(qū)動(dòng)設(shè)計(jì)_第4頁
智能家居應(yīng)用技術(shù) 課件5.-智云硬件層驅(qū)動(dòng)設(shè)計(jì)_第5頁
已閱讀5頁,還剩27頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

智云硬件層驅(qū)動(dòng)設(shè)計(jì)廣東誠飛智能科技有限公司智云硬件Hal層驅(qū)動(dòng)框架采集類傳感器驅(qū)動(dòng)設(shè)計(jì)控制類傳感器驅(qū)動(dòng)設(shè)計(jì)安防類傳感器驅(qū)動(dòng)設(shè)計(jì)智云硬件層設(shè)計(jì)實(shí)例智云硬件HAL軟件框架(ZigBee)基于CC2530處理器的智云節(jié)點(diǎn)采用ZStack協(xié)議棧,參考工程如下:dht11.c/.h溫濕度傳感器的驅(qū)動(dòng)UserApp.c/.hZXBee協(xié)議驅(qū)動(dòng)代碼sensor_init() #傳感器硬件初始化sensor_update() #定時(shí)主動(dòng)上報(bào)傳感器數(shù)值sensor_control() #傳感器控制邏輯sensor_check() #監(jiān)測傳感器報(bào)警狀態(tài)值usr_process_command_call()#解析收到的控制命令MyEventProcess() #自定義處理事件AppCommon.cZStacksapi接口實(shí)現(xiàn)zb_HandleOsalEvent() #OSAL事件zb_ReceiveDataIndication()#接收到無線數(shù)據(jù)包process_package() #ZXBee數(shù)據(jù)包解析_process_command_call()#解析收到的控制命令ZXBee驅(qū)動(dòng)框架傳感器初始化sensor_init()開始入網(wǎng)成功是否設(shè)置定時(shí)器開啟用戶任務(wù)事件事件發(fā)生是否用戶任務(wù)事件處理MyEventProcess()設(shè)置定時(shí)器開啟用戶任務(wù)事件接收數(shù)據(jù)是否接收數(shù)據(jù)處理usr_process_command_call()上報(bào)傳感器值/執(zhí)行控制等操作ZXBee驅(qū)動(dòng)基于sapi框架開發(fā),詳細(xì)的程序流程圖如上所示ZXBee驅(qū)動(dòng)框架(event&ZB_ENTRY_EVENT)事件:1.判斷/設(shè)置節(jié)點(diǎn)類型2.設(shè)置網(wǎng)絡(luò)信號(hào)LED燈閃爍3.調(diào)用sensor_init()函數(shù)進(jìn)行傳感器初始化(event&0x000F)事件:1.進(jìn)入用戶自定義事件(0x0001~0x000F),該函數(shù)在UserApp.c文件內(nèi)MyEventProcess()函數(shù)實(shí)現(xiàn)voidzb_HandleOsalEvent(uint16event)檢測是否正確入網(wǎng),入網(wǎng)成功后網(wǎng)絡(luò)信號(hào)LED燈長亮voidzb_StartConfirm(uint8status)處理接收到的無線數(shù)據(jù)包處理并分解ZXBee無線數(shù)據(jù)包,提取命令鍵值對(duì)voidzb_ReceiveDataIndication(uint16source,uint16command,uint16len,uint8*pData)staticvoidprocess_package(char*pkg,intlen)1.處理ZXBee無線數(shù)據(jù)包內(nèi)的命令鍵值對(duì)(通用命令)2.調(diào)用usr_process_command_call(ptag,pval,pout)函數(shù)處理用戶命令staticint_process_command_call(char*ptag,char*pval,char*pout)ZXBee用戶程序設(shè)計(jì)智云平臺(tái)為ZigBeeZStack協(xié)議棧上層應(yīng)用提供分層的軟件設(shè)計(jì)結(jié)構(gòu),將傳感器的私有操作部分封裝到UserApp.c文件中函數(shù)名稱函數(shù)說明sensor_init()傳感器硬件初始化sensor_update()傳感器數(shù)據(jù)定時(shí)上報(bào)sensor_check()傳感器報(bào)警狀態(tài)實(shí)時(shí)監(jiān)測sensor_control()傳感器/執(zhí)行器控制函數(shù)usr_process_command_call()解析接收到的傳感器控制命令函數(shù)MyEventProcess()自定義事件處理函數(shù),啟動(dòng)定時(shí)器觸發(fā)事件MY_REPORT_EVT智云硬件Hal層驅(qū)動(dòng)框架采集類傳感器驅(qū)動(dòng)設(shè)計(jì)控制類傳感器驅(qū)動(dòng)設(shè)計(jì)安防類傳感器驅(qū)動(dòng)設(shè)計(jì)智云硬件層設(shè)計(jì)實(shí)例采集類傳感器設(shè)計(jì)示例案例:設(shè)計(jì)智能溫濕度采集終端根據(jù)ZXBee協(xié)議定義,協(xié)議設(shè)定如下:傳感器屬性參數(shù)權(quán)限說明溫濕度溫度值A(chǔ)0R溫度值,浮點(diǎn)型:0.1精度濕度值A(chǔ)1R濕度值,浮點(diǎn)型:0.1精度上報(bào)狀態(tài)D0(OD0/CD0)R(W)D0的Bit0表示溫度上傳狀態(tài)、Bit1表示濕度上傳狀態(tài)上報(bào)間隔V0RW修改主動(dòng)上報(bào)的時(shí)間間隔采集類傳感器設(shè)計(jì)示例溫濕度傳感器程序邏輯sensor_init()初始化MY_REPORT_EVT事件接收到無線數(shù)據(jù)數(shù)據(jù)解析A0=?讀取溫度值并上報(bào)A1=?讀取濕度值并上報(bào)D0=?讀取上傳狀態(tài)并上報(bào)V0=?讀取上傳間隔并上報(bào)CD0/OD0控制上傳狀態(tài)V0控制上傳時(shí)間間隔D0參數(shù)V0參數(shù)上報(bào)A0溫度、A1濕度值自動(dòng)上傳開始采集類傳感器用戶主要函數(shù)函數(shù)名稱函數(shù)說明sensor_init()傳感器硬件初始化sensor_update()傳感器溫濕度數(shù)據(jù)定時(shí)上報(bào)updateA0()更新并獲取溫度值updateA1()更新并獲取濕度值usr_process_command_call()解析接收到的傳感器控制命令函數(shù)MyEventProcess()自定義事件處理函數(shù),啟動(dòng)定時(shí)器觸發(fā)事件MY_REPORT_EVT采集類傳感器設(shè)計(jì)示例無線ZigBee節(jié)點(diǎn)上電啟動(dòng)后,根據(jù)ZStack協(xié)議棧邏輯,首先會(huì)初始化溫濕度傳感器sensor_init()函數(shù)在UserApp.c中實(shí)現(xiàn),主要是完成溫濕度傳感器初始化工作,并啟動(dòng)定時(shí)器,觸發(fā)用戶事件MY_REPORT_EVTUserApp.cvoidsensor_init(void){dht11_io_init();//初始化傳感器代碼

//啟動(dòng)定時(shí)器,觸發(fā)事件:MY_REPORT_EVTosal_start_timerEx(sapi_TaskID,MY_REPORT_EVT,(uint16)((osal_rand()%10)*1000));}AppCommon.cvoidzb_HandleOsalEvent(uint16event){if(event&ZB_ENTRY_EVENT){......sensor_init();}}采集類傳感器設(shè)計(jì)示例MY_REPORT_EVT事件是在UserApp.c中實(shí)現(xiàn)的MY_REPORT_EVT事件首先會(huì)更新上報(bào)一次溫濕度傳感器的數(shù)值,然后在myReportInterval(默認(rèn)值為30秒)時(shí)間后再次啟動(dòng)MY_REPORT_EVT事件,使得每隔myReportInterval時(shí)間無線ZigBee節(jié)點(diǎn)會(huì)自動(dòng)更新上報(bào)一次溫濕度傳感器的數(shù)值UserApp.cvoidMyEventProcess(uint16event){if(event&MY_REPORT_EVT){sensor_update();//啟動(dòng)定時(shí)器,觸發(fā)事件:MY_REPORT_EVTosal_start_timerEx(sapi_TaskID,MY_REPORT_EVT,(uint16)(myReportInterval*1000));}}UserApp.cvoidsensor_update(void){……//根據(jù)D0的位狀態(tài)判定需要主動(dòng)上報(bào)的數(shù)值

if((D0&0x01)==0x01){//若溫度上報(bào)允許,則pData的數(shù)據(jù)包中添加溫度數(shù)據(jù)

updateA0();len=sprintf((char*)p,"A0=%.1f",A0);……}if((D0&0x02)==0x02){//若濕度上報(bào)允許,則pData的數(shù)據(jù)包中添加濕度數(shù)據(jù)

updateA1();len=sprintf((char*)p,"A1=%.1f",A1);……}//將需要上傳的數(shù)據(jù)進(jìn)行打包操作,并通過zb_SendDataRequest()發(fā)送到協(xié)調(diào)器

if(p-pData>1){……zb_SendDataRequest(0,cmd,p-pData,pData,0,AF_ACK_REQUEST,AF_DEFAULT_RADIUS);HalLedSet(HAL_LED_1,HAL_LED_MODE_BLINK);//通信LED閃爍一次

}}采集類傳感器設(shè)計(jì)示例溫濕度傳感器數(shù)值主動(dòng)上報(bào)函數(shù)update(),該函數(shù)實(shí)現(xiàn)是在UserApp.c文件中UserApp.cfloatupdateA0(void){dht11_update();A0=dht11_temp();//獲取溫度值

returnA0;}floatupdateA1(void){dht11_update();A1=dht11_humidity();//獲取濕度值

returnA1;}采集類傳感器設(shè)計(jì)示例溫濕度的數(shù)值更新函數(shù)為:updateA0(),updateA1(),在UserApp.c中實(shí)現(xiàn)采集類傳感器設(shè)計(jì)示例無線ZigBee節(jié)點(diǎn)入網(wǎng)成功后,會(huì)監(jiān)測上層發(fā)送過來的數(shù)據(jù)包,數(shù)據(jù)包會(huì)在文件AppCommon.c->process_package(char*pkg,intlen)函數(shù)內(nèi)對(duì)數(shù)據(jù)包做一定的解析,將解析出來的指令傳遞給文件UserApp.c->intusr_process_command_call(char*ptag,char*pval,char*pout)函數(shù),該函數(shù)根據(jù)指令來響應(yīng)請(qǐng)求。UserApp.cintusr_process_command_call(char*ptag,char*pval,char*pout){......if(0==strcmp("CD0",ptag)){D0&=~val;}if(0==strcmp("OD0",ptag)){D0|=val;}if(0==strcmp("D0",ptag)){if(0==strcmp("?",pval)){ret=sprintf(pout,"D0=%u",D0);}}if(0==strcmp("A0",ptag)){if(0==strcmp("?",pval)){updateA0();//更新溫度數(shù)值

ret=sprintf(pout,"A0=%.1f",A0);}}UserApp.cif(0==strcmp("A1",ptag)){if(0==strcmp("?",pval)){updateA1();//更新濕度數(shù)值

ret=sprintf(pout,"A1=%.1f",A1);}}if(0==strcmp("V0",ptag)){if(0==strcmp("?",pval)){ret=sprintf(pout,"V0=%u",V0);}else{updateV0(pval);}}returnret;}采集類傳感器設(shè)計(jì)示例智云硬件Hal層驅(qū)動(dòng)框架采集類傳感器驅(qū)動(dòng)設(shè)計(jì)控制類傳感器驅(qū)動(dòng)設(shè)計(jì)安防類傳感器驅(qū)動(dòng)設(shè)計(jì)智云硬件層設(shè)計(jì)實(shí)例控制類傳感器設(shè)計(jì)示例案例:設(shè)計(jì)智能繼電器開關(guān)終端根據(jù)ZXBee協(xié)議定義,協(xié)議設(shè)定如下:傳感器屬性參數(shù)權(quán)限說明繼電器繼電器開合D1(OD1/CD1)R(W)D1的Bit表示各路繼電器開合狀態(tài),OD1為開、CD1為合控制類傳感器設(shè)計(jì)示例繼電器控制器程序邏輯sensor_init()初始化MY_REPORT_EVT事件接收到無線數(shù)據(jù)數(shù)據(jù)解析D1=?獲取繼電器狀態(tài)并上報(bào)CD1/OD1控制繼電器上報(bào)D1繼電器狀態(tài)自動(dòng)上傳開始控制類傳感器用戶主要函數(shù)函數(shù)名稱函數(shù)說明sensor_init()傳感器硬件初始化sensor_update()傳感器數(shù)據(jù)定時(shí)上報(bào)sensor_control()傳感器/執(zhí)行器控制函數(shù)usr_process_command_call()解析接收到的傳感器控制命令函數(shù)MyEventProcess()自定義事件處理函數(shù),啟動(dòng)定時(shí)器觸發(fā)事件MY_REPORT_EVT控制類傳感器設(shè)計(jì)示例在UseApp.c文件中實(shí)現(xiàn)解析控制命令函數(shù)usr_process_command_call(),當(dāng)上層應(yīng)用發(fā)送控制命令時(shí),解析命令的代碼實(shí)現(xiàn)如下。UserApp.cintusr_process_command_call(char*ptag,char*pval,char*pout){......if(0==strcmp("CD1",ptag)){//關(guān)閉繼電器命令D1&=~val;sensor_control(D1);}if(0==strcmp("OD1",ptag)){//打開繼電器命令

D1|=val;sensor_control(D1);//調(diào)用函數(shù)來打開繼電器

}if(0==strcmp("D1",ptag)){//查詢繼電器狀態(tài)

if(0==strcmp("?",pval)){ret=sprintf(pout,"D1=%u",D1);//命令數(shù)據(jù)

}}......}控制類傳感器設(shè)計(jì)示例函數(shù)sensor_control()用來控制繼電器的狀態(tài)UserApp.c//控制繼電器的狀態(tài)voidsensor_control(uint8cmd){if(cmd==0){SENSOR_PORT|=0x22;//LS1/LS2斷開

}elseif(cmd==1){SENSOR_PORT&=~0x02;//LS1閉合

SENSOR_PORT|=0x20;//LS2斷開

}elseif(cmd==2){SENSOR_PORT|=0x02;//LS1斷開

SENSOR_PORT&=~0x20;//LS2閉合

}elseif(cmd==3){SENSOR_PORT&=~0x22;//LS1/LS2閉合

}}智云硬件Hal層驅(qū)動(dòng)框架采集類傳感器驅(qū)動(dòng)設(shè)計(jì)控制類傳感器驅(qū)動(dòng)設(shè)計(jì)安防類傳感器驅(qū)動(dòng)設(shè)計(jì)智云硬件層設(shè)計(jì)實(shí)例安防類傳感器設(shè)計(jì)示例案例:設(shè)計(jì)燃?xì)獗O(jiān)測終端根據(jù)ZXBee協(xié)議定義,協(xié)議設(shè)定如下:傳感器屬性參數(shù)權(quán)限說明可燃?xì)怏w數(shù)值A(chǔ)0R燃?xì)鈭?bào)警狀態(tài),0或1上報(bào)狀態(tài)D0(OD0/CD0)R(W)D0的Bit0表示上傳狀態(tài)安防類傳感器設(shè)計(jì)示例燃?xì)獗O(jiān)測器程序邏輯sensor_init()初始化MY_REPORT_EVT事件接收到無線數(shù)據(jù)數(shù)據(jù)解析A0=?讀取報(bào)警值并上報(bào)D0=?讀取上傳狀態(tài)并上報(bào)D0參數(shù)定時(shí)上報(bào)A0自動(dòng)上傳開始CD0/OD0控制上傳狀態(tài)MY_CHECK_EVT事件sensor_check監(jiān)測報(bào)警狀態(tài)報(bào)警上報(bào)或狀態(tài)變化上報(bào)A0安防類傳感器用戶主要函數(shù)函數(shù)名稱函數(shù)說明sensor_init()傳感器硬件初始化sensor_update()傳感器數(shù)據(jù)定時(shí)上報(bào)updateA0()更新并獲取燃?xì)庵祍ensor_check()傳感器報(bào)警狀態(tài)實(shí)時(shí)監(jiān)測usr_process_command_call()解析接收到的傳感器控制命令函數(shù)MyEventProcess()自定義事件處理函數(shù),啟動(dòng)定時(shí)器觸發(fā)事件MY_REPORT_EVT安防類傳感器設(shè)計(jì)示例sensor_init()函數(shù)在UserApp.c中實(shí)現(xiàn),主要是完成燃?xì)庥布跏蓟ぷ?,并啟?dòng)定時(shí)器,觸發(fā)用戶事件MY_REPORT_EVT(定期上報(bào)燃?xì)鉅顟B(tài)),MY_CHECK_EVT事件(報(bào)警態(tài)監(jiān)測事件)UserApp.cvoidsensor_init(void){//配置P0_5端口為通用輸入IOSENSOR_SEL&=~(SENSOR_BIT);SENSOR_DIR&=~(SENSOR_BIT);

//啟動(dòng)定時(shí)器,觸發(fā)事件:MY_REPORT_EVTosal_start_timerEx(sapi_TaskID,MY_REPORT_EVT,(uint16)((osal_rand()%10)*1000));//啟動(dòng)定時(shí)器,觸發(fā)事件:MY_CHECK_EVTosal_start_timerEx(sapi_TaskID,MY_CHECK_EVT,(uint16)((osal_rand()%10)*1000));}UserApp.cvoidMyEventProcess(uint16event){if(event&MY_REPORT_EVT){//主動(dòng)上報(bào)報(bào)警狀態(tài)值函數(shù)

sensor_update();//啟動(dòng)定時(shí)器,觸發(fā)事件:MY_REPORT_EVT,定時(shí)上報(bào)數(shù)據(jù)

osal_start_timerEx(sapi_TaskID,MY_REPORT_EVT,(uint16)(myReportInterval*1000));}if(event&MY_CHECK_EVT){//檢測警報(bào)值函數(shù)

sensor_check();//啟動(dòng)定時(shí)器,觸發(fā)事件:MY_CHECK_EVT,定時(shí)查詢報(bào)警值

osal_start_timerEx(sapi_TaskID,MY_CHECK_EVT,1000);}}安防類傳感器設(shè)計(jì)示例事件處理函數(shù)是在UserApp.c中實(shí)現(xiàn)的,正常態(tài)觸發(fā)MY_REPORT_EVT每隔120s上傳一次燃?xì)鉅顟B(tài),同時(shí)通過sensor_check()函數(shù)不停的監(jiān)聽燃?xì)鈭?bào)警狀態(tài),當(dāng)監(jiān)測到報(bào)警時(shí),則每隔3s上傳一次報(bào)警值UserApp.cvoidsensor_check(void){//

//檢測報(bào)警值并決定是否報(bào)警……if((D0&0x01)==1){//判斷是否開啟了主動(dòng)上報(bào)

lastA0=A0;//記錄上次A0的值

updateA0();//更新A0的值if(A0==1){if(Flag%3==0){//每3秒報(bào)警一次

len=sprintf((char*)pData,"{A0=%u}",A0);zb_SendDataRequest(0,cmd,len,(uint8*)pData,0,AF_ACK_REQUEST,AF_DEFAULT_RADIUS);HalLedSet(HAL_LED_1,HAL_LED_MODE_BLINK);//通信LED閃爍一次

}

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論