智能鎖方案中使用到靈動(dòng)微MM32W系列低功耗MCU,配合手機通過(guò)APP讀取智能鎖藍牙信息,嘗試配對,配對成功即可正常通訊,手機APP通過(guò)藍牙把指令發(fā)送給智能鎖進(jìn)行解鎖,整個(gè)流程簡(jiǎn)單可靠,該方案將徹底告別傳統鑰匙開(kāi)鎖。藍牙智能鎖安全便捷,符合用戶(hù)的需求,可應用的日常場(chǎng)景廣泛,例如:門(mén)鎖(家門(mén)、倉庫門(mén)、貨車(chē)門(mén)等);車(chē)鎖(電動(dòng)車(chē)鎖、自行車(chē)鎖、摩托車(chē)鎖等);私人箱柜鎖(抽屜鎖、更衣柜、旅行箱、工具箱等)。接下來(lái)靈動(dòng)微總代理英尚微給大家介紹一個(gè)使用場(chǎng)景非常豐富的藍牙應用方案——基于MM32W系列開(kāi)發(fā)的藍牙智能鎖方案。 圖1方案場(chǎng)景 硬件資源如下: 本方案基于MM32BLE_TestBoard進(jìn)行測試驗證,搭配上一顆微型的雙向直流馬達作為開(kāi)鎖方式的載體,這里只用馬達驅動(dòng)開(kāi)鎖,關(guān)鎖默認為手動(dòng)操作,用戶(hù)可以通過(guò)手機APP來(lái)操作開(kāi)鎖。在硬件原理上,本方案使用到的DC馬達是通過(guò)一顆專(zhuān)用的IC芯片來(lái)驅動(dòng),其控制引腳連接到MCU的PD2和PD3,通過(guò)控制兩個(gè)IO的電平可以對馬達進(jìn)行不同運動(dòng)狀態(tài)的操作;使用PB1連接到綠色LED指示燈,可作為藍牙連接狀態(tài)的指示;模擬鎖體狀態(tài)功能引腳PA1配置為上拉輸入,低功耗喚醒引腳選擇PA0配置為上拉輸入;藍牙相關(guān)的功能引腳與前面介紹的方案一致,此處不做過(guò)多展開(kāi)。以下為DC馬達驅動(dòng)原理圖: 圖2 方案應用圖 軟件資源如下: 結合上述使用到的硬件資源,下面我們著(zhù)重介紹軟件實(shí)現流程以及相關(guān)配置代碼。由于本應用方案ble藍牙芯片與APP建立連接過(guò)程中需要應用到配對的功能,利用藍牙庫的接口函數可以實(shí)現,這里將配對秘鑰設置為“123456”,在連接時(shí)候需要設置正確才能配對成功并且連接上;控制DC馬達的功能引腳全都配成推挽輸出模式,直接連到驅動(dòng)IC上去,通過(guò)改變高低電平組合來(lái)控制電機的正反轉和啟停;另外再對測試和模擬功能的引腳進(jìn)行配置,從而更為直觀(guān)地對應用效果的觀(guān)測和驗證,且使能看門(mén)狗復位功能來(lái)保證藍牙服務(wù)的穩定性能;由于方案應用電池供電對低功耗的需要,本方案低功耗采用STOP模式。 以下為主函數初始化配置內容,主要將所有的外設資源和藍牙協(xié)議棧初始化,并且以中斷服務(wù)程序的方式運行藍牙,主函數的循環(huán)中主要實(shí)現的功能為判斷是否進(jìn)入低功耗模式,并且喚醒后根據接收到的藍牙數據對DC馬達進(jìn)行不同的操作,代碼如下: 下面簡(jiǎn)單介紹一下藍牙低功耗和DC馬達操作相關(guān)的幾個(gè)函數: //初始化DC馬達控制引腳PD2、PD3,并且全部置為低電平 void MOTOR_Init(void);//停止DC馬達的轉動(dòng) static void MOTOR_Stop(void);//根據不同方向參數去控制DC馬達運轉 static void MOTOR_Run(unsigned char direction); 在MOTOR_Proc()處理函數中針對藍牙接收到的密碼數據進(jìn)行解析,如果與默認設置的4位0-9數字密碼完全匹配上則操作解鎖,將DC馬達按照設定方向控制運轉,為了簡(jiǎn)易驗證,模擬一個(gè)信號表示解鎖成功,這里是通過(guò)采集指定IO引腳PA1的輸入來(lái)實(shí)現,采集到輸入為高電平那么停止DC馬達轉動(dòng),且清零鎖定標志位。以下為代碼實(shí)現內容: 我們在gatt_user_send_notify_data_callback函數中給手機發(fā)送數據,該函數屬于回調函數,協(xié)議棧會(huì )在系統允許的時(shí)候(異步)回調本函數,該函數被用于藍牙模塊端主動(dòng)發(fā)送是否解鎖狀態(tài)信息給手機APP,函數內部不得增加阻塞代碼。詳細實(shí)現代碼如下: //藍牙連接成功后協(xié)議在空閑的時(shí)候會(huì )調用本回調函數 void gatt_user_send_notify_data_callback(void) { static u8 LockFlagBak = 1; if (LockFlagBak != LockFlag) { LockFlagBak = LockFlag;//LockFlag標志位會(huì )在MOTOR_Proc()中清零和置位 sconn_notifydata(&LockFlagBak,1); } } 藍牙協(xié)議會(huì )周期性回調本UsrProcCallback()函數,無(wú)論是在廣播狀態(tài)還是連接狀態(tài),在該函數中可以做運行和低功耗模式切換的超時(shí)計數,給IrqMcuGotoSleepAndWakeup()來(lái)處理是否進(jìn)入低功耗模式,并且針對獲取到的是否連接信息用LED指示燈做不同的狀態(tài)顯示。詳細實(shí)現代碼如下: //藍牙協(xié)議會(huì )周期性回調本函數 void UsrProcCallback(void) { static unsigned char led_flash = 0; IWDG_ReloadCounter(); StandbyTimeout ++; if(gConnectedFlag){ //連接成功 StandbyTimeout = 0; LED_ONOFF(1); }else{ led_flash ++; LED_ONOFF(!(led_flash%10)); //藍牙未連接,指示燈快閃 } } 除了上述關(guān)鍵的藍牙數據發(fā)送函數外,下面再簡(jiǎn)單介紹一些與藍牙相關(guān)的特征值定義,在const BLE_CHAR AttCharList[] 中定義了本案中的兩個(gè)特征值: {TYPE_CHAR,0x0011,{ATT_CHAR_PROP_W_NORSP,0x12,0,0xf1,0xff}, UUID16_FORMAT},//解鎖命令 {TYPE_CHAR,0x0013,{ATT_CHAR_PROP_RD|ATT_CHAR_PROP_NTF,0x14,0,0xf2,0xff}, UUID16_FORMAT},//鎖體狀態(tài) 在void att_server_rdByGrType( u8 pdu_type, u8 attOpcode, u16 st_hd, u16 end_hd, u16 att_type )中實(shí)現了自定義特征值服務(wù)聲明; 在void ser_write_rsp()中實(shí)現對手機APP發(fā)送的藍牙數據接收和存儲: if (StartEncryption) { if (valueLen_w < 9)//對藍牙數據進(jìn)行解析和存儲 { Password_wr[0] = valueLen_w; memcpy(&Password_wr[1], attValue, valueLen_w); } }else{ //無(wú)效數據,不保存 Password_wr[0] = 0; } 在void server_rd_rsp(u8 attOpcode, u16 attHandle, u8 pdu_type)中實(shí)現把鎖體狀態(tài)回復給手機APP: att_server_rd( pdu_type, attOpcode, attHandle, &LockFlag, 1); //將LockFlag 標志位返回給手機APP 手機操作流程如下: 使用手機原生藍牙界面查找設備,找到MM32_Lock后點(diǎn)擊進(jìn)行配對。默認配對密碼為123456,配對成功后MM32_LOCK設備自動(dòng)保存到配對設備列表,以后不需要該步驟; 手機打開(kāi)App,開(kāi)始搜索BLE設備,選擇對應名稱(chēng)(MM32_LOCK)的藍牙設備并進(jìn)行配對,等待連接成功。連接成功后會(huì )有相應提示,按鈕Connect名字會(huì )變成Disconnect; 連接成功后,對UUID為fff1的特征值寫(xiě)0x31323334(模擬用戶(hù)輸入密碼”1234”),測試板上連接的馬達開(kāi)始轉動(dòng),執行開(kāi)鎖動(dòng)作; 給PA1輸入低電平模擬鎖開(kāi)啟完成,UUID為fff2的特征值結果為0表示鎖體開(kāi)啟,給PA1輸入高電平模擬鎖體鎖上,UUID為fff2的特征值結果為1表示鎖體鎖上。這里只用馬達驅動(dòng)開(kāi)鎖,關(guān)鎖默認為手動(dòng)操作。 圖3 手機APP圖 ![]() |