HoloCubic_AIO LVGL8.3移植实战:显示、输入与文件系统初始化详解
【免费下载链接】HoloCubic_AIOHoloCubic超多功能AIO固件 基于esp32-arduino的天气时钟、相册、视频播放、桌面投屏、web服务、bilibili粉丝等项目地址: https://gitcode.com/GitHub_Trending/ho/HoloCubic_AIO
HoloCubic_AIO 是一款基于 ESP32 的超多功能 AIO(All-in-One)固件,内置天气时钟、相册、视频播放、桌面投屏、Web 服务和 bilibili 粉丝等应用。本文以新手视角详解其中 LVGL 8.3 的移植流程:如何完成 240×240 屏幕的显示初始化、用 MPU6050 手势作为输入设备,以及 FatFS 文件系统驱动注册,带你快速读懂整个移植骨架。
一、5分钟认识 HoloCubic AIO 固件
HoloCubic 小电视是一块 240×240 的立方体智能屏,固件把"小电视"装进了一个 ESP32 开发板里。它的 UI 层完全由LVGL 8.3驱动,配合三大硬件外设:
| 外设 | 角色 | 关键文件 |
|---|---|---|
| ST7789 TFT 屏幕 | 显示输出 | display.cpp |
| MPU6050 六轴传感器 | 手势/编码器输入 | imu.h |
| microSD 卡 | 图片、天气图标、视频素材 | lv_fs_fatfs.c |
固件源码采用 PlatformIO 工程组织,LVGL 8.3 完整源码以库形式放在 lib/lvgl-v8.3/,屏幕驱动基于 TFT_eSPI 库,IMU 驱动基于 MPU6050 库。
二、显示初始化:从背光 PWM 到 lv_disp_drv_register
显示部分是整个移植的"门面",核心逻辑集中在 display.cpp 的Display::init()中,流程分为五步:
- 背光控制:用 LEDC 硬件 PWM(5kHz)驱动背光引脚,先把亮度压到 0,避免初始化时出现"花屏";
- LVGL 启动:调用
lv_init(); - 屏幕驱动启动:
tft->begin()初始化 ST7789,发送开屏指令并设置旋转方向(加棱镜需要镜像,可通过设置项调整); - 注册刷新回调:分配 240×80 像素的绘制缓冲区(draw buffer),把
my_disp_flush设为刷新回调——LVGL 渲染完一块区域后,回调里用tft->pushColors()把像素推给屏幕,再调用lv_disp_flush_ready()通知 LVGL; - 注册显示驱动:通过
lv_disp_drv_register()把分辨率、缓冲区、回调一次性交给 LVGL。
之后每次主循环调用Display::routine(),实际执行的就是加锁后的lv_timer_handler(),让 LVGL 的定时器、动画、刷新持续运转。锁机制定义在 common.h 的AIO_LVGL_OPERATE_LOCK宏中,防止多任务并发访问 LVGL 产生脏数据。
💡 移植提示:如果你的硬件不是 TFT_eSPI 支持的屏,可以把 common.h 中的GFX宏改为 1,切换到 Arduino_GFX 驱动路径。
三、输入初始化:MPU6050 手势变身 LVGL 编码器
这块小电视没有触摸屏,"点按"全靠甩一甩。移植时把 MPU6050 的动作数据"翻译"成 LVGL 的编码器输入:
- lv_port_indev.c 定义了
encoder_read()回调,每次 LVGL 查询输入时读取全局变量encoder_diff(转动步数)和encoder_state(按下/抬起); - imu.h 中的 IMU 类负责解析 MPU6050 数据,识别出左转、右转、上滑、下滑、前进、摇晃、返回等动作,再写入
encoder_diff/encoder_state; - 主入口 HoloCubic_AIO.cpp 的
setup()里先显示一次界面、再初始化 IMU(mpu.init()比较耗时),并用一个 200ms 硬件定时器周期性触发mpu.getAction()采样动作,兼顾开机速度与输入灵敏度。
这种"IMU 写变量 → LVGL 回调读变量"的解耦方式,是移植无屏显输入设备时的经典套路。
四、文件系统初始化:注册 FatFS 的 'S:' 盘符
LVGL 要显示图片、播放素材,必须有文件系统。本工程采用双存储方案:
- SPIFFS(Flash):存放配置数据,
setup()里SPIFFS.begin(true)挂载,失败则直接停止; - FatFS(SD 卡):存放素材文件,由 lv_fs_fatfs.c 把 FatFS 的
f_open / f_read / f_lseek / f_readdir等函数逐一包装成 LVGL 的文件系统回调,并以盘符S注册,此后 LVGL 中打开S:/weather/Sunny_100.bin这样的路径即可。
SD 卡里放什么?仓库根目录的 放置到内存卡/ 就是完整的素材清单:天气图标、图片、mjpeg 视频、表情包等,复制进 SD 卡即可让各 APP 正常工作。
五、编译烧录:PlatformIO 一键搞定
工程配置见 platformio.ini,几个关键项:
- 平台:
espressif32 @ ~3.5.0,框架 Arduino,开发板pico32; - 分区表:partitions-no-ota.csv(关闭 OTA,预留空间给 SPIFFS);
- 默认环境为
HoloCubic_AIO_Releases,另提供HoloCubic_AIO_Debug调试环境(-O0 + 日志)。
除 PlatformIO 命令行/IDE 外,也可用仓库自带的 AIO_Tool/ PC 图形工具完成刷机和资源管理;想先跑起来再改代码的话,还可以参考 lv_simulater_platformio/ 在 PC 上用 SDL2 模拟器直接预览 LVGL 界面。
六、移植清单:照抄这 6 步
把这套流程搬到自己项目上,按顺序完成即可:
- ✅ 引入 LVGL 8.3 源码并裁剪
lv_conf.h; - ✅ 用屏幕库初始化 TFT,写一个
flush_cb把像素推给屏幕并调用lv_disp_flush_ready; - ✅ 调用
lv_disp_draw_buf_init()+lv_disp_drv_register()注册显示; - ✅ 准备输入设备(触摸/编码器/手势),实现
read_cb回调并注册lv_indev_drv; - ✅ 把存储设备(SD 卡/NVS)封装成
lv_fs_drv回调并注册盘符; - ✅ 在主循环中周期性执行
lv_timer_handler(),必要时加互斥锁。
按这份清单走完,你就拥有了 HoloCubic_AIO 同款"显示 + 输入 + 文件"三件套,剩下的就是像它一样把天气、相册、视频一个个 APP"安装"进控制器了 🎉
【免费下载链接】HoloCubic_AIOHoloCubic超多功能AIO固件 基于esp32-arduino的天气时钟、相册、视频播放、桌面投屏、web服务、bilibili粉丝等项目地址: https://gitcode.com/GitHub_Trending/ho/HoloCubic_AIO
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考