聚丰项目 > 基于AB32VG1的墨水屏智能日历

基于AB32VG1的墨水屏智能日历

项目背景 本项目是【RT-Thread x RISC-V 应用创新大赛】参赛项目之一。 本项目有什么创新点(实现了哪些功能)? 1. 相比纸质日历,无需手动翻页; 2. 相比纸质日历,可以显示实时天气信息; 3. 相比LCD/OLED屏的同类产品,电子墨水屏的功耗更低,更节能环保;

xusiwei1236 xusiwei1236

分享
1 喜欢这个项目
团队介绍

xusiwei1236 xusiwei1236

团队成员

许思维 软件工程师

分享
项目简介
项目背景 本项目是【RT-Thread x RISC-V 应用创新大赛】参赛项目之一。 本项目有什么创新点(实现了哪些功能)? 1. 相比纸质日历,无需手动翻页; 2. 相比纸质日历,可以显示实时天气信息; 3. 相比LCD/OLED屏的同类产品,电子墨水屏的功耗更低,更节能环保;
硬件说明

硬件部分

本项目主要包括五个硬件模块:

  1. AB32VG1开发板,作为主控制器控制其他外设;

  2. ESP8266 WiFi模块,用于联网获取时间和实时天气信息;

  3. 微雪的Arduino墨水屏扩展板,用于驱动墨水屏,同时带有一个128KB的SPI RAM芯片(用于作为显存),和一个T-Flash卡槽(没用到);

  4. 4.2英寸三色墨水屏,分辨率400x300,用于显示画面,一帧画面至少需要占用45KB 内存(400 x 300 x 3 / 8 = 45000);

  5. W25Q128闪存模块,容量16MB,用于存储中文字体;


硬件模块间连接

五个硬件模块之间的整体连接关系如下图:

模块连接关系



开发板引脚分配

开发板和外设的引脚连接关系(电源部分):

外设供电

主要使用到的资源,以及开发板和外设的引脚连接关系(控制部分):

引脚连接关系

具体使用情况说明:

  1. RTC

    • 用于保存当前时间和日期,以及时间的自动递增;

  2. UART1

    • 连接ESP-01S模块,用于实现联网获取时间和实时天气信息;

  3. SPI1

    • 连接墨水屏扩展板,用于和上面的SRAM芯片、墨水屏芯片通信;

  4. GPIO

    • 连接墨水屏扩展板上的RAM_CS,用于输出SRAM的片选信号

    • 连接墨水屏扩展板上的EPD_CS,用于输出墨水屏的片选信号;

    • 连接墨水屏扩展板上的EPD_DC,用于输出墨水屏的数据/命令信号;

    • 连接墨水屏扩展板上的EPD_RST,用于输出墨水屏的复位信号;

    • 连接墨水屏扩展板上的EPD_BUSY,用于墨水屏的繁忙状态的输入;

    • 连接W25Q128模块的CS,用于输出闪存芯片的片选信号;

    • 开发板自带的三个按键,用于作为输入按键;

  5. 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

部分组件通过git submodule引用了其他代码仓,具体见.gitmodules文件;


组件框图

软件各部分的组件框图如下:

软件组件图


业务代码

本项目开发的业务代码位于applications目录下,具体文件功能如下(大部分是.c和.h两个文件):

  1. amap_location_api 高德IP定位API;

  2. amap_weather_api 高德天气预报API;

  3. chinese_date_api 农历查询API;

  4. flash_init.c 闪存分区挂载(依赖RT-Thread内核的fatfs支持);

  5. http_api_utils http工具函数;

  6. hzk16 HZK16汉字字体相关接口;

  7. hzk16_data HZK16汉字字体数据;

  8. hzk16_setup 将HZK16字体安装到闪存分区;

  9. key_task 按键扫描任务;

  10. kvdb 封装了FlashDB里面的KVDB,更容易使用;

  11. main.c 程序入口;

  12. network_task 网络任务,用于处理网络请求(由于UART串口传输速度较慢,查询较慢,所以单独放在一个任务里面执行);

  13. time_utils 时间处理工具函数;

  14. ui_consts UI常量;

  15. ui_draw UI绘制,界面绘制逻辑单独放在了这里面;

  16. ui_task UI任务,调用ui_draw实现相关功能;



RT-Thread软件包

本项目使用到的RT-Thread软件包位于packages目录下:

  1. bluetrum_sdk

    • RT-Thread Studio创建项目时自带,包含了二进制的libhal.a

  2. at_device

    • 提供ESP8266 AT命令构造和响应解析功能,实现联网;

    • 修改:将所有sscanf都替换为atoi和strtol了(测试过程中间发现,每次send/recv会crash在sscanf里面);

    • 修改后代码仓:https://gitee.com/swxu/fal.git

  3. netutils

    • 提供网络时间协议(NTP)的实现,实现从网络获取时间、设置时间;

  4. webclient

    • 提供了超文本传输协议(HTTP)客户端的实现,用于天气查询请求的发送和接收;

  5. cJSON

    • 一个轻量级的纯C实现的JSON字符串解析库,用于解析天气查询响应的JSON字符串;

    • 未做修改

  6. FlashDB

    • 一个嵌入式数据库,提供了键值数据库(KVDB)和时序数据库(TSDB)两类API,同时提供了一些msh的测试命令;

    • 修改:开启了DEBUG日志,bench命令中的KV测试次数改为100

    • 代码仓:https://gitee.com/swxu/FlashDB.git

  7. fal

    • 闪存抽象层,FlashDB依赖的软件包,提供了闪存操作的封装和抽象,同时提供了一些msh的测试命令;

    • 修改:添加了w25q128的移植文件;

    • 代码仓:https://gitee.com/swxu/fal.git

  8. gbk2utf8

    • GBK和UTF8互相转换,HTTP API返回的汉字是UTF8编码的;



其他三方软件包

本项目使用到的其他三方软件均来自外设模块供应商,代码放在board目录下,包括:

  1. epaper

    • 微雪墨水屏扩展板驱动软件包,来自微雪的E-Paper_Shield页面;

    • 删除了无用的代码,包括不是4.2寸屏幕的代码、以及SD卡驱动;

    • 修改了GPIO相关的代码,改为用RT-Thread的pin驱动接口;

    • 修改了SPI相关的代码,改为用重新实现的bsp_spi接口;

    • 添加了基于RT-Thread finsh的墨水屏测试程序(绘制棋盘格、全屏填充、输出引脚测试),可以在shell模式下通过命令调用执行;

  2. w25qxx

    • W25Q128 闪存驱动,来自微雪的W25QXX DataFlash Board页面;

    • 修改了GPIO向代码,改为使用RT-Thread的pin驱动接口;

    • 修改了SPI相关代码,改为用重新实现的bsp_spi接口;

    • 添加了基于RT-Thread msh的RAM测试程序(字模式、页模式、流模式),可以在shell模式下通过命令调用执行;

  3. 重新实现的bsp_spi.h和bsp_spi.c

    • 使用了greedyhao大佬提供的硬件SPI初始化代码

    • SPI接收和发送,使用了Bluetrum技术群中的SDK_AB53XX_V061_20190103.zip里面的相关代码;

    • greedyhao大佬提供的驱动,实现部分全部在libhal.a中,暂时不太好移植到RT-Thread驱动框架上;


演示效果

IMG_top.png

评论区(2 )
  • zhd0305: 好犀利啊!

    回复

  • xusiwei1236: 说明:
    1. 图片上的日期是因为一开机没有联网同步时间(阳历和农历对应关系会缓存在闪存里面,如果闪存里面没有才会联网查询),默认的RTC时间是2021年1月29号;
    2. 视频是21号晚上录制的,这个版本里面添加了开机同步时间的代码,所以插上电等一会刷新出来的就是当前日期;

    回复