esp32移植oled-ui-astra项目
前言:本项目的目的是为了在 esp32 平台上移植开源 OLED 项目 oled-ui-astra,详见GitHub - AstraThreshold/oled-ui-astra: A smooth, easy-to-deploy, and easy-to-extend OLED UI framework, based on C++.,并添加旋转编码器 KY-040 实现 UI 界面的简单切换。
尽管笔者已经在本地环境测试没有问题,但是不能保证大家使用后也能正常工作,这里笔者尽量把移植 oled-ui-astra 项目的过程讲清楚,同时把已经测试过没有问题的整体工程放到这里GitHub - Thee24LYJ/oled-ui-astra at esp32,仅供参考。下面正式开始。
1.硬件环境
1.1 硬件设备
esp32 DevKit、7 针 SPI OLED 和旋转编码器 KY-040
1.2 硬件连线
ESP32 采用硬件 SPI 与 OLED 进行通信
| OLED | ESP32 |
|---|---|
| SCLK (CLK)/D0 | GPIO 18 |
| MOSI (DIN)/D1 | GPIO 23 |
| CS (片选) | GPIO 5 (可自定义) |
| DC (数据/命令) | GPIO 16 (可自定义) |
| RES (复位) | GPIO 17 (可自定义,可选接) |
| VCC | 3.3V |
| GND | GND |
| KY-040 | ESP32 |
|---|---|
| CLK | GPIO 4 (可自定义) |
| DT | GPIO 2 (可自定义) |
| VCC/+ | 3.3V |
| GND | GND |
2.部署 oled-ui-astra 项目
官方部署教程:部署教程 ‐ Deployment Tutorial · AstraThreshold/oled-ui-astra Wiki · GitHub
由于笔者使用的开发环境是
VScode+PlatformIO,因此与官方部署教程存在差异
2.1 创建 PlatformIO 工程
这里开发板选择 Espressif ESP32 Dev Module,框架选择 Arduino,工程位置可默认也可自定义

2.2 添加依赖库
在项目工程中的platformio.ini最后添加如下内容,其中olikraus/U8g2@^2.35.4是用于驱动OLED显示屏的u8g2库,madhephaestus/ESP32Encoder@^0.11.7是用于驱动KY-040的ESP32Encoder库
1 | lib_deps = |
2.3 添加 oled-ui-astra 源码到工程中
- 首先,从Release astra UI v0.0.2-alpha · AstraThreshold/oled-ui-astra · GitHub下载
astra-ui-v0-0-2-alpha.zip源码,然后解压放到工程中的lib文件夹中,然后将astra_rocket.h和astra_logo.h移动到include文件夹中,移动astra_rocket.cpp和astra_logo.cpp到src文件夹中,如下图所示

- 然后,修改一些头文件和源文件代码
- 修改
include\astra_logo.h中头文件包含#include "../hal/hal.h"为#include "hal/hal.h" - 修改
include\astra_rocket.h中头文件包含#include "../astra/ui/launcher.h"为#include "astra/ui/launcher.h",修改#include "../hal/hal_dreamCore/hal_dreamCore.h"为#include "my_hal.h" - 修改
lib\astra-ui-v0-0-2-alpha\astra\config\config.h中头文件包含#include "../../hal/hal_dreamCore/components/oled/graph_lib/u8g2/u8g2.h"为#include <U8g2lib.h> - 修改
lib\astra-ui-v0-0-2-alpha\astra\config\config.h中logoTitleFont、logoCopyRightFont、mainFont的字体为u8g2_font_ncenB08_tr(或者其他能显示的字体),如下图所示
- 修改
src\astra_rocket.cpp中astraCoreInit()函数的HAL::inject (new HALDreamCore);为HAL::inject(new MyHAL);
- 修改
- 最后,在
include文件夹中新建子类头文件my_hal.h,在src文件夹中新建子类源文件my_hal.cpp,定义继承自HAL类的子类为MyHAL,具体实现代码如下
1 | // MyHAL.h |
1 | // my_hal.cpp |
2.4 完善 main 函数
1 | // main.cpp |
2.5 编译下载
通过 USB 线将 ESP32 连接到电脑上,点击 upload 编译固件上传到 ESP32 中,按下复位键重启开发板,一切顺利的话,就能够实现【astra UI】v0.0.2-alpha 版本特性演示 - 超容易移植的 一行代码就可以创建的丝滑 OLED UI_哔哩哔哩_bilibili中的丝滑效果
若是下载时遇到无法识别芯片等问题,可能需要手动进入下载模式:
- 拉低 BOOT 引脚(按住开发板的 BOOT 按键)
- 短按 EN/RST 引脚(复位开发板)
- 松开 BOOT 键后立即开始烧录
3.添加旋转编码器到工程中
3.1 添加 OLED 对旋转编码器的响应函数
- 在
lib\astra-ui-v0-0-2-alpha\astra\ui\launcher.h的Launcher类中添加公有成员函数void update(int cnt, bool is_pressed); - 在
lib\astra-ui-v0-0-2-alpha\astra\ui\launcher.cpp中添加该函数的视线,具体代码如下(注意:这里只是简单实现了旋转编码器旋转切换 UI 界面和按下按键进入下一级界面(如果有的话))
1 | void Launcher::update(int cnt, bool is_pressed) |
3.2 完善 main 函数
直接在main.cpp中添加KY-040的初始化代码及旋转和按下按键的简单处理操作,具体代码如下
1 | // main.cpp |
3.3 编译上传
点击upload将修改后的代码编译上传到ESP32中后复位,一切顺利的话应该就能通过旋转编码器切换OLED显示屏上的图标并进入下一级界面(如果有的话)




