1762浏览
查看: 1762|回复: 5

[ESP8266/ESP32] 基于ESP32-S3-BOX-Lite的在线电子书阅读器

[复制链接]
本帖最后由 豆爸 于 2023-8-8 10:34 编辑

一、项目介绍
本项目利用ESP32-S3-BOX-Lite开发板制作一个电子书浏览器,能够在线获取电子书,在屏幕上显示,通过按键进行翻页。



二、硬件简介
ESP32-S3-BOX-Lite 是目前对应的 AIoT 应用开发板,采用的是ESP32-S3核心微控制器,支持Wi-Fi + Bluetooth 5 (LE) SoC。该开发板配备一块 2.4 寸 LCD 显示屏、双麦克风、一个扬声器、两个用于硬件拓展的 Pmod™ 兼容接口、结合三个独立按键,可构建多样的 HMI 人机交互应用。其系统架构如图2所示。
基于ESP32-S3-BOX-Lite的在线电子书阅读器图1
图1






基于ESP32-S3-BOX-Lite的在线电子书阅读器图2
图2 系统框图
三、设计思路
1、屏幕显示功能的实现

使用Arduino IDE进行编程,采用LovyanGFX图形库驱动ST7789屏幕。LovyanGFX是一个用于微控制器的图形库,它基于Adafruit_GFX库,为开发者提供了在嵌入式系统上绘制图形和文本的功能。LovyanGFX支持许多常见的图形操作,如绘制线条、矩形、圆形和位图,还可以选择不同的字体和颜色来显示文本。

2、按键翻页功能的实现

如图3所示,位于ESP32-S3-BOX-Lite前面板底部中间有3个按键,图中标为“4. Button”,使用最左边的按键作为向前翻页,使用最右边的按键作为向后翻页。
基于ESP32-S3-BOX-Lite的在线电子书阅读器图3
图3 外部功能接口及按键
如图4所示,根据原理图可知,这3个按键连接到了GPIO1。通过analogRead()函数读取ADC按键的模拟值,判断按下了哪个按键。
图 4 按键原理图

arduino c,通过串口打印analogRead()的值,测得这2个按键的模拟量值分别在3017和983左右,如图5所示。
图5 analogRead()读取的按键的值

3、联网功能的实现

arduino c下,加载WiFi.h库,通过WiFi.begin(ssid, password)可以将ESP32-S3-BOX-Lite连接到wifi网络。

4、在线电子书功能的实现

arduino c下,加载HTTPClient库,通过 http.begin()、http.GET()可以实现在线请求电子书内容。

5、服务器端

服务器端,通过Python与Flask框架进行编写,用于响应ESP32-S3-BOX-Lite的请求,返回电子书内容到ESP32-S3-BOX-Lite。

四、流程图
图6 流程图

五、主要代码片段说明

1、导入库

  1. #define LGFX_ESP32_S3_BOX_LITE
  2. #define LGFX_AUTODETECT
  3. #include <WiFi.h>
  4. #include <HTTPClient.h>
  5. #include <LovyanGFX.hpp>
复制代码

2、定义变量及常量

  1. // 定义GPIO引脚
  2. #define BUTTON_PIN 1
  3. // 存储按键状态标志
  4. bool buttonFlag = false;
  5. // 设置WiFi网络
  6. const char* ssid = "xiaogui";
  7. const char* password = "88888888";
  8. // 电子书服务器地址
  9. String ebook_url = "http://192.168.21.159:5000/ebook";
  10. // 设置电子书首页页码
  11. int currentPage = 1;
  12. // 设置电子书最大页码
  13. int maxPages = 5;
  14. // 存储电子书内容的缓冲区
  15. String bookContent = "";
复制代码

3、实例化LGFX类

  1. // 创建LCD对象
  2. static LGFX gfx;
复制代码

4、连接wifi网络

  1. // 连接wifi
  2. void con_wifi(){
  3.   Serial.print("连接到wifi网络");
  4.   WiFi.begin(ssid, password);
  5.   while (WiFi.status() != WL_CONNECTED) {
  6.       delay(500);
  7.       Serial.print(".");
  8.   }
  9.   Serial.println("");
  10.   Serial.println("网络已连接");
  11.   Serial.print("IP address: ");
  12.   Serial.println(WiFi.localIP());
  13.   gfx.println("网络已连接");
  14.   gfx.println(WiFi.localIP());
  15. }
复制代码

5、ADC按键扫描子函数。

函数功能说明:通过analogRead()函数读取ADC按键的模拟值,通过判断确认按下了“上一页键”,还是“下一页键”,并更新电子书页码。
  1. // 扫描按键
  2. void ADCKeyScan(){
  3.   int buttonValue = analogRead(BUTTON_PIN);
  4.   //Serial.print("buttonValue:");
  5.   //Serial.println(buttonValue);
  6.   if (buttonValue > 3012 && buttonValue < 3022) {
  7.     currentPage--;
  8.     buttonFlag = true;
  9.     if (currentPage < 1) {
  10.       currentPage = maxPages;
  11.     }
  12.   } else if (buttonValue > 978 && buttonValue < 988) {
  13.     currentPage++;
  14.     buttonFlag = true;
  15.     if (currentPage > maxPages) {
  16.       currentPage = 1;
  17.     }
  18.   } else {
  19.     buttonFlag = false;
  20.   }
  21. }
复制代码

6、http.get请求子函数。

函数功能说明:如果网络已连接,则从服务器获取电子书内容;否则,重新连接网络。

  1. // 发送GET请求,从服务器上获取电子书内容
  2. void getBookContent(int page) {
  3.   if (WiFi.status() == WL_CONNECTED) {
  4.     HTTPClient http;
  5.     Serial.println(currentPage);
  6.     Serial.println(page);
  7.     Serial.println(ebook_url + "?page=" + page);
  8.     http.begin(ebook_url + "?page=" + page);
  9.     int httpCode = http.GET();
  10.     if (httpCode > 0) {
  11.       Serial.print("HTTP响应代码:");
  12.       Serial.println(httpCode);
  13.       bookContent = http.getString();
  14.       Serial.print("HTTP响应内容:");
  15.       Serial.println(bookContent);
  16.     }else{
  17.       Serial.print("Error Code:");
  18.       Serial.println(httpCode);
  19.       gfx.println("");  
  20.       gfx.print("Error Code:");
  21.       gfx.println(httpCode);   
  22.     }
  23.     http.end();
  24.   }else{
  25.     con_wifi();
  26.   }
  27. }
复制代码

7、更新显示电子书内容子函数。

函数功能说明:重新绘制电子书内容到LCD,并刷新显示。

  1. // 更新显示电子书内容
  2. void showBookContent(){
  3.   // 绘制电子书内容
  4.   gfx.clear();
  5.   gfx.setCursor(0, 0);
  6.   gfx.println(bookContent);
  7.   Serial.println(bookContent);
  8.   
  9.   //更新LCD显示
  10.   gfx.flush();
  11. }
复制代码

8、系统初始化程序。

程序功能说明:初始化LCD,连接wifi,请求与更新电子书内容

  1. void setup() {
  2.   //初始化串口
  3.   Serial.begin(115200);
  4.   
  5.   //初始化LCD
  6.   gfx.init();
  7.   gfx.setTextWrap(true, true);
  8.   gfx.setFont(&fonts::efontCN_16_b);
  9.   gfx.setTextColor(TFT_WHITE, TFT_BLACK);
  10.   gfx.setTextSize(1, 2);
  11.   // 连接wifi
  12.   con_wifi();
  13.   // 请求电子书内容
  14.   getBookContent(currentPage);
  15.   // 更新显示电子书内容
  16.   showBookContent();
  17. }
复制代码

9、主程序

程序功能说明:在loop循环中,ADCKeyScan()函数不断检测按键是否被按下。若按下,则更新页码currentPage,请求电子书内容,并显示。

  1. // 主程序
  2. void loop() {
  3.   // 检测ADC按键并更新页码
  4.   ADCKeyScan();  
  5.   if (buttonFlag == true){
  6.     // 请求电子书内容
  7.     getBookContent(currentPage);
  8.     // 更新显示电子书内容
  9.     showBookContent();
  10.   }
  11.   delay(200);
  12.   
  13. }
复制代码

六、功能展示及说明
1、连接网络界面
图7 网络已连接

2、初始化界面

图8 Arduino IDE下初始化界面


图9 ESP32-S3-BOX-Lite初始化界面


3、向下翻页功能演示

图10 向下翻页Arduino IDE演示


图11 向下翻页ESP32-S3-BOX-Lite演示

4、向上翻页功能演示

图12 向上翻页Arduino IDE演示


图13 向上翻页ESP32-S3-BOX-Lite演示

七、代码相关资源

esp32-s3-box-lite_ebook.rar

2.98 KB, 下载次数: 2392

木子呢  管理员

发表于 2023-8-9 10:39:38

666
回复

使用道具 举报

花生编程  中级技匠

发表于 2023-8-23 21:52:53

厉害厉害
回复

使用道具 举报

花生编程  中级技匠

发表于 2023-8-23 21:53:54

赞赞赞赞赞
回复

使用道具 举报

三春牛-创客  初级技神

发表于 2023-8-24 14:18:19

厉害厉害
回复

使用道具 举报

三春牛-创客  初级技神

发表于 2023-8-24 14:19:21

如果界面好看一点就好了。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail