文章目錄
前言
這個桌面檯曆準備了很久,中間經歷很多坎坷,終於階段性實現了目標,非常欣慰。此處按下不表,先上圖!
一些圖片
設計草圖
實拍圖
屏幕放大圖
Web端
以上部分圖是用我的手機拍攝的,個別地方拍花了,還請見諒!
佈局
整體
-
左上角是一個墨水屏幕
-
右上角是5個觸摸按鍵
-
下方是57個日期,每個都是觸摸按鍵
-
白色方框是另外一塊PCB電路板,上面有周一到週日的英文縮寫
-
下方有兩個空槽,有兩條細長的PCB可以與之榫卯,形成一個夾角使電路板可以穩定立在桌面上
-
PCB使用黑油噴錫工藝,正面幾乎看不到電路
-
背面擁有芯片和電子元件
墨水屏
- 左上角是星期
- 緊鄰右側是月份
- 中間數字是日期
- 下方是紀念日期
- 最下方是農曆
- 右側上方是備忘事項,前面實心矩形表示完成
- 下方爲每日一言,隨機從網絡上獲取的一些文字
功能
- 墨水顯示屏可以顯示日期、星期、農曆、節日
- 以及數條備忘事項,每條備忘事項前都有一個完成狀態框
- 通過右上方的上下觸摸按鍵移動到對應待做事項
- 點擊確定可以標記爲當前備忘的完成狀態,再點擊一次標記爲未完成
- 有上角的左右觸摸按鍵,點擊可以查看前一天或後一天的備忘事項
- 點擊下方月曆每個日期,都可查看當前月份不同日期的備忘
- 可以通過WIFI聯網
- 手機端或者電腦端可以通過網頁同步相關備忘,可以隨時更新和查看狀態。
操作視頻
桌面檯曆
視頻是我用手機拍的,像素和清晰度有點渣,還請見諒。
一點遺憾
受制於時間工期的限制,這是第一塊板子,主要是爲了驗證功能,所以並沒有使用沉金工藝,所以,觸摸按鍵的顏色都是銀白色的,但到手發現效果也不錯。
不過,下一版繼續優化的話,肯定會比這一版更漂亮!
架構
整個桌面檯曆項目由三部分組成:
- 業務處理服務
- 網頁客戶端
- 設備端
因爲前兩個都在服務器端,所以此處簡略一寫,不再詳述。
業務處理服務
設備通過MQTT傳輸數據,進入到業務處理服務中,並將對應的數據進行加工和存儲。這部分是使用了Python和Mysql。
這部分實現的主要功能是:
- MQTT消息的監聽與接收
- Topic的分級解析和轉發
- 數據的存儲
網頁客戶端
最開始考慮過多種方案,比如微信小程序、手機APP、網頁。最後綜合考慮,使用了當前的web方案,使用了Flask。用戶通過網頁登錄,便可以添加修改備忘事項。
當前版本擁有的功能:
- 用戶通過設備編號登陸
- 切換不同的日期查看備忘事項
- 添加備忘
- 修改備忘
- 刪除備忘
設備端詳細介紹
採用了集成WIFI的聯盛德W600芯片,搭配國產物聯網操作系統RT-Thread。不得不在這裏誇讚一下RT-Thread,上手很簡單,而且有着豐富的軟件包可以使用,編譯環境和Linux下的編譯非常相似,給我非常熟悉的感覺。
設備的硬件方面,採用了一塊PCB作爲主面板,正面只有一塊墨水屏作爲顯示區,並且吸收了傳統檯曆的特點,使用一塊可以移動的日曆框劃分區域,可以直觀的看到每月的日期。PCB背面焊接了相關的元器件,並且搭配了電池,可以脫離電線的束縛,就像一款真正的紙版桌面檯曆。
硬件說明
W600芯片可用的GPIO有17路,當前已經都被我使用了,如下圖:
因爲bs8116a-3 的觸摸芯片i2c地址無法更改,而我又使用了3路,只能使用多個GPIO口。爲了縮減使用,我將三路的I2C_SCL併爲一路,節約了兩個GPIO。三路觸摸芯片又各自佔用了一路GPIO作爲中斷引腳。故,僅觸摸芯片就使用了7路GPIO。
LED7則是觸摸按鍵燈。
PA5、PA4則用於串口。
PA0用於配網按鈕。
另外,墨水屏使用了SPI。
架構說明
desk_calendar/
├── Kconfig
├── README.md
├── SConscript
├── SConstruct
├── applications
│ ├── SConscript
│ ├── defines.h
│ ├── init.c
│ ├── keyboard.c
│ ├── logic.c
│ ├── main.c
│ ├── mqtt.c
│ ├── network.c
│ ├── qrcode_array.h
│ ├── screen.c
│ └── timer.c
├── makeimg.py
├── packages
│ ├── EasyFlash-v3.3.0
│ ├── SConscript
│ ├── airkissOpen-latest
│ ├── bs8116a-latest
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SConscript
│ │ ├── inc
│ │ ├── samples
│ │ └── src
│ ├── cJSON-v1.0.2
│ ├── fal-v0.3.0
│ ├── lunar_calendar-latest
│ │ ├── LICENSE
│ │ ├── README.md
│ │ ├── SConscript
│ │ ├── inc
│ │ ├── samples
│ │ └── src
│ ├── netutils-v1.1.0
│ ├── packages.dbsqlite
│ ├── pahomqtt-v1.1.0
│ ├── pkgs.json
│ ├── pkgs_error.json
│ └── u8g2-c-latest
├── ports
│ ├── SConscript
│ ├── easyflash
│ │ ├── SConscript
│ │ └── ef_fal_port.c
│ ├── fal
│ │ ├── SConscript
│ │ ├── fal_cfg.h
│ │ ├── fal_flash_port.c
│ │ └── fal_flash_sfud_port.c
│ └── wifi
│ ├── SConscript
│ ├── wifi_config.c
│ └── wifi_config.h
├── rtconfig.h
└── rtconfig.py
以上就是我項目文件夾的結構設置,其中軟件包部分略有縮減。
applications
這裏放置了我的主要代碼,共11個文件,c文件8個,頭文件2個,編譯文件1個。
applications
├── SConscript /* 編譯文件 */
├── defines.h /* 變量 函數聲明 */
├── init.c /* 初始化 */
├── keyboard.c /* 鍵盤相關處理 */
├── logic.c /* 邏輯處理 */
├── main.c /* 主函數 */
├── mqtt.c /* MQTT操作相關 */
├── network.c /* 網絡操作相關 */
├── qrcode_array.h /* 配網二維碼數組 */
├── screen.c /* 屏幕操作相關 */
└── timer.c /* 計時器 */
下面我隨意挑選部分內容簡單介紹一下:
defines.h
#define MAX_TODO_SIZE 8
typedef struct {
char content[64];
short status;
} TODO;
typedef struct {
char date[16];
TODO todo_list[MAX_TODO_SIZE];
char festival[64];
char words[256];
} CALENDAR;
extern CALENDAR calendar_data;
此處定義了我傳輸數據的結構體,大部分數據都是存儲在這個結構體中。
init.c
/* 集中初始化 */
void init_all(void) {
fal_init();
easyflash_init();
init_mq();
init_sem();
init_keyboard();
hwtimer_init();
}
這個函數將各個部分放置到一起,按照順序逐個初始化。
keyboard.c
/* 按鍵觸發調用函數 */
void got_key_callback(rt_uint8_t key_code) {
if (REFRESH_END_FLAG == 1) {
/* 發送消息到消息隊列中 */
int result = rt_mq_send(&mq, &key_code, 1);
if (result != RT_EOK) {
rt_kprintf("rt_mq_send ERR\n");
}
touch_led();
start_timer(30);
REFRESH_END_FLAG = 0;
}
}
這裏便是實現了檢測到按鍵觸發後的邏輯,將鍵值通過消息隊列發送出去,並且啓動按鍵提示燈和開始按鍵計時。
邏輯流程圖
大概的流程如上,主要分爲上電,配網,以及點擊按鍵。每個部分邏輯上都比較簡單,就沒有詳細展開。
軟件包
這裏我使用到的軟件包有9個,分別是:
EasyFlash-v3.3.0
airkissOpen-latest
bs8116a-latest
cJSON-v1.0.2
fal-v0.3.0
lunar_calendar-latest
netutils-v1.1.0
pahomqtt-v1.1.0
u8g2-c-latest
其中,我貢獻的軟件包有兩個:
bs8116a-latest
是 合泰觸摸芯片的操作軟件包 ;
lunar_calendar-latest
是一個陽曆日期轉陰曆日期的軟件包;
這兩個最開始是我寫在項目代碼當中,後來進行代碼優化的時候,覺得可以重構出來,形成單獨的軟件包。於是用了一點時間重新改寫了一下,已提交到了RT-Thread的Package代碼倉庫當中,相關資料歡迎到軟件包倉庫中查閱。
代碼地址
bs8116a-latest
代碼地址:https://github.com/illusionlee/bs8116a.git
lunar_calendar-latest
代碼地址:https://github.com/illusionlee/lunar_calendar.git
項目代碼地址:https://github.com/illusionlee/desk_calendar.git
未來將要做的
這個版本的軟件和硬件還有着很多不足,還有很多可以繼續優化和改進的地方。未來即將要做的有:
設備端
- 滑框指示燈 在最下面添加一排LED,對應滑框的位置亮起來,可以直觀的告訴用戶,滑框應該擺放在什麼位置
- 按鍵反饋燈 因爲墨水屏的原因,會經常感覺沒有點擊到按鍵,所以需要加個觸摸反饋
- 底部支架優化 支架的作用不僅僅是用作支撐,還可以畫成尺子,兩根支架合成剪子,充分發揮辦公室文具的作用
- 提示音 可以使用蜂鳴片,在設定的時間進行提示,縮減查看屏幕的次數
服務端
- 架構優化 當前自己搭建的服務器,比較簡陋,需要重新設計
客戶端
- 用戶註冊 當前不允許用戶自行註冊,未來需要完善這部分功能
- 界面優化 這塊不專業,自己隨便配了色,雖自我感覺良好,但只能認清現實,我不適合做UI設計師 哈哈
- ……
結語
這個桌面檯曆,在2018年年底就已經有一些構思,隨着時間的推移,終於在2019年10月上旬正式下決心進行製作。中間遇到了很多困難,有無數個抓狂的時刻,但好在堅持了下來。
不知我利用了多少的業餘時間,只記得很多個夜裏,凌晨一兩點我還在抓撓着頭髮,思考着BUG的原因。也不知多少個清晨,被鬧鐘吵鬧多次才叫醒的我想過放棄。人生艱難,堅持不易。
感謝我的好友,幫我完成了硬件部分,若不是有他作爲我堅強的後盾,我想我可能在這麼短的時間完成這個檯曆。在這裏謝謝他!
最後,如果你有什麼好點子或者想法,歡迎分享給我。