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