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