Funpack2-5 基于ESP32在线电子书浏览器
使用ESP32 S3lite开发的ESP32在线电子书浏览器
标签
Arduino
Funpack活动
ST7789
ESP32S3
ESP32 Lite BOX
HTTP
llzx
更新2023-08-04
635

1.简介

      基于ESP32-S3-BOX-Lite所开发的一款电子书阅读器,通过WiFi连接网络,获取小说网站的HTML文本内容,将文本内容显示在LCD屏幕上,通过按键可以实现上下翻页的功能。软件所用的平台是ARDUINO,有着丰富的开源资料,并且乐鑫官方也推出了ARDUINO的官方驱动和例程,开发十分方便快捷。

      ESP32-S3 是乐鑫发布的一款集成  Wi-Fi 和 蓝牙的 MCU ,ESP32-S3 搭载 Xtensa® 32 位 LX7 双核处理器,主频高达 240 MHz,内置 512 KB SRAM (TCM),具有 45 个可编程 GPIO 管脚和丰富的通信接口。ESP32-S3 支持更大容量的高速 Octal SPI flash 和片外 RAM,支持用户配置数据缓存与指令缓存。这款lite BOX除了ROM还带有扩展RAM对于音频等应用可以实现更加复杂的功能,这里获取的HTML文本由于体积不大,约20K的内存即可存储,因此暂未用到扩展RAM。

      这次用到的硬件如下

      LCD 320*240控制器ST7789

      按键

      主控ESP32 S3

2.设计思路

      使用ESP32 Lite Box的WiFi功能,通过Arduino编程,获取小说网站的文本内容,显示到屏幕上,实现一个在线小说阅读器的功能。通过对网页内容的分析如下图,只需要获取第一个Html的内容,通过浏览器查看响应内容,大约20到30K的字符串数据,由于不需要显示图片,对于ESP32 S3,使用片内内存可以存储小说一章的内容,不需要通过外部扩展ram即可实现功能。通过Arduino的http函数获取到文本数据后,如下只需要解析段落<P>内的内容即可,使用Arduino平台,选择合适的屏幕和图形库来显示小说内容,这里用到的是Adafruit GFX库,实现小说文本的显示和翻页功能。使用按键切换,实现上下翻页的功能,这里按键根据电路图分析,是通过1个IO,利用ADC获取按键按下的信息。

FlfYDcPp1xPOfAgtI27ty_F7wz3M

 

3.软件流程图

      软件流程图如下,初始化完成连接到wifi后,会通过http库获取网站的网页内容,将数据存储到内存中,当按键按下时对内容重新解析显示不同位置的数据,实现翻页显示功能。这里第一次获取到数据后会先显示第一页功能,主循环中不断检测按键是否按下,后面的页面只有当按键按下时才会重新计算显示。

FjGSOP8EJ9M4i7CxESD9F4LIBCIz

4.原理图

      LCD屏幕原理图,引脚定义如下,后面的程序需要根据以下引脚顺序配置。LCD的控制器是ST7789,后面根据LCD可以自行选择合适的库驱动。FjZI7WLrub-GwbxIuTKm8UfVwDv7

      按键原理图如下,连接到1号IO口。按键是通过ADC读取的方式,获取每个引脚按下的信息,不同按键的分压电阻设置不一样,从官方的原理图可以看出,对应的电压分别为0.82 1.98 2.41V的电压,这里直接将读取的电压和原理图中给出数值对比即可确定是哪一个按键按下。

FiLGQjEW_aWRvl8H8GVrhKZbgCdUFknnh7Rza6dGmU4_s1vR8pJ6VXTx5.程序

5.1 LCD驱动函数

      LCD的库使用<Adafruit_ST7789.h>,这个库在ARDUINO中有着十分广泛的应用,很多屏幕可以使用这个库来驱动,设置好相应的参数即可完成初始化,初始化的函数如下。

      分辨率和引脚需要按照电路图给出引脚修改。

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library for ST7735
#include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
#include <SPI.h>
  #define TFT_CS         5
  #define TFT_RST        48
  #define TFT_DC         4
 #define TFT_MOSI 6 //数据输出
 #define TFT_SCLK 7 //时钟输出
 #define TFT_CTRL     45
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_MOSI, TFT_SCLK, TFT_RST);
  tft.init(240, 320);

5.2 LCD字符设置函数

      LCD字符打印可以通过自带的函数去设定字体大小,样式等内容,由于不带中文字库,这里例程用的是英文小说的网页,因此可以直接通过例程的函数打印,初始化和输出函数如下。

      printf函数可以很方便的在每次输出后,自动设置坐标实现自动换行,排版十分便捷。这里设置为白色背景,黑色2号字体。字体打印时需要设定坐标。

tft.fillScreen(ST77XX_WHITE);
  tft.setTextWrap(false);
  tft.setCursor(0, 30);
  tft.setTextColor(ST77XX_BLACK);
  tft.setTextSize(2);
  tft.setCursor(10, 10);

5.3 按键输入函数

      按键是通过1号引脚去读取电压值,设置1号引脚的ADC为12位的模式,通过内置函数可以直接将电压转换为毫伏,读取电压和初始化函数如下

 analogReadResolution(12);
int analogVolts = analogReadMilliVolts(1);

5.4 Wifi初始化函数

         通过配置SSID和password即可完成对wifi的初始化。使板卡连接到网络。

#include <WiFi.h>
const char* ssid     = "MERCURY_3BE8";     // WIFI账户
const char* password = "asdf1245"; // WIFI密码
WiFi.begin(ssid, password);
    for(uint8_t t = 4; t > 0; t--) {
        Serial.printf("[SETUP] WAIT %d...\n", t);
        Serial.flush();
        delay(1000);
        }
  analogReadResolution(12);
    while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    // wait 1 second for re-trying
    delay(1000);
  }

5.5HTTP函数

      正确连接到wifi后即可通过HTTP函数连接到网站,通过HTTP get的方式获取网页的文本内容,存储到string的字符串中,后面通过对字符串的处理,即可显示文本内容在屏幕上。

      这里需要注意配置UserAgent的内容,可以从浏览器中负责,否则不能返回HTML数据。

HTTPClient http;
    Serial.print("[HTTP] begin...\n");
    http.begin("https://www.ppzuowen.com/book/en/wangerdedeshiyingwenban/534113.html"); //访问服务器地址https://www.ppzuowen.com/book/en/wangerdedeshiyingwenban/534113.html
    http.setUserAgent("Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36");
    Serial.print("[HTTP] GET...\n");
    // start connection and send HTTP header
    int httpCode = http.GET();
    // httpCode will be negative on error
     if(httpCode > 0) {
     // HTTP header has been send and Server response header has been handled
     Serial.printf("[HTTP] GET... code: %d\n", httpCode);
    // file found at server
            if(httpCode == HTTP_CODE_OK) {
                String payload = http.getString();
                tx.payload=payload;
            }
        } else {
            Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
        }
        http.end();   

6.调试和功能演示

6.1按键调试

      先通过串口打印按键的电压值,根据原理图对比,即可对按键判定划分范围。可以看到按键按下后输入的电压和官方的计算结果基本一致

FiKSRip23rf9rqdP9bJ6QA-YTto9

6.2网页内容获取

      使用chrome浏览器对网页的header头和内容分析,获取相应的参数后对程序进行修改。从这里可以获取useragent信息,通过连接和这个参数即可获取到全部文本内容,网页基于UTF8,所以英文部分不需要字符库即可读取。

FoaoIVV4pDIo-KzwXSaaZbXQgrQL

6.3实物调试

      以上准备后还需要对内容进行排版和翻页的设定和逻辑部分编写。最终实现的效果如下

FlMI0ruAWr8fZIL3unF9Ep9KmbFT

7.总结

      arduino虽然有很多的库可以直接使用,但是编写过程中,有些例程参考文档并不完善,这里推荐使用platformio来开发。我是根据Platformio来获取函数的定义逐步完成此次设计,但是由于不熟悉,编译和程序还是通过官方IED完成。

 

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