Funpack-5 第二季 第五期 在线电子书项目总结报告
本次我Funpack第二季第五期完成的是任务三使用板卡的屏幕和联网功能,实现一个在线电子书浏览器,从网络上获取文本并显示在屏幕上,通过按键翻页。
项目背景:近年来,由于5G的落地,物联网技术也迎来了质的飞跃,许多物联网芯片也在更新换代。作为深耕 AIoT 领域软硬件产品的研发与设计多年的乐鑫科技,发布了一款支持智能语音识别的AIoT应用开发板:ESP32-S3-BOX-Lite。它既可以用于构建智能音箱,也可以赋能更多物联网设备实现人机语音交互。同时,它还集按键控制、传感器、红外控制器和智能网关等多功能于一体,能够作为全屋设备的控制中枢,支持用户通过语音命令或按键控制,轻松实现全屋智能联动。
项目需求:使用板卡的屏幕和联网功能,实现一个在线电子书浏览器,从网络上获取文本并显示在屏幕上,通过按键翻页。
项目描述:项目使用了ESP32-S3-BOX-LITE,是乐鑫发布的新一代 AIoT 开发平台,ESP32-S3-BOX-Lite 开发套件配备了一块 2.4 寸 LCD 显示屏、双麦克风、一个扬声器、两个用于硬件拓展的 Pmod™ 兼容接口和3个独立按键,可构建多样的 HMI 人机交互应用。开发板可实现离线语音唤醒和命令词识别,支持乐鑫自研的高性能声学前端算法构建语音交互系统。开发者可利用开源的 SDK轻松构建在线离线语音助手、智能语音设备、HMI 人机交互设备、多协议网关等多样的应用。
利用ESP32-S3-BOX-LITE搭载的2.4寸LCD显示屏,esp32的wifi功能,和分压式按键,通过micropython语言,用thonny进行编程,实现了在线电子书浏览器,从网络上获取文本并显示在屏幕上,通过按键翻页。
设计思路
硬件:
LCD显示屏:使用了板载的st7789驱动的2.4寸LCD显示屏,LCD 液晶屏是 Liquid Crystal Display 的简称,LCD 的构造是在两片平行的玻璃当中放置液态的晶体,两片玻璃中间有许多垂直和水平的细小电线,透过通电与否来控制杆状水晶分子改变方向,将光线折射出来产生画面。该显示屏具有寿命长,易于彩色化、节能、具有高精细的画质、显示信息量大等优点。
ADC按键:板载的三个用户按键也采用了通过ADC采集这种独特的方式,板载的3个独立按键摒除了传统的按键形式,而是通过利用电阻分压的形式实现的ADC按键读取。三个按键只占用一个io口,节省单片机的资源。ESP32上有几个引脚可以用来获取模拟量——这些引脚称为 ADC 引脚(模拟值转换为数字值).首先我们需要对ADC引脚进行初始化,设置12分辨率的精度,设置全量程电压为3.3V。通过分压电阻,当不同的按键按下时,IO采集到的电压不同,可以限制每个按键的电压范围然后判断当某个按键被按下时电压是否落入对应的范围内来判断是否被按下;
Esp32s3主控:是一款集成 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE) 的 MCU 芯片,支持远距离模式 (Long Range)。ESP32-S3 搭载 Xtensa® 32 位 LX7 双核处理器,主频高达 240 MHz,内置 512 KB SRAM (TCM),具有 45 个可编程 GPIO 管脚和丰富的通信接口。ESP32-S3 支持更大容量的高速 Octal SPI flash 和片外 RAM,支持用户配置数据缓存与指令缓存。esp32 box lite载了16M外存和8M内存。
软件:
使用的是thonny编辑器:它支持全平台(Windows,Mac,Linux)、它支持简体中文,对英文不好的同学非常友好、它界面简洁直白,内置的功能都是完全面向新手的、它内置 Python3,无需新手额外安装Python和配置环境、它的调试界面非常直观,可吊打市面上 90% 的编辑器、它提供比代码行粒度更小的调试模式,是它闪光点之一、它支持语法高亮,应该是基本功能了、它支持代码补全(只可惜不是自动,而是手动)、它内置非常简洁易用的图形界面包管理器。
配置ESP32S3并烧录固件,需要烧录特定的esp32 micropython固件,才能使用esp32s3 box lite 的全部功能。
可以通过thonny进行micropython固件的烧录,只需要打开内置的固件烧录工具,在按下boot按键的同时,按下reset键,就可以进入固件烧录模式,之后选择正确的串口号和要烧录的micropython固件就行,micropython固件可以从micropython官网获取,也可以在thonny中选择。除此之外,也可以通过esptool来进行固件烧录:
项目整体并没有多大的难度,可以找到很多开源的micropython库文件,再配合自己编写的一些函数,就可以完成任务三的全部内容了,以下是一些用到库文件 和 自己编写的函数,其中st7789库文件、vga库文件、ufont库文件均为github开源库文件,其中photoloop文件是我自己编写的py文件,主要进行按键读取,wifi连接、数据请求、屏幕显示等功能:
对部分代码做一些解释:
背景显示:经过多次尝试,发现显示小说部分屏幕刷新会很慢,其中时间主要是消耗在了请求数据和寻找汉字对应的编码,尝试了很多方案仍然没能很好的解决这个问题,于是我另辟蹊径,通过设定一些有意思的图片,显示在汉字刷新的时候,单个的静态图片刷新很快,作品展示中是采用了一张太空人的图片,仅仅是为了增加显示的美观程度,以下是背景显示和切换的函数接口
def show_img():
with open("img1.dat", "rb") as f:
for row in range(240):
buffer = f.read(480)
tft.show_img(0, row, 239, row, buffer)
ADC读取:板载的3个独立按键摒除了传统的按键形式,而是通过利用电阻分压的形式实现的ADC按键读取。ESP32上有几个引脚可以用来获取模拟量——这些引脚称为 ADC 引脚(模拟值转换为数字值)首先对ADC引脚进行初始化,设置12分辨率的精度,设置全量程电压为3.3V。通过分压电阻,当不同的按键按下时,IO采集到的电压不同,可以限制每个按键的电压范围然后判断当某个按键被按下时电压是否落入对应的范围内来判断是否被按下;
pot = ADC(Pin(1)) #定义34脚为ADC脚,可以读取模拟电压
pot.width(ADC.WIDTH_12BIT) #读取的电压转为0-4096
pot.atten(ADC.ATTN_11DB) #输入电压0-3.3v
adc_value=1024
while adc_value>240:
pot_value = pot.read() //4 #使读取的电压变为0-1024
print(pot_value) #打印出读取到的电压以便调试
adc_value=pot_value
sleep(0.1) #每100ms读取一次
小说显示:2.4寸LCD显示屏是用ST7789驱动的,中文字库使用的是ufont,代码的主要思路就是,显示当前图案背景,然后读取得到数据的长度,每一行是显示18个字符最为合适,所以设定的是让每一行显示18个字符,之后进行换行操作,当显示到整页后,停止获取数据,同时检测ADC按键的值,判断按键状态,以此来进行翻页的操作。
show_img()
for i in range (len(lines)):
zi=lines[i]
for j in range(0,len(zi),18):
xian=zi[j:j+18]
font1.text(tft, xian, 8, 0, show=True)
print(tft.y_bias)
tft.y_bias+=1
小说爬取:通过在电脑上搭建爬虫网络,爬取互联网上的小说,为esp32 请求数据做准备:
import requests
import re
from lxml import etree
from tqdm import tqdm
url = "https://www.xbiquge.la/xiaoshuodaquan/"
response = requests.get(url)
response.encoding="utf-8"
html = response.text
o_url = "https://www.xbiquge.la"
#new_url = o_url + chapter_urls[0]
pbar = tqdm(range(len(chapter_urls)))
for i in pbar:
new_url = o_url + chapter_urls[i]
#print(new_url)
response = requests.get(new_url)
response.encoding="utf-8"
html = response.text
#print(html)
ele = etree.HTML(html)
book_bodys = ele.xpath("//div[@id='content']/text()")
#print(book_bodys[0])
s = "\n"+chapter_titles[i]+"\n"
for book_body in book_bodys:
c = "".join(book_body.split())
c = remove_upprintable_chars(c)
s += c
with open("文章.txt","a") as f:
f.write(s)
print("文章 下载完毕!")
功能展示及说明:
在micropython环境下,通过主控esp32s3芯片和基于st7789驱动的2.4寸LCD液晶显示屏,实现连接wifi,访问互联网,并且在LCD显示屏上显示网络连接信息。屏幕驱动用的是github上开源的st7789库,文字显示部分使用的是ufont库和字体文件,读取需要使用的文字并进行显示,小说部分是使用http get请求获取小说内容,对得到的数据进行处理和显示,在LCD上进行分行 和 分页显示。通过在主循环里读取ADC按键值,并进行按键处理操作。
开机上电之后首先尝试连接网络、显示连接网络状态、网络连接成功后打印网络信息、之后进入到现实小说的部分,通过电脑爬取网络上的小说,esp32通过wifi请求获取小说数据,显示当前目录、同时esp32进行ADC按键的读取,通过检测ADC按键的状态进行相应的按键翻页操作。
对本活动的心得体会:
通过对本项目的学习,我对esp32模块又有了进一步的了解,其联网获取信息的功能锻炼了我的动手能力和编程能力,对嵌入式开发有了新的体会,受益匪浅。未来期望再次参加活动,了解并学习更多的知识,掌握更多的技能,开拓电子芯片在生活中运用的视野。