聚豐項目 > 基于AB32VG1的墨水屏智能日歷
項目背景 本項目是【RT-Thread x RISC-V 應用創新大賽】參賽項目之一。 本項目有什么創新點(實現了哪些功能)? 1. 相比紙質日歷,無需手動翻頁; 2. 相比紙質日歷,可以顯示實時天氣信息; 3. 相比LCD/OLED屏的同類產品,電子墨水屏的功耗更低,更節能環保;
xusiwei1236
分享xusiwei1236
團隊成員
許思維 軟件工程師
本項目主要包括五個硬件模塊:
AB32VG1開發板,作為主控制器控制其他外設;
ESP8266 WiFi模塊,用于聯網獲取時間和實時天氣信息;
微雪的Arduino墨水屏擴展板,用于驅動墨水屏,同時帶有一個128KB的SPI RAM芯片(用于作為顯存),和一個T-Flash卡槽(沒用到);
4.2英寸三色墨水屏,分辨率400x300,用于顯示畫面,一幀畫面至少需要占用45KB 內存(400 x 300 x 3 / 8 = 45000);
W25Q128閃存模塊,容量16MB,用于存儲中文字體;
五個硬件模塊之間的整體連接關系如下圖:
開發板和外設的引腳連接關系(電源部分):
主要使用到的資源,以及開發板和外設的引腳連接關系(控制部分):
具體使用情況說明:
RTC
用于保存當前時間和日期,以及時間的自動遞增;
UART1
連接ESP-01S模塊,用于實現聯網獲取時間和實時天氣信息;
SPI1
連接墨水屏擴展板,用于和上面的SRAM芯片、墨水屏芯片通信;
GPIO
連接墨水屏擴展板上的RAM_CS,用于輸出SRAM的片選信號
連接墨水屏擴展板上的EPD_CS,用于輸出墨水屏的片選信號;
連接墨水屏擴展板上的EPD_DC,用于輸出墨水屏的數據/命令信號;
連接墨水屏擴展板上的EPD_RST,用于輸出墨水屏的復位信號;
連接墨水屏擴展板上的EPD_BUSY,用于墨水屏的繁忙狀態的輸入;
連接W25Q128模塊的CS,用于輸出閃存芯片的片選信號;
開發板自帶的三個按鍵,用于作為輸入按鍵;
3V3/GND
連接ESP-01S模塊,用于向ESP8266芯片供電;
連接墨水屏擴展板,用于向SRAM和墨水屏供電;
連接W25Q128模塊,用于向閃存芯片供電;
本項目的軟件部分基于RT-Thread物聯網操作系統,除了本項目開發的業務邏輯代碼外,還使用了一些RT-Thread 內核API、一些RT-Thread軟件包,以及一些三方組件,下面分別介紹。
主代碼倉:https://gitee.com/swxu/e-calender.git
下載命令:git clone --recursive https://gitee.com/swxu/e-calender.git
.gitmodules
文件;
軟件各部分的組件框圖如下:
本項目開發的業務代碼位于applications
目錄下,具體文件功能如下(大部分是.c和.h兩個文件):
amap_location_api 高德IP定位API;
amap_weather_api 高德天氣預報API;
chinese_date_api 農歷查詢API;
flash_init.c 閃存分區掛載(依賴RT-Thread內核的fatfs支持);
http_api_utils http工具函數;
hzk16 HZK16漢字字體相關接口;
hzk16_data HZK16漢字字體數據;
hzk16_setup 將HZK16字體安裝到閃存分區;
key_task 按鍵掃描任務;
kvdb 封裝了FlashDB里面的KVDB,更容易使用;
main.c 程序入口;
network_task 網絡任務,用于處理網絡請求(由于UART串口傳輸速度較慢,查詢較慢,所以單獨放在一個任務里面執行);
time_utils 時間處理工具函數;
ui_consts UI常量;
ui_draw UI繪制,界面繪制邏輯單獨放在了這里面;
ui_task UI任務,調用ui_draw實現相關功能;
本項目使用到的RT-Thread軟件包位于packages
目錄下:
bluetrum_sdk
RT-Thread Studio創建項目時自帶,包含了二進制的libhal.a
;
at_device
提供ESP8266 AT命令構造和響應解析功能,實現聯網;
修改:將所有sscanf都替換為atoi和strtol了(測試過程中間發現,每次send/recv會crash在sscanf里面);
netutils
提供網絡時間協議(NTP)的實現,實現從網絡獲取時間、設置時間;
webclient
提供了超文本傳輸協議(HTTP)客戶端的實現,用于天氣查詢請求的發送和接收;
cJSON
一個輕量級的純C實現的JSON字符串解析庫,用于解析天氣查詢響應的JSON字符串;
未做修改
FlashDB
一個嵌入式數據庫,提供了鍵值數據庫(KVDB)和時序數據庫(TSDB)兩類API,同時提供了一些msh的測試命令;
修改:開啟了DEBUG日志,bench命令中的KV測試次數改為100
fal
閃存抽象層,FlashDB依賴的軟件包,提供了閃存操作的封裝和抽象,同時提供了一些msh的測試命令;
修改:添加了w25q128的移植文件;
gbk2utf8
GBK和UTF8互相轉換,HTTP API返回的漢字是UTF8編碼的;
本項目使用到的其他三方軟件均來自外設模塊供應商,代碼放在board
目錄下,包括:
epaper
微雪墨水屏擴展板驅動軟件包,來自微雪的頁面;
刪除了無用的代碼,包括不是4.2寸屏幕的代碼、以及SD卡驅動;
修改了GPIO相關的代碼,改為用RT-Thread的pin驅動接口;
修改了SPI相關的代碼,改為用重新實現的bsp_spi接口;
添加了基于RT-Thread finsh的墨水屏測試程序(繪制棋盤格、全屏填充、輸出引腳測試),可以在shell模式下通過命令調用執行;
w25qxx
W25Q128 閃存驅動,來自微雪的頁面;
修改了GPIO向代碼,改為使用RT-Thread的pin驅動接口;
修改了SPI相關代碼,改為用重新實現的bsp_spi接口;
添加了基于RT-Thread msh的RAM測試程序(字模式、頁模式、流模式),可以在shell模式下通過命令調用執行;
重新實現的bsp_spi.h和bsp_spi.c
使用了greedyhao大佬提供的硬件SPI初始化代碼
SPI接收和發送,使用了Bluetrum技術群中的SDK_AB53XX_V061_20190103.zip里面的相關代碼;
greedyhao大佬提供的驅動,實現部分全部在libhal.a中,暫時不太好移植到RT-Thread驅動框架上;
zhd0305: 好犀利啊!
回復
xusiwei1236: 說明:
1. 圖片上的日期是因為一開機沒有聯網同步時間(陽歷和農歷對應關系會緩存在閃存里面,如果閃存里面沒有才會聯網查詢),默認的RTC時間是2021年1月29號;
2. 視頻是21號晚上錄制的,這個版本里面添加了開機同步時間的代碼,所以插上電等一會刷新出來的就是當前日期;
回復