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