桌面檯曆

前言

​ 這個桌面檯曆準備了很久,中間經歷很多坎坷,終於階段性實現了目標,非常欣慰。此處按下不表,先上圖!

一些圖片

設計草圖

在這裏插入圖片描述

在這裏插入圖片描述

實拍圖

在這裏插入圖片描述
在這裏插入圖片描述

在這裏插入圖片描述

屏幕放大圖

在這裏插入圖片描述

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的原因。也不知多少個清晨,被鬧鐘吵鬧多次才叫醒的我想過放棄。人生艱難,堅持不易。

​ 感謝我的好友,幫我完成了硬件部分,若不是有他作爲我堅強的後盾,我想我可能在這麼短的時間完成這個檯曆。在這裏謝謝他!

​ 最後,如果你有什麼好點子或者想法,歡迎分享給我。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章