一、前言
1.1 项目开发背景
随着移动互联网和数字阅读技术的发展,电子书逐渐成为信息获取和阅读学习的重要方式。相比传统纸质书籍,电子书具备存储容量大、携带方便、资源更新快捷等优势,被广泛应用于学习、办公、资料查阅以及日常阅读等场景。然而,当前市场上的通用电子阅读设备大多存在价格较高、功能封闭、二次开发困难等问题,对于教学实验、嵌入式开发研究以及个性化阅读需求而言存在一定局限性。因此,设计一种基于嵌入式平台、具备开放性和可扩展性的智能电子书阅读器具有较强的研究意义和应用价值。
近年来,ESP32系列芯片凭借高性能处理能力、丰富的外设接口以及无线通信能力,在智能终端和物联网领域得到广泛应用。其中,ESP32-S3不仅具备较高的运算性能,还支持更完善的人机交互能力,能够满足文件管理、图形显示以及数据通信等功能需求。基于ESP32-S3构建电子书阅读器,可以充分发挥嵌入式平台低功耗、低成本、小型化等特点,为便携式数字阅读设备提供一种可行方案。
在阅读体验方面,传统液晶显示设备虽然刷新速度快,但长时间阅读容易产生视觉疲劳。墨水屏显示技术因具有接近纸张的视觉效果、低功耗以及断电保持显示等特点,更适合作为电子阅读设备的显示终端。因此,本项目采用2.0寸墨水屏作为阅读显示载体,实现电子书内容展示,提高阅读舒适度,同时降低设备整体功耗。
为了提升系统的资源管理能力和使用便捷性,本项目引入FATFS文件系统并支持SD卡读写,实现电子书资源的本地存储与管理,使设备能够完成TXT电子书文件的读取和内容解析。同时,为增强阅读辅助能力,系统增加语音播报功能,通过SYN6288语音模块将文本内容转换为语音输出,为长时间阅读、辅助学习以及特殊使用场景提供支持。
此外,考虑到电子书资源更新频繁以及用户交互需求,本项目设计了基于Qt5(C++)开发的上位机APP,实现电子书文件上传与更新功能。用户可通过APP将TXT电子书导入设备,避免频繁拆卸存储介质,提高内容管理效率。同时结合按键交互实现书籍选择与翻页控制,形成完整的电子书阅读闭环。
综合来看,本项目通过将ESP32-S3、FATFS文件系统、SD卡存储、墨水屏显示、语音播报以及上位机管理功能进行融合,实现了一套兼顾阅读体验、资源管理与交互便捷性的智能电子书阅读系统,为嵌入式阅读终端设计提供了参考方案,也具有一定的教学研究与工程实践价值。
1.2 设计实现的功能
(1)支持FATFS文件系统管理功能
系统集成FATFS文件系统,用于完成电子书文件的存储管理与访问控制。通过文件系统对存储介质中的目录和文件进行统一管理,实现TXT电子书文件的识别、读取以及内容解析,为电子书浏览与更新提供基础支持。
(2)支持SD卡读写功能
系统支持外接SD卡作为电子书数据存储介质,实现电子书文件的数据读入、存储和访问功能。用户可将TXT格式电子书保存至SD卡中,设备能够完成文件读取,并支持后续内容更新与资源管理。
(3)支持2.0寸墨水屏电子书显示功能
系统采用2.0寸墨水屏作为显示终端,用于显示电子书文本内容。设备能够将读取到的电子书数据进行页面显示,实现电子书阅读功能。墨水屏具备低功耗、接近纸张显示效果的特点,可满足长时间阅读需求。
(4)支持语音播报阅读功能
系统集成SYN6288语音播报模块,实现文本内容语音播放功能。设备能够将读取到的电子书文字信息发送至语音模块进行播报,使用户在阅读过程中可选择语音收听模式,提高阅读方式的灵活性。
(5)支持按键交互与翻页控制功能
系统配置按键输入模块,实现电子书选择、页面翻页等交互操作。用户可通过按键完成电子书切换、阅读页面切换等控制,提高设备使用便捷性和交互体验。
(6)支持ESP32-S3核心控制功能
系统以ESP32-S3作为主控制器,负责完成文件管理、数据显示、按键响应、语音控制以及数据通信等任务,实现各功能模块之间的数据处理与协调运行。
(7)支持APP更新电子书功能
系统配套采用Qt5(C++)开发的上位机APP,实现电子书资源更新管理。用户可通过APP将TXT格式电子书上传至设备端,实现电子书内容更新,无需直接操作存储介质,提高电子书管理效率。
1.3 项目硬件模块组成
(1)ESP32-S3主控模块
系统以ESP32-S3作为核心控制单元,负责完成电子书数据处理、文件读取、界面控制、按键响应、语音控制以及与上位机的数据交互。主控模块协调各硬件单元协同工作,实现整个电子书阅读器系统运行。
(2)SD卡存储模块
系统采用SD卡作为电子书资源存储介质,用于保存TXT格式电子书文件。主控通过读写接口访问存储数据,并结合FATFS文件系统完成文件管理、电子书读取和资源更新功能。
(3)2.0寸墨水屏显示模块
系统采用2.0寸电子墨水屏作为显示终端,用于显示电子书文本内容以及阅读页面信息。显示模块负责接收主控发送的数据,实现电子书页面刷新和阅读内容展示。
(4)SYN6288语音播报模块
系统集成SYN6288语音合成模块,用于将电子书文本内容转换为语音进行播放。主控将待播报文本发送至语音模块,实现语音阅读功能输出。
(5)按键输入模块
系统配置功能按键作为人机交互输入单元,用于完成电子书选择、菜单操作以及页面翻页控制。用户通过按键实现阅读过程中的基础操作控制。
(6)数据通信接口模块
系统配置用于与上位机APP进行数据交互的通信接口,实现电子书文件更新和传输功能。Qt5(C++)开发的APP通过通信方式向设备上传TXT电子书资源,实现内容更新。
(7)电源供电模块
电源供电模块用于为ESP32-S3主控、墨水屏、SD卡模块、语音模块及按键电路提供稳定工作电源,保障整个电子书阅读器系统稳定运行。
1.4 系统框架图
1.5 运行流程图
二、硬件选型
(1)主控制器选型——ESP32-S3模块
本项目核心控制器选用ESP32-S3作为系统主控芯片。ESP32-S3具备较强的数据处理能力和丰富的外设资源,能够满足电子书文件解析、显示刷新、按键交互、语音控制以及数据传输等功能需求。芯片内部集成高速处理核心,同时提供SPI、UART、GPIO等接口资源,便于连接墨水屏、SD卡以及语音模块。
选型:
- 主控型号:ESP32-S3-WROOM-1()
- 工作电压:3.3V
- Flash容量:8MB()
- PSRAM:8MB()
- 通信接口:SPI、UART、USB、GPIO
- 选型:满足文本缓存、界面刷新及文件系统运行需求,开发资料完善。
(2)存储模块选型——Micro SD卡模块
系统采用Micro SD卡作为电子书资源存储介质,用于保存TXT电子书文件,并通过FATFS文件系统完成文件管理和读取。由于电子书文本容量较小,因此普通容量存储卡即可满足要求。
选型:
- 模块类型:Micro SD Card SPI接口模块
- 通信方式:SPI
- 工作电压:3.3V
- 容量:8GB~32GB
- 文件系统:FAT32
- 选型:兼容FATFS,读写稳定,便于后续资源扩展。
连接方式:
- MOSI → ESP32-S3 SPI数据输出
- MISO → ESP32-S3 SPI数据输入
- SCK → SPI时钟
- CS → 自定义片选引脚
(3)显示模块选型——2.0寸电子墨水屏模块
系统采用2.0寸电子墨水屏作为阅读显示终端,实现文本内容显示。墨水屏具有超低功耗、显示接近纸质效果、静态显示不耗电等特点,适用于电子阅读应用。
选型:
- 显示尺寸:2.0英寸
- 分辨率:常见 250×122 或同等级规格
- 显示类型:黑白电子墨水屏
- 通信接口:SPI
- 工作电压:3.3V
- 驱动方式:控制器自带刷新驱动
选型:
- 阅读舒适度较高
- 静态页面功耗低
- 适合文字显示场景
连接信号:
- DIN(MOSI)
- CLK(SCK)
- CS
- DC
- RST
- BUSY
(4)语音播放模块选型——SYN6288语音合成模块
系统采用SYN6288语音合成模块,实现电子书文本语音播报功能。主控将文本数据通过串口发送至模块,由模块完成语音转换输出。
选型:
- 型号:SYN6288
- 通信方式:UART串口
- 工作电压:3.3V~5V
- 输出方式:音频输出
- 支持功能:中文文本转语音播放
选型:
- 集成度高
- 串口控制简单
- 与ESP32接口兼容性好
接口连接:
- TX → ESP32 RX
- RX → ESP32 TX
- 音频输出 → 功放模块
(5)音频输出模块选型——扬声器模块
由于SYN6288输出语音信号,因此需要配套扬声器进行语音播放,实现电子书语音阅读功能。
选型:
- 类型:8Ω小型扬声器
- 功率:1W~3W
- 驱动方式:配合语音模块输出
- 安装方式:板载或外置
选型:
- 满足语音播报需求
- 功耗低、结构简单
(6)按键输入模块选型——轻触按键模块
系统通过物理按键实现电子书选择、页面翻页等交互操作。
选型:
- 类型:轻触按键
- 数量:根据功能配置(选择、确认、上一页、下一页)
- 工作电压:3.3V
- 接口方式:GPIO输入
选型:
- 成本低
- 操作直观
- 易于实现中断响应
电路:
- 按键+上拉电阻结构
- 软件消抖处理
(7)通信更新接口选型——USB串口通信模块
系统支持通过Qt5开发的APP上传电子书文件,因此需要通信接口完成数据传输。
选型:
连接:
- TXD ↔ RXD
- RXD ↔ TXD
(8)电源供电模块选型——3.3V稳压供电电路
系统整体工作电压以3.3V为主,需要设计稳定供电模块保证系统运行。
选型:
三、上位机开发
3.1 Qt开发环境安装
Qt的中文官网: https://www.qt.io/zh-cn/
QT5.12.6的下载地址:https://download.qt.io/archive/qt/5.12/5.12.6
打开下载链接后选择下面的版本进行下载:
如果下载不了,可以在网盘里找到安装包下载: 飞书文档记录的网盘地址:https://ccnr8sukk85n.feishu.cn/wiki/QjY8weDYHibqRYkFP2qcA9aGnvb?from=from_copylink
软件安装时断网安装,否则会提示输入账户。
安装的时候,第一个复选框里的编译器可以全选,直接点击下一步继续安装。
选择编译器: (一定要看清楚了)
3.2 新建上位机工程
前面2讲解了需要用的API接口,接下来就使用Qt设计上位机,设计界面,完成整体上位机的逻辑设计。
【1】新建工程
【2】设置项目的名称。
【3】选择编译系统
【4】选择默认继承的类
【5】选择编译器
【6】点击完成
【7】工程创建完成
3.3 切换编译器
在左下角是可以切换编译器的。 可以选择用什么样的编译器编译程序。
目前新建工程的时候选择了2种编译器。 一种是mingw32这个编译Windows下运行的程序。 一种是Android编译器,可以生成Android手机APP。
不过要注意:Android的编译器需要配置一些环境才可以正常使用,这个大家可以网上找找教程配置一下就行了。
windows的编译器就没有这么麻烦,安装好Qt就可以编译使用。
下面我这里就选择的 mingw32这个编译器,编译Windows下运行的程序。
3.4 编译测试功能
创建完毕之后,编译测试一下功能是否OK。
点击左下角的绿色三角形按钮。
正常运行就可以看到弹出一个白色的框框。这就表示工程环境没有问题了。 接下来就可以放心的设计界面了。
3.5 设计UI界面与工程配置
【1】打开UI文件
打开默认的界面如下:
【2】开始设计界面
根据自己需求设计界面。
项目结构
EbookReader/
├── EbookReader.pro
├── main.cpp
├── mainwindow.h
├── mainwindow.cpp
├── mainwindow.ui
├── ebookreader.h
├── ebookreader.cpp
├── filemanager.h
├── filemanager.cpp
├── settings.h
├── settings.cpp
└── resources/
├── images/
└── styles.qss
1. 项目配置文件 (EbookReader.pro)
// EbookReader.pro
QT += core widgets serialport multimedia
TARGET = EbookReader
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
SOURCES +=
main.cpp
mainwindow.cpp
ebookreader.cpp
filemanager.cpp
settings.cpp
HEADERS +=
mainwindow.h
ebookreader.h
filemanager.h
settings.h
FORMS +=
mainwindow.ui
RESOURCES +=
resources.qrc
# 默认规则
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
2. 主窗口头文件 (mainwindow.h)
// mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QStackedWidget>
#include <QListWidget>
#include <QTextEdit>
#include <QPushButton>
#include <QLabel>
#include <QProgressBar>
#include <QSlider>
#include <QComboBox>
#include <QCheckBox>
#include <QSerialPort>
#include <QTimer>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class EbookReader;
class FileManager;
class SettingsDialog;
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
protected:
void closeEvent(QCloseEvent *event) override;
private slots:
// 页面切换
void switchToLibrary();
void switchToReader();
void switchToSettings();
// 文件操作
void openFile();
void deleteFile();
void refreshFileList();
void onFileSelected(const QString &filename);
// 阅读控制
void nextPage();
void prevPage();
void goToPage(int page);
void changeFontSize(int size);
void toggleFullScreen();
// 语音控制
void startVoicePlay();
void stopVoicePlay();
void adjustVoiceSpeed(int speed);
void adjustVoiceVolume(int volume);
// 串口通信
void connectDevice();
void disconnectDevice();
void sendToDevice(const QByteArray &data);
void readFromDevice();
void updateDeviceStatus();
// 其他
void updateStatusBar(const QString &message);
void showAbout();
private:
void setupUI();
void setupConnections();
void setupSerialPort();
void loadSettings();
void saveSettings();
void updateReaderUI();
Ui::MainWindow *ui;
// 核心组件
EbookReader *ebookReader;
FileManager *fileManager;
SettingsDialog *settingsDialog;
// 串口通信
QSerialPort *serialPort;
bool isDeviceConnected;
QTimer *statusTimer;
// UI组件(动态创建)
QStackedWidget *centralStack;
QWidget *libraryWidget;
QWidget *readerWidget;
QWidget *settingsWidget;
// 库页面组件
QListWidget *fileList;
QPushButton *openButton;
QPushButton *deleteButton;
QPushButton *refreshButton;
QLabel *fileInfoLabel;
// 阅读器页面组件
QTextEdit *textDisplay;
QLabel *pageLabel;
QPushButton *prevButton;
QPushButton *nextButton;
QPushButton *voiceButton;
QSlider *pageSlider;
QComboBox *fontSizeCombo;
QProgressBar *progressBar;
// 状态
QString currentFile;
int currentPage;
int totalPages;
bool isVoicePlaying;
};
#endif // MAINWINDOW_H
3. 主窗口实现 (mainwindow.cpp)
// mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "ebookreader.h"
#include "filemanager.h"
#include "settings.h"
#include <QFileDialog>
#include <QMessageBox>
#include <QTextStream>
#include <QFile>
#include <QSettings>
#include <QCloseEvent>
#include <QSerialPortInfo>
#include <QDebug>
#include <QScrollBar>
#include <QTimer>
#include <QMediaPlayer>
#include <QAudioOutput>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
, ebookReader(nullptr)
, fileManager(nullptr)
, settingsDialog(nullptr)
, serialPort(nullptr)
, isDeviceConnected(false)
, statusTimer(nullptr)
, currentPage(0)
, totalPages(0)
, isVoicePlaying(false)
{
ui->setupUi(this);
// 初始化组件
ebookReader = new EbookReader(this);
fileManager = new FileManager(this);
settingsDialog = new SettingsDialog(this);
// 设置UI
setupUI();
setupConnections();
setupSerialPort();
// 加载设置
loadSettings();
// 更新状态
updateStatusBar("Ready");
refreshFileList();
// 设置窗口标题
setWindowTitle("智能电子书阅读器 - ESP32-S3");
setMinimumSize(900, 600);
}
MainWindow::~MainWindow()
{
if (serialPort && serialPort->isOpen()) {
serialPort->close();
}
delete ui;
}
void MainWindow::setupUI()
{
// 创建中央堆叠窗口
centralStack = new QStackedWidget(this);
setCentralWidget(centralStack);
// ============ 库页面 ============
libraryWidget = new QWidget();
QVBoxLayout *libraryLayout = new QVBoxLayout(libraryWidget);
// 工具栏
QHBoxLayout *toolbarLayout = new QHBoxLayout();
QLabel *titleLabel = new QLabel("
154