|

這是一個基于STM32F411CUE6和FreeRTOS和LVGL的低成本的超多功能的STM32智能手表~ 
系統(tǒng)組成??系統(tǒng)框圖如下所示,主控使用STM32F411CEU6,操作系統(tǒng)使用FreeRTOS,圖形庫使用的LVGL。 傳感器部分:手勢識別使用6軸MPU6050;心率血氧使用的是EM7028,EM7028的資料很少,之前自己寫的局部尋峰算法來計算心率但是效果不好,現(xiàn)在改成了使用官方的庫;海拔測量用的氣壓計SPL06-001;電子指南針使用LSM303DLHC;V2.4版本,藍牙芯片換成了KT6368A,有SPP功能,可以無線升級。 
軟件架構(gòu)??手表的軟件架構(gòu)如下所示,具體的細節(jié)詳見倉庫的代碼。 
??V2.4版本以后的手表的代碼分為Bootloader和APP了,為的是方便用戶戴在手上進行不用拆解的升級,BOOT區(qū)后面劃分了一個Flag區(qū),用于記錄是否是完整的APP,這個位置是APP傳輸完成后才記錄的,為的是保證程序完整性。 
功能說明大致功能表如下圖所示: 
電源部分:手表使用的是3.7V鋰電池,通過TPS63020提供3V3電源,V2.2版本之后,充電口留了兩個焊盤,用來接觸磁吸充電口。特別注意,V2.0版本使用的無線充電,使用了芯片T3168,但是用無線充電的話,加上線圈和多的器件,體積就非常大了,同時還有散熱問題。 藍牙部分:V2.2用的是HC-04(郵票孔封裝),后面的V2.3版本改成了用國產(chǎn)芯片KT6328A,V2.4換成了KT6368A。 輔助功能部分:計算器:當(dāng)時做帶浮點數(shù)的計算器做得很煩,字符串處理很麻煩。現(xiàn)在這個計算器是通過一個數(shù)字棧和一個符號棧實現(xiàn)的,具體看代碼。 NFC部分(現(xiàn)已刪除):V2.0版本的IC卡復(fù)制器模塊介紹詳見:https:///no_chicken/ICka-fu-zhi-qi. 在V2.2版本中,為了精簡減小體積,僅有UID卡,可以被外部讀卡器讀寫。而在V2.0版本中,用的是RC522和一張UID卡組成的,可以自行復(fù)制外部IC卡,然后也可以被外部讀卡器讀寫如下圖所示:

版本更新的功能說明V2.4.2增加的功能:加入PageManager.c, 方便進行頁面管理, 代碼框架有較大改動. 加入HWDataAccess.c, 用于UI層訪問BSP層, 當(dāng)需要移植到仿真器時, 復(fù)制Func文件夾和GUI_App文件夾過去, 將HW_USE_HARDWARE定義為0即可. 同步更新了LVGL的Vscode仿真工程.
V2.4.1增加的功能:睡眠時DeInit串口的IO口,設(shè)置為輸入,修復(fù)休眠功耗很高的情況,現(xiàn)在休眠狀態(tài)電流800多uA. BootLoader和APP都加入長按KEY1關(guān)機功能. APP中按鍵KEY的BSP改動,現(xiàn)在是按鍵按下松開才發(fā)生作用,避免了一些誤觸情況.
如何燒錄由于具體的步驟太多這里不放了, 詳細見Firmware中的README文件: BootLoader和APP說明 如果你覺得帶BootLoader可無線升級的V2.4.0版本比較麻煩, 可以自行下載ver2.3.2分支, 用以前的代碼. 實物圖軟件部分設(shè)計細節(jié):1.低功耗設(shè)計??手表的模式分為3個。第一個是正常的運行模式,手表正常運行;第二個是睡眠模式,MCU進入STOP模式,MPU6050仍在記步數(shù);第三個是關(guān)機模式,TPS63020直接關(guān)閉使能,此時無3V3供電,只有Vbat有供電。 ??在最開始的時候,手表從睡眠到喚醒使用的是MPU6050的運動功能,打開中斷,喚醒,但是這樣嘗試過,有個問題就是需要抖動幅度很大才能觸發(fā)中斷。所以最后還是用的RTC定時中斷,然后定時檢測當(dāng)前手勢狀態(tài),如果有抬腕動作則喚醒。 ??MPU6050不能直接使用DMP庫,初始化后功耗很高,需要進行一些改動,才能讓功耗下來,具體看工程代碼。 ??如果藍牙使用KT6328A,不建議關(guān)閉藍牙使能,他的待機功耗很低。但后面2.4版本Back板改了,可以完全關(guān)閉藍牙,所以直接使用KT6368A即可,不用的時候關(guān)掉藍牙就行。 ??最后接3V3測試,運行模式70-80mA,待機模式1mA左右,關(guān)機模式基本不耗電只有RTC在工作。當(dāng)然后面沒有測試電源接到Vbat端經(jīng)過DCDC供電的情況,這個功耗就完全看DCDC的效率的。 2.心率血氧??血氧部分暫時還沒有寫。心率計算本來使用的官方的庫,但是計算太慢了,后面改為自己寫的一個簡易的峰值檢測的算法。EM7028的PPG信號如下圖所示 
3.數(shù)據(jù)存儲??目前使用的外部的EEPROM進行數(shù)據(jù)存儲,主要用于存儲設(shè)置等,詳細可以看Datasave.c文件。 4.頁面切換邏輯??為了實現(xiàn)頁面切換,可以返回上次的界面,這里使用了一個棧來存儲頁面對應(yīng)的,例如,使用user_Stack_Pop(&ScrRenewStack);彈出上一個界面,然后進入到新的界面再使用 user_Stack_Push(&ScrRenewStack,(long long int)&ui_HomePage);入棧一個界面的指針地址。注意不能直接在push操作使用類似ui_HomePage入棧,它是會動態(tài)變化的,這是個很大的坑。
//key1 pressedif(keystr == 1){ user_Stack_Pop(&ScrRenewStack); if(user_Stack_isEmpty(&ScrRenewStack)) { ui_MenuPage_screen_init(); lv_scr_load_anim(ui_MenuPage,LV_SCR_LOAD_ANIM_MOVE_RIGHT,0,0,true); user_Stack_Push(&ScrRenewStack,(long long int)&ui_HomePage); user_Stack_Push(&ScrRenewStack,(long long int)&ui_MenuPage); } else if(ScrRenewStack.Data[ScrRenewStack.Top_Point-1] == (long long int)&ui_HomePage) { ui_HomePage_screen_init(); lv_scr_load_anim(ui_HomePage,LV_SCR_LOAD_ANIM_MOVE_RIGHT,0,0,true); }}
5.計算器邏輯??計算器的邏輯就是很經(jīng)典的計算器問題,經(jīng)典的就是開兩個棧,一個存放符號,一個存數(shù)字,然后進行出棧計算等等操作,以1+2*6/3為例,具體的過程如下動圖所示。但是會有一個問題就是小數(shù)點,這個動圖展示的只是整數(shù)計算的邏輯,帶小數(shù)點的詳細見代碼。 具體整數(shù)計算的過程是: 遍歷表達式,當(dāng)遇到操作數(shù),將其壓入操作數(shù)棧。 遇到運算符時,如果運算符棧為空,則直接將其壓入運算符棧。 如果運算符棧不為空,那就與運算符棧頂元素進行比較:如果當(dāng)前運算符優(yōu)先級比棧頂運算符高,則繼續(xù)將其壓入運算符棧,如果當(dāng)前運算符優(yōu)先級比棧頂運算符低或者相等,則從操作數(shù)符棧頂取兩個元素,從棧頂取出運算符進行運算,并將運算結(jié)果壓入操作數(shù)棧。 繼續(xù)將當(dāng)前運算符與運算符棧頂元素比較。 繼續(xù)按照以上步驟進行遍歷,當(dāng)遍歷結(jié)束之后,則將當(dāng)前兩個棧內(nèi)元素取出來進行運算即可得到最終結(jié)果。
6. LVGL在windows在vscode的仿真配置參考:??已經(jīng)更改好的可以跑的代碼放在了lv_sim_vscode_win這個文件夾中,應(yīng)該可以直接使用vscode打開,注意,需要大家自行改一下Cmake和make等相關(guān)設(shè)置的路徑?。。?! 仿真文件也放在了附件里了。配置環(huán)境可以參考的鏈接: https://blog.csdn.net/weixin_49337111/article/details/136536375。 
轉(zhuǎn)載自:https:///no_chicken/zhi-neng-shou-biao-OV-Watch_V2.2#P4 關(guān)注公眾號,加星標,回復(fù)1024獲取學(xué)習(xí)資料,每天進步一點點。
聲明:
|