2923|1

80

帖子

1

TA的资源

一粒金砂(中级)

楼主
 

基于AB32和RT-Thread的墨水屏日历,开源 [复制链接]

 

项目背景

本项目是【RT-Thread x RISC-V 应用创新大赛】参赛项目之一

项目简介

本项目解决了什么问题?
  • 传统纸质日历需要手动翻页,容易遗忘;
  • 传统纸质日历仅有静态信息,没有天气、时间等信息,内容较为单调;
  • 传统纸质日历一次购买后样式不能更换,比较无趣(不在乎的可以买新的);
本项目有什么创新点(实现了哪些功能)?
  • 相比纸质日历,无需手动翻页;
  • 相比纸质日历,可以显示实时天气信息;
  • 相比LCD/OLED屏的同类产品,电子墨水屏的功耗更低,更节能环保;

硬件部分

本项目主要包括五个硬件模块:
  • AB32VG1开发板,作为主控制器控制其他外设;
  • ESP8266 WiFi模块,用于联网获取时间和实时天气信息;
  • 微雪的Arduino墨水屏扩展板,用于驱动墨水屏,同时带有一个128KB的SPI RAM芯片(用于作为显存),和一个T-Flash卡槽(没用到);
  • 4.2英寸三色墨水屏,分辨率400x300,用于显示画面,一帧画面至少需要占用45KB 内存(400 x 300 x 3 / 8 = 45000);
  • 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两个文件):
  • 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软件包

本项目使用到的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驱动框架上;

效果展示

界面显示:

 

演示视频:
https://gitee.com/swxu/e-calender/raw/master/pic/ui-show.gi
图片是原视频经过ffmpeg缩放、降低帧率后生成的gif,原始视频请戳这里:https://www.bilibili.com/video/BV1DP4y1H7UB/

项目小结

1、目前实现的功能还比较基础,只绘制了一个月历的,后续可以添加日历、周历的显示;
2、目前WIFI配网功能没有实现,后续可以添加配网功能,参数配置可以考虑基于嵌入式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下的epaper和w25qxx目录里面的原始代码来自微雪电子(本人只对GPIO、SPI相关代码做了修改),版权归原作者所有,这里仅是学习用途,三方使用与本人无关;

最新回复

看起来有点意思,谢谢分享   详情 回复 发表于 2022-1-18 22:02
点赞 关注
 

回复
举报

7452

帖子

2

TA的资源

五彩晶圆(高级)

沙发
 

看起来有点意思,谢谢分享

 
个人签名

默认摸鱼,再摸鱼。2022、9、28

 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
剖析uCOS.

10694

超多模块单片机C代码下载啦!

各个模块的C代码:victory: 包括DS18B20,DS1302;红外,串行通信,12864;1602;PWM;EEPROM24c02... 超多模块,不下后悔啊~

关于运放的基础细节探索

本人新手,如有不对请老师们赐教。 前两天发了个帖子,原以为讨论USB接口,没想到最终是回到如何使用运放的问题上,特别是得到 ...

LM3S USB设备开发学习集锦(很详细)~~~~

LM3s usb学习(第一章)https://bbs.eeworld.com.cn/thread-307662-1-1.html 第二章 LM3S USB处理器https://bbs.eeworld.com.cn ...

《VLMC激光雕刻机》三,VLMC激光雕刻机分解---3.3,软件部分

本帖最后由 kejoy 于 2015-8-16 19:21 编辑 3.3,软件部分 210740 简介 作为一个自动化设备,核心控制部分是相 ...

TI DSP C6000 功能单元和执行操作

本帖最后由 灞波儿奔 于 2020-6-6 09:10 编辑 481190 481194481192

这个辅助电源里面,3个MOS管干啥的?很少见反激电源还有MOS管?

666999 Q6,Q616和Q610,还有想问一下,R621和C621可以改变MOS管的开通关断时间吗

【沁恒无线充芯片CH246&CH241 - 2】:设想

本帖最后由 MianQi 于 2023-1-28 18:07 编辑 设想的测试内容是这样:将5v的电压无线传送出来,在接收端经一个升压器升到12v, ...

分享一下这些天Linux和VisualGDB的开发经验

前段时间写了一个gRPC(各种编程语言的通信桥梁),然后要对接到别的部门的代码上,别的部门给的是.so文件,要通过.so去直接跳转 ...

【正点原子阿尔法 IMX6ULL Linux开发板】第3篇 硬件准备工作

第三篇 硬件准备工作 一 开发板上电测试 接上USB TYPEC线,接到USB TTL接口,查看串口的讯息,如果工作正常,串口 ...

关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表