【RT-Thread作品秀】RedClock
作者:iysheng
概述
我開(kāi)發(fā) RedClock 這個(gè)作品的背景主要有兩個(gè):
1. 我想開(kāi)發(fā)一下墨水屏,想體驗(yàn)下新奇的事物;
2. 想在傳統(tǒng) wifi 時(shí)鐘的基礎(chǔ)上添加一個(gè)番茄時(shí)鐘的功能,嘗試提高工作效率,讓其不單單具備提供時(shí)間和天氣的功能
目前 RedClock 實(shí)現(xiàn)的功能,可以概括為 4 條:
1. 通過(guò)墨水屏同步顯示時(shí)間、天氣圖標(biāo)(時(shí)間信息通過(guò) ntp 校時(shí),天氣信息通過(guò) js 語(yǔ)言從和風(fēng)天氣獲?。?/span>
2. 一鍵切換番茄時(shí)鐘模式,番茄時(shí)鐘的默認(rèn)周期是 25 分鐘,到實(shí)踐通過(guò)屏幕提示
3. 通過(guò)外接氣壓傳感器 lps22hh 獲取溫度和氣壓信息并通過(guò)墨水屏幕
4. 時(shí)間、天氣、溫度和氣壓信息支持通過(guò)網(wǎng)絡(luò)訪問(wèn) ART-Pi 的設(shè)備 IP 同步顯示
開(kāi)發(fā)環(huán)境
硬件: ART-Pi 、LPS22HH、SSD1619
RT-Thread版本:V4.0.3
開(kāi)發(fā)工具及版本:
編譯工具:arm-none-eabi-gcc、 arm-none-eabi-binutils
編輯工具:vim
燒錄、調(diào)試工具:openocd 0.10+ dirty(打過(guò)補(bǔ)丁才可以燒錄程序到 ART-Pi 的外部 flash)、kermit(串口工具)、telnet(調(diào)試工具)、gdb
硬件開(kāi)發(fā)工具:Kicad(RedClock 擴(kuò)展板開(kāi)發(fā)工具)
RT-Thread使用情況概述
使用到的內(nèi)核模塊部分:
互斥鎖、信號(hào)量、mempool、device
組件部分:
cJSON、EasyFlash、webnet
軟件包部分:
lps22hb(傳感器)
其他:
硬件框架
軟件框架說(shuō)明
軟件的實(shí)現(xiàn)設(shè)計(jì)到兩個(gè)層次,設(shè)備驅(qū)動(dòng)層(墨水屏驅(qū)動(dòng)層開(kāi)發(fā)),APP層(天氣、傳感器和時(shí)間的更新顯示分別在不同的線程完成,線程間的數(shù)據(jù)交換通過(guò)函數(shù)完成,全局變量均為 static 類型,依據(jù)高內(nèi)聚、低耦合分層設(shè)計(jì)理念開(kāi)發(fā))
軟件模塊說(shuō)明
本軟件主要的軟件設(shè)計(jì)理念是創(chuàng)建多個(gè)線程,根據(jù)功能劃分各個(gè)線程實(shí)現(xiàn)的功能:
在 factory 工程的基礎(chǔ)上,添加了 red_monitor_thread 這個(gè)線程,完成傳感器數(shù)據(jù)周期一分鐘獲取一次、以及更新 tomato 顯示相關(guān)的內(nèi)容。還有一個(gè) redclock_lcd_thread 線程周期性的刷新屏幕,目前從屏幕壽命考慮,設(shè)置為 3 分鐘刷新一次。還有一個(gè)線程完成對(duì)按鍵的掃描(目前僅僅支持番茄時(shí)鐘快速切換的按鍵)。
考慮到為了實(shí)現(xiàn)一次配網(wǎng),重啟后自動(dòng)聯(lián)網(wǎng),開(kāi)啟了easyflash 保存 wifi 帳號(hào)和密碼。聯(lián)網(wǎng)為了消除跨域訪問(wèn)設(shè)備的問(wèn)題,替換了原始 ART-Pi 的 index.html 文件為自己的文件,這樣將對(duì)應(yīng)的 js 和 css 部署在自己電腦這端完成開(kāi)發(fā)和調(diào)試,借助 webnet 通過(guò) CGI 的方式完成時(shí)間、溫度、氣壓的上報(bào)(支持同步通過(guò)瀏覽器訪問(wèn) ART-Pi查看)和天氣的下發(fā)(天氣通過(guò) js 連接和風(fēng)天氣服務(wù)獲?。?。
墨水屏的開(kāi)發(fā),通過(guò)注冊(cè)了一個(gè) device 完成,通過(guò) SPI 接口訪問(wèn)。更新墨水瓶?jī)?nèi)容相關(guān)的動(dòng)作,放在了四個(gè)函數(shù)中完成(分別完成天氣圖標(biāo)更新、時(shí)間更新]、傳感器數(shù)據(jù)更新、番茄時(shí)鐘狀態(tài)更新),
這些函數(shù)指揮更新墨水屏顯示的內(nèi)容,不會(huì)刷新墨水屏顯示,刷新墨水屏顯示的時(shí)候,更新才會(huì)有效。
演示效果
演示視頻:
圖片展示:
比賽感悟
比賽過(guò)程中,我使用 Kicad 畫了兩版PCB,并作PCB然后焊接,整個(gè)開(kāi)發(fā)過(guò)程大部分都是在 Linux 下完成的,初了開(kāi)發(fā)墨水屏顯示界面的時(shí)候使用了磨刀這個(gè)原型開(kāi)發(fā)工具以及Image2Lcd整個(gè)軟件將圖片轉(zhuǎn)換為 C語(yǔ)言。
感覺(jué)自己收獲最多的地方有兩個(gè)方面,第一個(gè)方面當(dāng)然是軟件了,印象最深刻的是通過(guò)在 openocd 的代碼倉(cāng)庫(kù)察看不同的 branch 和 patch,給 openocd 打補(bǔ)丁然后修改對(duì)應(yīng)的配置文件,支持直接燒錄程序到 ART-Pi 的外部 flash。通過(guò)這個(gè)工作,讓我對(duì) openocd 的使用有了更多的了解(通過(guò)訪問(wèn) openocd 的網(wǎng)站以及看對(duì)應(yīng)的 manual), 這個(gè)是我最激動(dòng)的。其他的軟件方面就是對(duì) easyflash和webnet 這兩個(gè)組件有了學(xué)習(xí),通過(guò)閱讀對(duì)應(yīng)的代碼,學(xué)到了在 32 上進(jìn)行 KV 類型的數(shù)值保存的新方法,之前我接觸32 保存配置數(shù)據(jù)使用的方法是從內(nèi)部 flash 的尾部劃分 64KB 虛擬為快設(shè)備,然后來(lái)格式化為 elm 文件系統(tǒng),然后以 cJSON 格式保存,現(xiàn)在看來(lái)浪費(fèi)了很多空間, easyflash 也是我以后工作中替換之前這種方案新的可取的方法。通過(guò)對(duì) Webnet 的學(xué)習(xí),我真正接觸到了通過(guò) http 服務(wù),遠(yuǎn)程通過(guò)瀏覽器和 32 進(jìn)行數(shù)據(jù)通訊的方法。圍繞 webnet, 我還真正開(kāi)發(fā)了一波js 和css 代碼,開(kāi)發(fā) js 代碼的時(shí)候,學(xué)會(huì)了通過(guò) jquery 實(shí)現(xiàn) post 和 get 請(qǐng)求,然后 ART-Pi 這端通過(guò) CGI 完成 HTTP 通訊。
硬件方面,我感覺(jué)很開(kāi)心的是自己真的在 Kicad 繪制了 PCB 然后導(dǎo)出 gaber 文件作出來(lái)了 PCB 板,通過(guò)設(shè)計(jì)兩版完成了 RedClock 的擴(kuò)展版,兩個(gè)版本都可以讓墨水屏順利點(diǎn)亮。第一版的問(wèn)題是我將 ART-Pi 對(duì)應(yīng)的 P1 和 P2 兩組管腳放反了,汗!
不管怎么說(shuō),參加這次比賽,我很開(kāi)心,可以接觸到新的事物包括硬件模塊和 RT-thread 上新的組件,以及真切體會(huì)到了在 Linux 上開(kāi)發(fā)設(shè)計(jì)硬件的可能。