基于AB32VG1的墨水屏智能日历

项目背景

本项目是【RT-Thread x RISC-V 应用创新大赛】参赛项目之一,大赛活动页面:

RT-Thread X RISC-V 创新应用设计大赛 (elecfans.com)

本项目硬件部分包含4.2寸墨水屏、墨水屏驱动板、ESP8266模组和W25Q128闪存模组以及开发板自带的按键,硬件功能上使用了AB32芯片的SPI、UART、GPIO。软件部分包含业务代码、RT-Thread内核、RT-Thread组件包以及一些移植的三方组件,软件功能方面不仅使用了RT-Thread内核基础API(线程、信号量、互斥锁等),还使用了RT-Thtread组件库的at_device、netutils、webclient、cJSON、gbk2utf8、FlashDB、fal 组件。本项目实现了根据IP地址定位查询所在城市天气,从NTP服务器同步时间到片上RTC,最终在4.2寸墨水屏上显示当前日期、天气、温度、阳历、农历的效果。

项目简介

本项目解决了什么问题?

  1. 传统纸质日历需要手动翻页,容易遗忘;

  2. 传统纸质日历仅有静态信息,没有天气、时间等信息,内容较为单调;

  3. 传统纸质日历一次购买后样式不能更换,比较无趣(不在乎的可以买新的);

本项目有什么创新点(实现了哪些功能)?

  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/at_device.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

    • 硬件SPI初始化,使用了greedyhao大佬提供的代码,参考AB32VG1_DOC;

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

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

效果展示

界面显示:

演示视频:基于AB32和RT-Thread的墨水屏日历_哔哩哔哩_bilibili

项目小结

  1. 目前实现的界面功能还比较基础,只绘制了一个月历的界面,后续可以添加日历、周历的界面;

  2. 目前WIFI热点名称和密码是通过env工具配置代码里面的Kconfig选型的,后续可以添加配网功能,参数配置可以考虑基于嵌入式HTTP服务器(例如webnet组件)开发,实现网页化配置,不用安装APP;

  3. SPI驱动目前使用的不是RT-Thread驱动框架,这部分后续可以尝试实现一个基于RT-Thread硬件驱动(目前难点在于SPI初始化代码还没有可供参考的,寄存器文档上也没有SPI相关的说明),这部完成后,可以继续改进:

    • 重写epaper驱动SPI相关代码;

    • w25qxx驱动,直接使用RT-Thread的SFUD,直接配置即可;

    • fal也不需要新增适配代码,直接配置即可;

注意事项

对于部分想要基于本项目进行二次开发的朋友,需要注意

  1. 本项目代码仓使用了git submodule功能,用git clone --recursive https://gitee.com/swxu/e-calender.git才能下载全部代码,网页端下载的zip包不包含子模块,编译会失败;

  2. 本项目后期我是用scons命令编译的,RT-Thread Studio的工程文件.cproject.project.settings已经不是最新的了,不保证可以直接导入RT-Thread Studio成功,以及编译通过;

  3. boards下的epaperw25qxx目录里面的原始代码来自微雪电子(本人只对GPIO、SPI相关代码做了修改),版权归原作者所有,这里仅是学习用途,三方使用与本人无关;

【项目分享】基于AB32和RT-Thread的墨水屏智能日历相关推荐

  1. 基于GD32F103C8T6添加RT Thread nano设备框架并添加串口设备(以控制台console( uart0 )为例)

    最近没事琢磨了一下使用设备框架的问题.因为将串口注册到设备框架可以应用十分丰富的软件包. 于是就整理了一下手上的工程,重新将工程梳理了一遍. 像这样是十分清爽了,其中RTOS是操作系统源代码 并且学习 ...

  2. 安信可模组DIY项目分享 | 基于ESP-C3-12F的物联网时钟的总结回顾

    目录 前言 优秀作品展示 绵宝物联智能时钟 基于ESP32-C3-12F物联网时钟 ESP32 OLED时钟 ESP8266 时钟 基于ESP32的多媒体旋钮 全息像素时钟 哔哩哔哩小精灵 更多资料 ...

  3. 【ChatGLM】基于 ChatGLM-6B + langchain 实现本地化知识库检索与智能答案生成: 中文 LangChain 项目的实现开源工作

    [ChatGLM]基于 ChatGLM-6B + langchain 实现本地化知识库检索与智能答案生成: 中文 LangChain 项目的实现开源工作 目录 [ChatGLM]基于 ChatGLM- ...

  4. 文末赠书5本 | 附源码 | 三等奖作品 | 基于RA4M2和阿里云物联网平台的智能卧室小管家

    [RA4M2设计挑战赛]基于RA4M2和阿里云物联网平台的智能卧室小管家 摘要 本项目已RA4M2为主控,搭载了RT-Thread实时操作系统,配合Wi-Fi模块来提供网络通讯能力,外设接入了继电器. ...

  5. 基于rt thread smart构建EtherCAT主站

    我把源码开源到到了gitee,https://gitee.com/rathon/rt-thread-smart-soem 有兴趣的去可以下载下来跑一下 软件工程推荐用vscode 打开.rt thre ...

  6. 【STM32】【C】【嵌入式】分享一下我的项目经验--基于stm32桌面主从机械臂设计(二弹)

    本文为原创文章,转载需要注明转载出处 前言:嵌入式开发是相比其他IT行业是比较难的行业,它不仅需要你去掌握软件的经验,还要去学习一些硬件的知识, 它是软件和硬件的一个粘合剂,起到一个至关重要的地位 下 ...

  7. 基于Lua框架下的合宙ESP32C3+1.5‘’Eink墨水屏天气时钟+OLED开源项目分享

    基于Lua框架下的合宙ESP32C3+1.5''Eink墨水屏天气时钟+OLED项目分享

  8. 鸿蒙应用项目分享:我的鸿蒙毕设:基于HarmonyOS的任务看板平台【一】:项目整体介绍

    首先声明 HELLO,EVERYONE: 这里分享我自己的毕业设计,除软件内使用的个别图标以外,部分界面参考出处和图标出处会在文末标出,再次声明:本文全部内容仅为学习使用. [本文先分享内容界面的样子 ...

  9. 关于RT thread系统节拍时钟的配置

    关于RT thread系统节拍时钟的配置                  -----本文基于rt-thread-3.1.3版本编写 首先,使用RTthread OS时,要配置(或者明白)它的系统节拍 ...

最新文章

  1. 如何在Window下安装node\npm\cnpm,并安装vue.js,创建项目
  2. 《算法竞赛入门经典》习题4-3 黑白棋(Othello, ACM、ICPC World Finals 1992, UVa220)
  3. c语言函数汉诺塔不用move,C语言——汉诺塔问题(函数递归)
  4. 着墨中文lisp登入_Lisp的本质 - climbdream的个人空间 - OSCHINA - 中文开源技术交流社区...
  5. python文本分词_【Python】使用jieba对文本进行分词
  6. linux 看防火墙的启停日志,LINUX下防火墙iptables的日志管理
  7. 面试官问我平时怎么看源码的,我把这篇文章甩给他了。
  8. SpringCloud微服务(03):Hystrix组件,实现服务熔断
  9. 新想法!华科、清华、康奈尔联合提出“圆形卷积”!聚合方形和圆形优势
  10. 数组c语言什么时候学的,C语言学习之数组
  11. python编写hadoop代码
  12. 【github系列】github上传空目录
  13. Linux 命令(88)—— more 命令
  14. 文件自动备份和同步bypy和syncthing
  15. 业界常用的技术评估指标和方法,
  16. matlab安装与下载
  17. Fusion360删除圆角,把圆角变回直角/Remove Fillets
  18. 配置Stratified-Transformer、Point-Transformer系列
  19. 笔记本电脑外接显示器
  20. 先锋机器人Pioneer3 DX使用

热门文章

  1. html常用标签梳理
  2. 大三、大四期间去实习,要不要签三方协议?
  3. 2022到2023基于java+微信小程序毕业设计课题参考
  4. SPI接口的MISO和MOSI连接时是否需要交叉接? SI和SO呢?
  5. Nginx是什么,为什么使用Nginx
  6. Scratch 与C语言实现数据结构静态链表的建立及操作
  7. canvas简单实现纯色背景图片抠图
  8. 无网卡驱动,电脑可以用Usb线联网
  9. 全球与中国液体合成橡胶(LSR)市场深度研究分析报告
  10. B/S模式下的MVC架构迭代(2)