基于ESP32-S3-BOX-Lite的电子书
基于ESP32-S3-BOX-Lite的电子书,通过架设的httpserver读取电子书,在ESP32-S3-BOX-Lite上显示,支持翻页。
标签
ESP32-S3
ESP32-S3-BOX-LITE
Funpack2-5
Juggernaut
更新2023-08-09
430

基于ESP32-S3-BOX-Lite的电子书

一、项目描述

本项目基于ESP32-S3-BOX-Lite的电子书,通过架设的httpserver读取电子书,在ESP32-S3-BOX-Lite屏幕上显示,支持翻页。

1、硬件平台

ESP32-S3-BOX-Lite 是一款轻量级 AI 语音开发套件,由 ESP32-S3 SoC 驱动,支持 AI 加速和 Wi-Fi + 蓝牙 5 (LE) 无线功能。ESP32-S3-BOX-Lite 具有内置 2.4 英寸 LCD 显示屏、双麦克风、扬声器、两个 PmodTM 兼容扩展接口和三个独立按钮,可构建各种 HMI 人类 计算机交互应用程序。 借助开箱即用的语音唤醒和语音识别功能,以及 Espresso 的开源开发框架和示例,开发人员可以更快地创建各种有趣的 AIoT 应用程序。

2、软件平台

CircuitPython 是初学者友好的 Python 开源版本,适用于称为微控制器的小型廉价计算机。微控制器是许多电子产品的大脑,包括用于构建业余项目和原型的各种开发板。电子学中的 CircuitPython 是学习编码的最佳方式之一,因为它将代码与现实联系起来。通常只需通过拖放将 CircuitPython 安装在受支持的 USB 板上,然后code.py 在 CIRCUITPY 驱动器上编辑文件。本项目使用的CircuitPython的ESP32-S3-BOX-Lite 软件包,下载地址为https://circuitpython.org/board/espressif_esp32s3_box_lite/ ,当前最新版本为CircuitPython 8.2.1。

二、硬件介绍

ESP32-S3-BOX-Lite 的PCB图下载地址见https://gitee.com/EspressifSystems/esp-box/raw/master/hardware/esp32_s3_box_lite_MB_V1.1/schematic/SCH_ESP32-S3-BOX-Lite_MB_V1.1_20211221.pdf ,本项目主要用到WIFI和LCD模块,以及硬件按钮。

LCD通过SPI接口连接,控制IC为ST7789。

IMG_256

按钮包括前面板的3个,为ADC方式,需要通过电压判断验证按钮是否按下。

D9WQhfiOHSQjwAAAABJRU5ErkJggg==

三、设计思路

1、网络互连

Wi-Fi连接一直是ESP32系列芯片的强项,ESP32-S3是一款低功耗的MCU系统级芯片SoC,支持2.4 GHz Wi-Fi和低功耗蓝牙 (Bluetooth® LE) 双模无线通信。因此直接使用ESP32-S3的硬件,加上CircuitPython的wifi和socketpool软件包可以联网,HTTP实现依赖adafruit_requests软件包。

2、LCD显示

LCD模块为SPI接口,加上CircuitPython固件直接支持LCD显示,只需在使用的时候导入displayio和board包即可,配合adafruit_display_text的字体。考虑到中文显示字库加载比较慢(1-2s左右),选择了阅读电子书,读的是狄更斯的双城记(A Tale of Two Cities)。

3、按键检测

按键检测主要监视前板的按键动作,一旦电压超过阈值即认为按键按下,可以执行规定动作,需要导入analogio和digitalio包。

四、业务流程设计和实现

ESP

1、连接WIFI

连接WIFI主要使用CircuitPython固件的wifi扩展包,直接执行

wifi.radio.connect("AP_NAME","PASSWORD")

即可。

2、发起HTTP GET

socket = socketpool.SocketPool(wifi.radio)

http = requests.Session(socket)

resp = http.get("IP:PORT")

#print(resp.json())

先创建socket和session,然后直接使用python的http.get()发起GET请求,获得response。

3、解析&显示

ebook = json.loads(resp.text)

text1 = ebook["ebook"]

resp.close()

splash = displayio.Group()

board.DISPLAY.show(splash)

i = 0

while i <= 6:

text_area = label.Label(terminalio.FONT, text=text1[i*50:(i+1)*50])

text_area.x = 10

text_area.y = (i+1) * 30 + 20

i += 1

splash.append(text_area)

将response按照httpserver端生成的格式解析好,然后通过splash.appen()在LCD上逐条显示。

4、按键检测

在程序的主循环中监视按键,一旦右键按下即刻重新发起get请求并显示新获取的内容。

while True:

keys = key_status_read()

if keys[KEY_RIGHT] == True:

getAndDispEbook()

While循环中可以休眠1s,考虑到CPU比较强大,加上程序也不是很复杂,所以直接不加了,这样按键响应迅速点。

5、Httpserver端

主要是现在网络上的电子书都不是json格式,所以无奈只有自己架设Httpserver提供合适格式的电子书。

class Resquest(BaseHTTPRequestHandler):

timeout = 5

filePosition = 0

server_version = "Apache" #设置服务器返回的的响应头

def do_GET(self):

self.send_response(200)

self.send_header("Content-type","application/json") #设置服务器响应头

#self.send_header("test1","This is test!") #设置服务器响应头

self.end_headers()

#read ebook

with open('ATaleofTwoCities.txt','r',encoding='utf-8') as file:

file.seek(Resquest.filePosition)

data = {

'ebook': file.read(350)

}

Resquest.filePosition = file.tell()

jsonData = json.dumps(data, ensure_ascii=False)

self.wfile.write(jsonData.encode('utf-8'))

Httpserver主要实现了GET的响应,即每次读出一定数量的字符,构造200 response返回。

五、实际运行

1、Httpserver端

xiGEGAj1Ix8ziwvuz4xF34KRa0GTgtinIQkhTf4PvXoRsVwph3UAAAAASUVORK5CYII=

服务端的log如上。

2、ESP32-S3-BOX-Lite端

运行后可以看见ESP32-S3-BOX-Lite获取了IP,之后读取并显示电子书内容“It was the best of times, it was the worst of times, it was the age of wisdom, it was the age of foolishness, it was the epoch of belief, it was the epoch of incredulity, it was the season of Light, it was the season of Darkness, it was the spring of hope, it was the winter of despair, we had everything before us, we had nothing before us, we were all going direct to Heaven, we were all going direct the other way”。

B1OBiBgCH948P1hmmuA7zK1SU9dBITR+Pv2Huye+7cCOIfXEvyeW1S02+nxeh0fz9UVKVxsB3xK353CdjXrCSi7UIRb+P7VIyOFoAl0CAAAAAElFTkSuQmCC

六、一些感想

第一次使用python+ESP32S3完成一个作品,很多地方不是很熟悉,只能一个个测试验证。

踩过的坑,本来计划基于python做一个语音天气播报,等做完天气数据获取+tts生成后,发现SPEAKER无法驱动,问了很多人感觉无法完成后感觉换题目。

python+ESP32的生态很好,各种扩展包,功能设计很方便。

最后,感谢主办方组织的Funpack活动,学到了很多。

附件下载
httpServer.py
httpserver源码
main.py
BOX端源码
团队介绍
个人,电子菜鸟,新入门者
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号