【RT-Thread作品秀】運(yùn)動(dòng)手表
作者:何雄
概述
該作品是基于ART-PI硬件平臺(tái),外接OLED,蜂鳴器,按鍵,X-NUCLEO-IKS01A3傳感器套件完成實(shí)現(xiàn)的運(yùn)動(dòng)手表。
運(yùn)動(dòng)手表應(yīng)該能夠兼顧溫濕度,氣壓信息,指南針以及步數(shù)等,能夠?qū)崟r(shí)監(jiān)控環(huán)境的狀態(tài)。
該運(yùn)動(dòng)手表實(shí)現(xiàn)功能如下:
- 時(shí)間日期星期顯示;
- 網(wǎng)絡(luò)時(shí)間獲??;
- 天氣獲取并顯示;
- 溫度(HTS221),濕度(HTS221),氣壓(LPS2HH)信息的獲取并顯示;
- 指南針功能(LIS2MDL);
- 步數(shù)(LSM6DSO)監(jiān)控;
- 鬧鐘功能,蜂鳴器鬧鐘;
- 設(shè)置功能,開(kāi)啟網(wǎng)絡(luò)時(shí)間以及設(shè)置鬧鐘;
- OLED顯示功能
- 板載按鍵
- 秒表
開(kāi)發(fā)環(huán)境
硬件:STM32H750-RT-ART-PI, X-NUCLEO-IKS01A3傳感器,OLED,蜂鳴器,板載按鍵
RT-Thread版本:4.0.3
開(kāi)發(fā)工具及版本:RT-thread studio 2.0.0
RT-Thread使用情況概述
內(nèi)核部分:線(xiàn)程管理(靜態(tài)線(xiàn)程創(chuàng)建/刪除),臨界操作,時(shí)鐘管理。
組件部分:FinSH控制臺(tái),虛擬文件系統(tǒng),LwIP,SAL
軟件包部分:cjson,netutils,easyflash,u8g2
其他:串口,pin,RTC,IIC
硬件框架
項(xiàng)目中使用到了STM32H750中的RTC實(shí)時(shí)時(shí)鐘不在原理圖中。
同時(shí)用到了ART-PI板載的wifi模塊對(duì)天氣獲取以及網(wǎng)絡(luò)時(shí)間的獲取。
硬件部分比較簡(jiǎn)單主要是通過(guò)IIC控制OLED以及傳感器數(shù)據(jù)的讀取(讀取4個(gè)傳感器數(shù)據(jù)分別用作溫濕度,氣壓以及磁場(chǎng)和運(yùn)動(dòng)檢測(cè)),通過(guò)GPIO控制蜂鳴器。
按鍵用來(lái)切換查看界面以及設(shè)置信息,本項(xiàng)目只采用了一個(gè)按鍵,通過(guò)軟件邏輯實(shí)現(xiàn)對(duì)4中按下?tīng)顟B(tài)的識(shí)別。
硬件線(xiàn)路連接:
蜂鳴器 - PA9
OLED SCL - PH13
OLED SDA - PH15
X-NUCLEO-IKS01A3傳感器 SCL - PB0
X-NUCLEO-IKS01A3傳感器 SDA - PB2
軟件框架說(shuō)明
整體軟件實(shí)現(xiàn)了功能框架如下:
軟件中主要包括了下面的功能:
- 按鍵狀態(tài)的信號(hào)采集以及濾波功能,由于只有一個(gè)按鍵,所以將這一個(gè),按鍵的按下?tīng)顟B(tài)做了不同的識(shí)別,分為了4種按下的狀態(tài)可以用來(lái)處理所有的任務(wù)。
- OLED的顯示功能
- 啟動(dòng)界面,會(huì)顯示RT-Thread的logo以及項(xiàng)目logo。
- 時(shí)間顯示界面:會(huì)顯示時(shí)間,日期,星期,wifi連接狀態(tài),天氣信息,在wifi沒(méi)有連接的狀態(tài)下,wifi圖標(biāo)會(huì)閃爍。
- 菜單列表:用來(lái)切換顯示的界面,包含設(shè)置,秒表、步數(shù)、溫度、濕度、氣壓、方位。通過(guò)短按按鈕切換。
- 設(shè)置界面??梢栽O(shè)置是否開(kāi)啟網(wǎng)絡(luò)時(shí)間更新以及設(shè)置鬧鐘。鬧鐘設(shè)置界面中可以設(shè)置鬧鐘是否啟用以及設(shè)置鬧鐘時(shí)間。
- 秒表功能,在該界面下,秒表線(xiàn)程被創(chuàng)建,按下按鈕切換到開(kāi)啟按鈕下按下按鈕可以開(kāi)啟計(jì)時(shí),再次按下暫停計(jì)時(shí),退出該界面自動(dòng)刪除線(xiàn)程。
- 步數(shù)查看。步數(shù)線(xiàn)程會(huì)一直運(yùn)行,用于記錄運(yùn)動(dòng)狀態(tài),使用LSM6DSO獲取加速度數(shù),由此進(jìn)行步數(shù)算法檢測(cè)步數(shù)。
- 溫度、濕度、氣壓查看。獲取傳感器的數(shù)據(jù)進(jìn)行處理之后顯示在界面上。
- 指南針(方位)界面,可以查看當(dāng)前面向的方向,使用了LIS2MDL磁力傳感器以及LSM6DSO加速度傳感器通過(guò)算法結(jié)合計(jì)算出指向方位,并通過(guò)圖形顯示以及問(wèn)題提示的方式指向當(dāng)前的方位(東、南、西、北、東南、東北、西南、西北)。
- 返回。返回時(shí)間顯示界面。
- 鬧鐘功能
RTC獲取的時(shí)間到了鬧鐘設(shè)置中設(shè)置的指定的時(shí)間之后將觸發(fā)鬧鐘功能。在主界面下通過(guò)短按按鈕關(guān)閉。
軟件模塊說(shuō)明
一、按鍵功能介紹:
因?yàn)榘遢d只有一個(gè)按鍵,我也沒(méi)有外接按鍵資源,所以將這一個(gè)按鍵通過(guò)按鍵時(shí)間的長(zhǎng)短分為了4種按下?tīng)顟B(tài),通過(guò)松手判斷按鈕按下的時(shí)間長(zhǎng)短。
按鍵線(xiàn)程中使用了軟件按鍵濾波功能,濾波時(shí)間是50ms。
四種按鍵狀態(tài)分別如下:
1 【短按】:按下時(shí)間小于等于500ms
2 【中長(zhǎng)按】:按下時(shí)間大于500ms小于等于1.5s
3 【偏長(zhǎng)按】:按下時(shí)間大于1.5s小于等于2.5s
4 【長(zhǎng)按】:按下時(shí)間大于2.5s
按鍵線(xiàn)程在初始化的時(shí)候創(chuàng)建。
- OLED顯示功能
OLED的顯示功能是主要的功能,這里對(duì)OLED的功能做詳述說(shuō)明。
- 開(kāi)機(jī)動(dòng)畫(huà)。上電的時(shí)候會(huì)顯示開(kāi)機(jī)界面,首先顯示RT-Thread的圖標(biāo),之后顯示運(yùn)動(dòng)手表的logo,顯示完成之后自動(dòng)進(jìn)入主界面。
- 主界面就是時(shí)間顯示界面,如下圖:
- 最上邊顯示【星期 - 月份 日期】;
- 中間部分顯示時(shí)間,如果網(wǎng)絡(luò)連接之后會(huì)自動(dòng)更新時(shí)間,可以在設(shè)置界面關(guān)閉自動(dòng)更新,網(wǎng)絡(luò)時(shí)間會(huì)更新到RTC中,時(shí)間直接讀取自RTC。;
- 最下面一列顯示wifi連接狀態(tài)以及天氣信息,在wifi沒(méi)有連接的狀況下會(huì)500ms閃爍一次,wifi連接之后,wifi圖標(biāo)不再閃爍,天氣圖標(biāo)會(huì)自動(dòng)循環(huán)顯示。
- 天氣包括晴天,雨天,多云,夜晚,晴轉(zhuǎn)陰。
- 天氣信息通過(guò)網(wǎng)絡(luò)獲取,獲取網(wǎng)絡(luò)天氣的json信息,處理出信息,所以需要線(xiàn)連接網(wǎng)絡(luò)才可以使用。
- 如果按下開(kāi)關(guān),最下一列中間會(huì)顯示開(kāi)關(guān)按下的狀態(tài)【KEY1】【KEY2】【KEY3】【KEY4】,如下右圖,沒(méi)有開(kāi)關(guān)按下的時(shí)候不顯示。
- 長(zhǎng)按按鈕進(jìn)入菜單選擇界面
- 中長(zhǎng)按按鈕進(jìn)入設(shè)置界面
- 菜單界面
- 菜單界面顯示【返回】【設(shè)置】【秒表】【步數(shù)】【溫度】【濕度】【氣壓】【方位】,如下左圖。
- 最上邊顯示左邊菜單圖標(biāo),右邊顯示退出圖標(biāo)。
- 短按按鈕切換菜單在上述1)中的菜單列表中循環(huán)切換
- 中長(zhǎng)按按鈕進(jìn)入選中的菜單功能中。
- 長(zhǎng)按按鈕退回主界面
- 按下按鈕的時(shí)候屏幕最上面中間會(huì)顯示按鈕按下的狀態(tài)【KEY1】【KEY2】【KEY3】【KEY4】,如下右圖
- 設(shè)置
設(shè)置界面顯示【是否啟動(dòng)網(wǎng)絡(luò)時(shí)間】以及【鬧鐘設(shè)置】
- 網(wǎng)絡(luò)時(shí)間后面的方框表示是否啟用,實(shí)心方框表示啟用,默認(rèn)是啟用的
- 短按按鈕切換菜單
- 中長(zhǎng)按按鈕設(shè)置
選中【鬧鐘設(shè)置】,短按進(jìn)入鬧鐘設(shè)置界面。
- 中長(zhǎng)按切換選中菜單,分別有【啟用鬧鐘】【小時(shí)設(shè)置】【分鐘設(shè)置】
- 選中啟用菜單,短按啟用或者禁止,啟用了鬧鐘之后會(huì)創(chuàng)建鬧鐘線(xiàn)程,運(yùn)行鬧鐘功能,禁止鬧鐘之后會(huì)刪除鬧鐘線(xiàn)程。
- 選中小時(shí)設(shè)置或者分鐘該設(shè)置,短按時(shí)間會(huì)增加。
- 鬧鐘設(shè)置好了之后,到達(dá)指定時(shí)間會(huì)啟動(dòng)蜂鳴器報(bào)警,在主界面下短按按鈕會(huì)關(guān)閉鬧鐘,到下一次到指定時(shí)間會(huì)重新報(bào)警。
四、秒表
當(dāng)切換到秒表界面的時(shí)候會(huì)自動(dòng)創(chuàng)新秒表線(xiàn)程,在退出秒表顯示界面時(shí)會(huì)自動(dòng)刪除秒表任務(wù),秒表任務(wù)100ms運(yùn)行一次。
1、秒表顯示界面,最上邊左邊顯示秒表圖標(biāo),右邊顯示退出圖標(biāo)
2、中間顯示記錄秒表時(shí)間
3、下面顯示操作菜單
1) 第一個(gè)是開(kāi)始按鈕,短按啟動(dòng)計(jì)時(shí),菜單編程停止,短按停止計(jì)時(shí),如下左圖。
2) 中間是清空按鈕,短按按下清空計(jì)時(shí)數(shù)據(jù)
3) 右邊是返回,短按返回菜單列表
4、中長(zhǎng)按切換下列的菜單
5、長(zhǎng)按退回主界面
6、按下按鈕的時(shí)候屏幕最上面中間會(huì)顯示按鈕按下的狀態(tài)【KEY1】【KEY2】【KEY3】【KEY4】,如下右圖
- 步數(shù)
1、在菜單欄中,選中【步數(shù)】,中長(zhǎng)按進(jìn)入界面,顯示當(dāng)前步數(shù)。
2、步數(shù)是通過(guò)LSM6DSO加速度計(jì)和角速度計(jì)獲取的數(shù)據(jù)計(jì)算出來(lái)的。通過(guò)采樣加速度值,連續(xù)多次采集數(shù)據(jù),通過(guò)算法計(jì)算各個(gè)軸的加速度值是否滿(mǎn)足步數(shù)運(yùn)動(dòng)的條件,以此計(jì)算是否運(yùn)動(dòng),步數(shù)檢測(cè)的靈敏度也可以在代碼中進(jìn)行調(diào)節(jié)。
3、該界面中間顯示當(dāng)前步數(shù)信息。
4、該界面下最下邊顯示【清空】和【返回】菜單,通過(guò)短按進(jìn)行切換
5、選中【清空】,中長(zhǎng)按之后清空步數(shù),選中【返回】,中長(zhǎng)按退回菜單列表。
6、步數(shù)線(xiàn)程在啟動(dòng)時(shí)創(chuàng)建,會(huì)一直監(jiān)控步數(shù)。
7、長(zhǎng)按按鈕退出
8、按下按鈕會(huì)在上方中間顯示開(kāi)關(guān)按下的狀態(tài)【KEY1】【KEY2】【KEY3】【KEY4】
- 溫度
1、在菜單列表中,選中【溫度】,中長(zhǎng)按進(jìn)入界面,顯示當(dāng)前溫度。
2、溫度是通過(guò)HST221傳感器,采集的,該傳感器中存在標(biāo)定數(shù)據(jù),通過(guò)獲取標(biāo)定數(shù)據(jù),然后利用一次線(xiàn)性方程公式對(duì)讀取出來(lái)的數(shù)據(jù)進(jìn)行處理,最后會(huì)的溫度。
3、該界面中間顯示溫度數(shù)據(jù),每1s刷新一次。
4、該界面下顯示有【刷新】和【返回】,短按進(jìn)行菜單切換。
5、選中【刷新】,中長(zhǎng)按刷新當(dāng)前溫度
6、選中【返回】,中長(zhǎng)按會(huì)返回菜單列表界面
7、溫度數(shù)據(jù)在該界面下才會(huì)從傳感器中讀取
8、長(zhǎng)按按鈕退出
9、按下按鈕會(huì)在上方中間顯示開(kāi)關(guān)按下的狀態(tài)【KEY1】【KEY2】【KEY3】【KEY4】
- 濕度
1、在菜單列表中,選中【濕度】,中長(zhǎng)按進(jìn)入界面,顯示當(dāng)前濕度百分比。
2、濕度是通過(guò)HST221傳感器,采集的,該傳感器中存在標(biāo)定數(shù)據(jù),通過(guò)獲取標(biāo)定數(shù)據(jù),然后利用一次線(xiàn)性方程公式對(duì)讀取出來(lái)的數(shù)據(jù)進(jìn)行處理,最后會(huì)的濕度。
3、該界面中間顯示濕度數(shù)據(jù),每1s刷新一次。
4、該界面下顯示有【刷新】和【返回】,短按進(jìn)行菜單切換。
5、選中【刷新】,中長(zhǎng)按刷新當(dāng)前濕度
6、選中【返回】,中長(zhǎng)按會(huì)返回菜單列表界面
7、濕度數(shù)據(jù)在該界面下才會(huì)從傳感器中讀取
8、長(zhǎng)按按鈕退出
9、按下按鈕會(huì)在上方中間顯示開(kāi)關(guān)按下的狀態(tài)【KEY1】【KEY2】【KEY3】【KEY4】
- 氣壓
1、在菜單列表中,選中【氣壓】,中長(zhǎng)按進(jìn)入界面,顯示當(dāng)前氣壓值。
2、氣壓是通過(guò)LPS2HH傳感器獲取,每1s刷新一次
3、該界面中間顯示氣壓數(shù)據(jù)。
4、該界面下顯示有【刷新】和【返回】,短按進(jìn)行菜單切換。
5、選中【刷新】,中長(zhǎng)按刷新當(dāng)前氣壓值
6、選中【返回】,中長(zhǎng)按會(huì)返回菜單列表界面
7、氣壓數(shù)據(jù)在該界面下才會(huì)從傳感器中讀取
8、長(zhǎng)按按鈕退出
9、按下按鈕會(huì)在上方中間顯示開(kāi)關(guān)按下的狀態(tài)【KEY1】【KEY2】【KEY3】【KEY4】
- 指南針
1、在菜單列表中,選中【方位】,中長(zhǎng)按進(jìn)入界面,指南針功能,創(chuàng)建指南針線(xiàn)程。
2、指南針數(shù)據(jù)是通過(guò)LIS2MDL傳感器獲取,LIS2MDL獲取磁力數(shù)據(jù),通過(guò),用LSM6DSO的加速度數(shù)據(jù)進(jìn)行補(bǔ)償,通過(guò)公式計(jì)算出X軸與Y軸方向的磁力強(qiáng)度,進(jìn)而計(jì)算當(dāng)前傳感器所指向的方向。
3、該界面通過(guò)圖形顯示指示的方向,中間的指針會(huì)指向當(dāng)前的方位;
左下角的文字會(huì)顯示指向的方位數(shù)據(jù),分別有東、南、西、北、東南、東北、西南、西北。
4、長(zhǎng)按按鈕退出
- 按下按鈕會(huì)在上方中間顯示開(kāi)關(guān)按下的狀態(tài)【KEY1】【KEY2】【KEY3】【KEY4】
- RTC功能
RTC線(xiàn)程會(huì)在初始化的時(shí)候創(chuàng)建,最開(kāi)始會(huì)顯示設(shè)定的時(shí)間,這個(gè)時(shí)候會(huì)等待網(wǎng)絡(luò)連接,在設(shè)置了獲取網(wǎng)絡(luò)時(shí)間的狀態(tài)下,網(wǎng)絡(luò)連接之后會(huì)獲取網(wǎng)絡(luò)時(shí)間并更新到RTC,網(wǎng)咯時(shí)間每24小時(shí)更新一次,如果關(guān)閉網(wǎng)絡(luò)時(shí)間功能則不會(huì)更新。
演示效果
演示效果圖:
演示視頻
比賽感悟
本次比賽是第一次接觸rt-thread,之前也僅僅是聽(tīng)說(shuō)過(guò),沒(méi)有上手實(shí)踐。這次比賽收獲還是挺多的,首先就是了解了RT-thread這個(gè)操作系統(tǒng)。給我的感覺(jué)就是操作方便,組件豐富,應(yīng)用靈活,可以使用該系統(tǒng)直接實(shí)現(xiàn)很多功能而不需要過(guò)多的編程,可以讓實(shí)現(xiàn)應(yīng)用的工程師將更多的精力放在功能的實(shí)現(xiàn)上面,通過(guò)使用該系統(tǒng),極大的提升里的開(kāi)發(fā)效率。
本次比賽我學(xué)到了rt-thread的基本的使用方式,線(xiàn)程創(chuàng)建刪除暫停以及恢復(fù),信號(hào)量,臨界操作等功能的使用,同時(shí)也學(xué)習(xí)了一些組件的使用,像是網(wǎng)絡(luò)組件,OLED顯示組件等。
在作品完成過(guò)程中也遇到了一些困難,比如IIC調(diào)試總是報(bào)錯(cuò),OLED顯示問(wèn)題,傳感器數(shù)據(jù)獲取不出來(lái)獲取獲取出來(lái)的數(shù)據(jù)不對(duì),堆棧溢出之類(lèi)的問(wèn)題,通過(guò)各種調(diào)試手段以及串口打印錯(cuò)誤信息一一排除,完成作品。
本次比賽也只是對(duì)RT-Thread有了一些基本的了解,接下來(lái)會(huì)抽時(shí)間對(duì)該系統(tǒng)做深入的學(xué)習(xí),今我在使用過(guò)程中感覺(jué)惟一的不足就是內(nèi)存消耗比較大,但是在使用便捷性,功能等方便優(yōu)于我使用過(guò)的其他操作系統(tǒng),希望RT-Thread越做越好。