一、项目概述
本项目基于ESP32-S3-Box-Lite套件和CircuitPython固件,实现了一个电子诗词阅读器。本项目旨在将传统文化与现代科技相结合,为用户提供一种全新的诗词阅读体验。本项目参与了得捷电子和硬核学堂联合举办的Funpack第二季第五期活动。
二、设计思路
本项目硬件基于ESP32-S3-Box-Lite套件,固件使用CircuitPython 8.2.1(官方支持了ESP32-S3-Box-Lite开发套件),软件代码基于CircuitPython内置包和一些扩展包,使用PyCharm IDE编写。
主要设计思路如下:
-
硬件使用ESP32-S3-Box-Lite,主要用到显示屏、按键、WiFi等功能;
-
固件使用CircuitPython,官方支持了ESP32-S3-Box-Lite开发板,固件自带库支持了显示屏、WiFi功能,可以满足基本功能要求;
-
软件使用了CircuitPython内置包和扩展包,内置包主要使用os,time,gc,json等包,扩展包主要使用adafruit_bitmap_font,adafruit_display_text,adafruit_reqeusts等;
-
业务功能实现,主要包括WiFi联网、HTTP请求、JSON解析、界面绘制、UI交互,基于CircuitPython内置包和扩展包实现;
设计思路的整体框图如下所示:
三、硬件介绍
3.1 ESP32-S3-BOX-LITE 简介
ESP-BOX 是乐鑫发布的新一代 AIoT 开发平台,ESP32-S3-BOX-Lite 开发套件配备了一块 2.4 寸 LCD 显示屏、双麦克风、一个扬声器、两个用于硬件拓展的 Pmod™ 兼容接口和3个独立按键,可构建多样的 HMI 人机交互应用。开发板可实现离线语音唤醒和命令词识别,支持乐鑫自研的高性能声学前端算法构建语音交互系统。开发者可利用开源的 SDK轻松构建在线离线语音助手、智能语音设备、HMI 人机交互设备、多协议网关等多样的应用。
3.2 前面板按键原理图
查阅ESP32-S3-Box-Lite原理图,可以知道——前面板三个按键是通过ADC进行区分的:
可以看到,前面板的键盘子板连接在主控芯片的GPIO1上。
3.3 启动键原理图
查阅ESP32-S3-Box-Lite原理图,可以找到侧边的启动和复位按键的部分:
可以看到,BOOT按键连接在主控芯片的GPIO0上。
四、软件介绍
不同于使用C语言进行嵌入式软件开发,底层驱动库代码和应用代码需要编译到同一份固件中,一次烧录到设备的二进制代码同时包含驱动代码和应用代码。使用CircuitPython或者MicroPython进行嵌入式开发时,固件和应用代码是完全分离的。
本文将软件部分和固件部分分别介绍,正是因为在开发过程中这两部分相对独立。但宽泛的来说,固件也属于一种软件,本章节重点介绍的是——不包含在固件内的Python代码部分,具体包括一些CircuitPython扩展软件包和业务功能实现代码。
4.1 CircuitPython简介
固件使用的是ESP32-S3-Box-Lite版的CircuitPython,下载页面: ESP32-S3 Box Lite - 16MB Flash, 8MB PSRAM (circuitpython.org)
使用CuicirPython最大的好处是,Adafruit已经对ESP32-S3-Box-Lite开发板做了支持,板子的绝大部功能都可以开箱即用,包括wifi、LCD功能,同时Flash、RAM配置也是正确的可以充分利用设备的运行内存和存储空间。
另外Adafruit提供了大量包,基于这些软件包进行一些功能扩展和二次开发也非常方便,例如本项目中使用到的adafruit_bitmap_font、adafruit_display_text、adafruit_requests。
4.2 导入的软件包
本项目使用到的CircuitPython扩展软件包有:
-
adafruit_bitmap_font,用于支持位图字体库
-
adafruit_display_text,用于支持文本框控件
-
adafruit_requests,用于实现HTTP请求
另外,还使用到了CircuitPython内置包:
-
digitalio,GPIO功能接口
-
analogio,ADC功能接口
-
displayio,显示功能接口
-
board,引脚别名,用microcontroller包也可以
以及Python原生包:
-
gc,用于主动触发垃圾回收
-
time,用于实现延时操作
-
json,用于实现json字符串解析
4.3 业务功能实现
目前整个业务功能代码实现全部位于一个文件内,按照过程式凡事设计为一系列函数。
业务功能实现代码主要包括:
-
WiFi联网
-
HTTP请求
-
JSON解析
-
界面绘制
-
UI交互
下面分别介绍相关功能实现的代码片段。
WiFi联网功能,主要代码片段:
HTTP请求和JSON解析功能,主要实现代码:
JSON解析,调用json.loads即可解析字符串。
目录界面绘制,主要实现代码:
绘制选择光标、选择交互界面,包括翻页功能:
显示诗词内容界面:
底部会显示行数的进度。
诗词内容交互,包括长诗词的翻页功能:
五、活动心得
本次活动项目是我第一次使用CircuitPython,虽然此前也接触过不少开发板,但基本上是以C/C++开发为主。本次项目整个完成的过程中,最大的体会是感叹CircuitPython的功能完善和强大,比如这次的电子诗词阅读器软件业务代码仅用了不到500行Python代码就实现了,虽然界面比较丑陋。另外Adafruit提供的文档和示例也非常的丰富。
六、开源仓库
项目开源代码库地址,包括预处理之后的诗词数据:https://gitee.com/swxu/poem/
七、参考链接
-
Funpack第二季第5期活动页面: Digikey Funpack (eetree.cn)
-
ESP32-S3-Box-Lite原理图: SCH_ESP32-S3-BOX-Lite_MB_V1.1_20211221.pdf (gitee.com)
-
ESP32-S3-Box-Lite CircuitPython固件下载页面: ESP32-S3 Box Lite - 16MB Flash, 8MB PSRAM (circuitpython.org)
-
PyCharm IDE下载页面: https://www.jetbrains.com/pycharm/download/
-
文泉驿中文字体pcf位图格式: https://sourceforge.net/projects/wqy/files/wqy-bitmapfont/1.0.0-RC1/wqy-bitmapsong-pcf-1.0.0-RC1.tar.gz
-
CircuitPython外设控制教程: CircuitPython Essentials | CircuitPython Essentials | Adafruit Learning System
-
CircuitPython显示控制教程:Introduction | CircuitPython Display Support Using displayio | Adafruit Learning System
-
CircuitPython字体定制教程:https://learn.adafruit.com/custom-fonts-for-pyportal-circuitpython-display
-
CircuitPython内置包wifi参考文档: wifi — Adafruit CircuitPython documentation
-
CircuitPython内置包analogio参考文档: analogio – Analog hardware support — Adafruit CircuitPython documentation
-
CircuitPython内置包digitalio参考文档: digitalio – Basic digital pin support — Adafruit CircuitPython documentation
-
CircuitPython内置包displayio参考文档: displayio – Native helpers for driving displays — Adafruit CircuitPython documentation
-
CircuitPython扩展包adafruit_bitmap_font参考文档: adafruit_bitmap_font.bdf — Adafruit Bitmap_Font Library 1.0 documentation (circuitpython.org)
-
CircuitPython扩展包adafruit_display_text包考文档: adafruit_display_text — Adafruit Display_Text Library 1.0 documentation (circuitpython.org)
-
CircuitPython扩展包adafruit_requests参考文档: adafruit_requests — Adafruit Requests Library 1.0 documentation (circuitpython.org)