【DigiKey“智造万物,快乐不停”创意大赛】经典老黄历
[复制链接]
本帖最后由 HonestQiao 于 2024-1-10 23:40 编辑
【DigiKey“智造万物,快乐不停”创意大赛】经典老黄历
作品名称:经典老黄历
作者: HonestQiao
一、作品简介(100-200字)1
二、系统框图(图文结合)3
三、各部分功能说明(图文结合)11
四、 作品源码 26
五、作品功能演示视频 27
六、项目总结 28
七、其他 30
一、作品简介(100-200字)
(设计名称、作品照片、项目用到的板卡、芯片、模块等介绍,作品功能介绍等)
设计名称:经典老黄历
作品照片:
项目用到的板卡、芯片、模块:
M5Paper,核心为ESP32-D0WDQ6
作品功能介绍:
本作品基于M5Paper制作而成,通过ESP32的WiFi联网功能从网络服务获取老黄历数据,并根据老黄历数据进行屏幕的显示处理,从而呈现出一款经典的老黄历。
经典老黄历的界面呈现较为复杂繁琐,为了方便界面的显示和调整,定义了一套使用json数据格式,进行界面元素绘制的规范,通过网络服务提供动态的json数据给 M5Paper,从而实现了修改json数据中的定义,就能够实现 M5Paper 上的经典老黄历界面的更新,让界面和代码解耦。
同时利用M5Paper 上的滚轮,方便使用者向前或者向后查看老黄历,以及刷新当前的经典老黄历界面。
二、系统框图(图文结合)
(设计思路、系统软硬件介绍及实现框图,以图文结合的展示)
设计思路:
M5Paper使用的是电子墨水屏,电子墨水屏显示内容以后,可以在断电的情况下继续显示,非常适合不需要频繁更新界面的应用场合。
用 M5Paper 来作为日历界面的呈现,非常适合,不过感觉一般的日历呈现难度有点低。经过一番研究准备,最终选择了经典老黄历。
要在M5Paper 上实现经典老黄历,核心要处理的问题就是界面的呈现。我选择了参考 紫薇黄历网站的传统老黄历界面和数据,网址见本文结尾出所列链接。
为了复刻经典老黄历的界面,使用图形软件,进行了界面中显示元素的坐标定位:
因为经典老黄历的界面呈现较为复杂,PC上显示的界面,并不能直接复制到M5Paper上面进行显示,而一旦要修改界面,就需要修改代码,重新编译下载,然后运行显示。即使是采用的是micropython类环境,每次执行要重新初始化M5Paper的系统,也耗时耗力。
在经过漫长而痛苦的界面修改调试后,最终决定,定义一套JSON格式的数据规范,来控制M5Paper提供的屏幕处理,让 M5Paper 上的程序,通过网络请求并解析JSON数据,并根据JSON数据,决定实际该调用哪个屏幕函数,以及传递什么参数。通过这样的数据规范,把M5Paper 上的程序写好了,后面就需要简单修改JSON数据,就能够实现屏幕的更新了。
为了方便测试查看,把 M5Paper 上的滚轮也使用上了,通过滚轮,可以刷新当前经典老黄历界面,也可向前或者向后查看老黄历。
系统软硬件介绍:
硬件介绍:
经典老黄历仅使用M5Paper即可实现,M5Paper官方资料如下:
其具体规格参数如下:
在M5Paper上,本作品使用到了如下的内置外设:
- 滚轮:用于刷新当前界面,以及往前或者往后查看
- SD卡:使用一块8GB的SD卡存储TTF字体文件
软件介绍:
软件部分,分为3个部分:
JSON数据规范:
JSON数据规范的核心:
- 屏幕处理基础参数定义
- 屏幕处理实际调用队形和参数定义
上图是JSON数据规范的模块,其中详细定义了以及基础参数,并在data_demo中,定义了要在屏幕上进行显示处理实际可以用到的调用对象,以及其所使用的参数。
例如:
表示调用M5Paper屏幕处理,在屏幕上坐标(x=27, y=25)的位置,显示字符7,文字颜色为白色。
服务端:
服务端的核心:
- 通过网络提供API接口
- 根据API接口返回对应日期的老黄历JSON数据
服务端程序,使用Python的Flask进行开发,提供API调用接口,通过传递的参数,检查是否存在对应日期的老黄历数据,并根据实际情况,提供给M5Paper使用。
具体的API调用方式如下:
- /api/v1.0/laohuangli/index/prev/n:查看前面第n天的老黄历
- /api/v1.0/laohuangli/index/next/n:查看后面第n天的老黄历
- /api/v1.0/laohuangli/index/next/0:查看当天的老黄历
M5Paper部分:
M5Paper部分的核心:
- 滚轮按键处理
- WiFi网络连接处理
- API接口请求处理
- 根据JSON数据规范解析老黄历数据
- 调用屏幕处理方法进行界面元素的呈现处理
在M5Paper上,使用Arduino IDE和M5Stack提供的M5EPD支持库进行开发。
实现框图:
具体的实现部分,分为以上两个部分,分别是M5Paper和Python服务端。
三、各部分功能说明(图文结合)
(各部分实现的功能说明及讲解,以图文结合的展示)
服务端:
服务端的核心处理代码如下:
在上述代码中,根据请求API时,提供的参数,来检查caches目录中,是否有对应日期的老黄历JSON数据。
如果今天为2024年1月10日,则访问如下的API接口,则会返回如下的数据:
- /api/v1.0/laohuangli/index/prev/1:返回2024年1月9日的老黄历JSON数据
- /api/v1.0/laohuangli/index/next/1:返回2024年1月11日的老黄历JSON数据
- /api/v1.0/laohuangli/index/next/0:返回当天2024年1月10日的老黄历JSON数据
老黄历的数据,需要提前进行准备,根据JSON数据规范的格式,结合老黄历本身的数据进行生成备用。
为了方便大家测试,提供了2024年1月整月的老黄历数据。
当调用服务端API接口时,返回对应的最终数据如下:
通过上述的调用定义序列,让M5Paper进行一步步的屏幕处理操作。
M5Paper部分:
在Arduino代码中,定义了一个根据JSON数据规范,来一对一方法调用的类:
在这个类的每个调用方法的具体实现中,根据M5Paper的EPD屏幕处理,进行实际的调用:
然后,在通过网络获取到老黄历的JSON数据后,对其进行解析处理:
通过上面的解析和调用,最终就能够实现通过JSON数据规范定义的老黄历JSON数据,在M5Paper上,进行实际界面的呈现了。
在运行的过程中,如果通过数据线连接了电脑,开启了串口监听,则能够看到输出的调试信息:
另外,在代码中,还在loop()调用部分,进行了滚轮按键检查,来实现天数的变化和调用的刷新处理:
按键后,通过串口监听,也可以看到调试信息:
实际界面操作:
系统启动时显示:
API请求数据时:
当日老黄历:2024年1月10日
前一天老黄历:2024年1月9日
后一天老黄历:2024年1月11日
网络请求出现问题时:
四、作品源码
源码说明:
- arduino目录内为M5Paper上运行的代码
- lao_huang_li_m5paper.ino:M5Paper上运行的Arduino程序代码
- server为Python开发的服务端代码
- laohuangli_server.py:服务端Py程序
- requirements.txt:运行服务端的依赖包
- templates/laohuangli.tpl.default.json:JSON数据规范模板文件
- caches:根据JSON数据规范模板文件生成的老黄历数据,提供了2024年1月整月的数据
五、作品功能演示视频
六、项目总结
(项目文字总结+帖子分享链接汇总)
项目总结:
这次活动中,千挑万选,选择了M5Stack的M5Paper这款设备。
经过实际的使用,发M5Paper真的是相当的好用,其所使用的EPD_ED047TC1墨水屏分辨率为540x960,显示的效果也非常的不错。
虽然M5Stack为M5Paper提供了UI Flow图形界面开发环境、micropython和circuitpython开发环境,以及Arduino支持库,但最终使用上,在Arduino环境中进行开发,最终效果最好。
通过M5EPD库的支持,能够将M5Paper的功能完全发挥出来。M5EPD提供的EPD屏幕处理函数,非常的丰富。不过在墨水屏上,进行复杂界面的显示和调试,依然是一件非常费劲的功夫。
在UI Flow中,可以在图形界面开发环境中,进行预览,不过不知道为啥,M5Stack支持M5Paper的UI Flow版本是老旧的v1.0版本,其对应的底层环境micropython也是老旧的版本。
因此,为了更好提高开发经典老黄历的调试效率,最终摸索定义了JSON数据干规范,使得界面调试的速度超大幅度的提升。
另外,在开发的过程中,也考虑到了通用性,采用定义调用接口类的方式,与底层硬件设备进行一定程度的解绑,以便于在其他类似设备的移植。目前已经在两款墨水屏上,实现了规范化数据的调用和显示处理。
感谢EEWorld提供本次创意大赛的机会,得以在这个小小的M5Paper上,实现经典老黄历的功能。翻看大家提交的作品,真的是各种创意不断,受益匪浅。衷心祝愿每个创意作品都能得奖,衷心祝愿EEWorld也会越办越好!
帖子分享链接:
七、其他
在本项目开发的过程中,参考了非常多的资料和文档,包括但不限于如下列出的:
对所有参考的资料和文档的作者,都报以由衷的感谢!
附加:电子文档
|