日期:2026年3月9日
本文为机器人设计与应用综合实训中,基于ESP32的开发技术分享帖,主要记录实训过程中的ESP32开发要点、问题排查及实践总结,表格部分留空供同学们根据自身实训情况填写,适配实训报告补充、技术复盘及同学间交流使用。
核心方向:ESP32芯片基础应用、机器人控制模块开发、传感器数据交互、代码调试与优化,贴合实训核心需求,兼顾技术细节与实操记录。
一、实训基础信息
|
实训项目名称 |
实训时间 |
ESP32开发板型号 |
开发环境 |
实训小组人数 |
|
ESP32与LVGL应用 |
3月12日 |
ESP32-S3 |
VSCode ESP-IDF |
1 |
二、ESP32开发核心知识点梳理
本部分记录实训中涉及的ESP32核心技术点,包括引脚配置、外设驱动、通信协议等,结合机器人设计场景补充细节。
|
知识点类别 |
具体知识点 |
核心原理简述 |
实训应用场景 (机器人相关) |
备注 (易错点/重点) |
|
图片显示 |
将想要显示的图片于LCD显示 |
将图像分解为像素点阵,通过通信接口将每个像素的颜色数据按坐标发送至液晶显示屏,驱动液晶分子改变透光率,从而在屏幕上组合并还原出完整的图像。 |
机器人显示图片,表情包,动图等。 |
图片是否放置在正确的项目工程。 |
|
文字显示 |
在LCD屏幕显示文字 |
将一块区域看成整体(汉字16*16,字符8*16),在这块区域上设置字体颜色和背景色,由字体色组合出想要的文字。 |
机器人LCD显示文字进行与外界交互。 |
调节文字大小及行间距。 |
|
GIF表情包显示 |
将GIF图片分离后显示在屏幕上 |
按文件结构解析出每一帧图像数据,再按帧延迟时间依次渲染,本质是 “多帧静态图 + 时间控制” 的幻灯片式播放。 |
服务机器人(如展厅导览、餐饮机器人)需要展示动态提示(如 “请扫码”“正在送餐”)、表情动画(如开心、抱歉),或工业机器人展示工作状态(如 “运行中”“故障预警”)。 |
帧数过大导致显示不出结果 |
三、ESP32机器人开发实操步骤
按实训流程,记录从环境搭建到机器人功能实现的完整步骤,重点填写ESP32相关操作,明确每一步的核心操作与目的。
|
步骤序号 |
实操内容 (ESP32相关) |
操作步骤细节 |
使用工具/代码片段 |
操作结果 (成功/失败及原因) |
|
1 |
LVGL移植 |
准备工程;拉取组件;添加LVGL相关代码;添加LVGL设置 |
lvgl/lvgl: ^9.4.0 espressif/esp_lvgl_port: ^2.6.3 espressif/esp_lcd_touch_ft5x06: ^1.0.6 # 触摸屏驱动
|
成功 |
|
2 |
页面设计 |
打开文本显示网站;找到需要相关代码;尝试编译代码是否可用 |
http://lvgl.100ask.net/9.2/ |
成功 |
|
|
|
|
|
|
四、ESP32开发常见问题及解决方案
记录实训过程中遇到的ESP32开发相关问题(如烧录失败、外设通信异常、代码报错等),填写解决方案与总结,便于后续复盘和同学参考。
|
问题序号 |
问题描述(ESP32相关) |
排查过程 |
解决方案 |
问题总结(避免方法) |
|
1 |
LVGL移植准备工程出现错误 |
检测工程是否可用 |
不可用即修改工程 |
移植前应先详细检查 |
|
2 |
添加LVGL代码过程出现报错 |
确实代码运行路径是否正确 |
修改路径,不断检测 |
确定SKD是否修改 |
|
3 |
页面设计过程出现混乱排版 |
查看代码是否正确 |
如果代码正确还无法运行,尝试添加新代码 |
页面设计代码运行过程容易出现问题,需不断修改,尝试。 |
五、实训总结与ESP32开发心得
|
项目完成情况 |
ESP32开发重点收获 |
存在的不足 |
后续改进计划 |
|
设计页面 |
了解LVGL是一个开源的嵌入式图形库,专为资源受限的微控制器和小型设备设计,用于创建美观、响应迅速的图形用户界面。 |
LVGL显示应用代码出现错误 |
更换路径,修改代码 |
- 代码附录
页面设计代码:
/*
* SPDX-FileCopyrightText: 2010-2022 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: CC0-1.0
*/
#include <stdio.h>
#include <inttypes.h>
#include "sdkconfig.h"
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_chip_info.h"
#include "esp_flash.h"
#include "esp_system.h"
#include "LCD/LCD.h"
#include "Timer.h"
#include "demos/lv_demos.h"
static void event_handler(lv_event_t * e)
{
}
void lv_example_demo(void)
{
lv_obj_t * label;
label = lv_label_create(lv_scr_act());
lv_label_set_text(label, "login interface");
lv_obj_set_width(label, 240);
lv_obj_set_height(label, 30);
lv_obj_set_x(label, 40);
lv_obj_set_y(label, 10);
lv_obj_t *textarea = lv_textarea_create(lv_scr_act());
lv_textarea_set_placeholder_text(textarea, "Please enter your account number.");
lv_textarea_set_one_line(textarea, true); // 单行模式
lv_obj_set_size(textarea, 240, 40);
lv_obj_set_x(textarea, 40);
lv_obj_set_y(textarea, 60);
// 密码输入框
lv_obj_t *textarea1 = lv_textarea_create(lv_scr_act());
lv_textarea_set_placeholder_text(textarea1, "Please enter your password.");
lv_textarea_set_one_line(textarea1, true); // 单行模式
lv_obj_set_size(textarea1, 240, 40);
lv_obj_set_x(textarea1, 40);
lv_obj_set_y(textarea1, 100);
// lv_obj_set_flex_flow(lv_screen_active(), LV_FLEX_FLOW_COLUMN);
// lv_obj_set_flex_align(lv_screen_active(), LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER);
lv_obj_t * cb_container = lv_obj_create(lv_screen_active());
lv_obj_set_style_bg_opa(cb_container, LV_OPA_TRANSP, LV_PART_MAIN); // 透明背景
lv_obj_set_style_border_opa(cb_container, LV_OPA_TRANSP, LV_PART_MAIN); // 无边框
lv_obj_set_flex_flow(cb_container, LV_FLEX_FLOW_ROW); // 横向布局
lv_obj_set_flex_align(cb_container, LV_FLEX_ALIGN_SPACE_EVENLY, // 水平均匀分布
LV_FLEX_ALIGN_CENTER, // 垂直居中
LV_FLEX_ALIGN_CENTER);
lv_obj_set_size(cb_container, lv_obj_get_width(lv_screen_active()) – 40, 30); // 适配屏幕宽度
// 第一个复选框(放入容器中)
lv_obj_t * cb;
cb = lv_checkbox_create(cb_container); // 父对象改为容器,不再是lv_screen_active()
lv_checkbox_set_text(cb, "Save");
lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL);
// 第二个复选框(放入容器中)
cb = lv_checkbox_create(cb_container); // 父对象改为容器,不再是lv_screen_active()
lv_checkbox_set_text(cb, "Auto");
lv_obj_add_state(cb, LV_STATE_CHECKED);
lv_obj_add_event_cb(cb, event_handler, LV_EVENT_ALL, NULL);
lv_obj_update_layout(cb);
lv_obj_t * btn1 = lv_button_create(lv_screen_active());
lv_obj_add_event_cb(btn1, event_handler, LV_EVENT_ALL, NULL);
// lv_obj_align(btn1, LV_ALIGN_CENTER, 0, -40);
lv_obj_remove_flag(btn1, LV_OBJ_FLAG_PRESS_LOCK);
lv_obj_set_width(btn1, 240);
lv_obj_set_height(btn1, 24);
lv_obj_set_x(btn1, 40);
lv_obj_set_y(btn1, 180);
label = lv_label_create(btn1);
lv_label_set_text(label, "login");
lv_obj_center(label);
lv_obj_t * btn2 = lv_button_create(lv_screen_active());
lv_obj_add_event_cb(btn2, event_handler, LV_EVENT_ALL, NULL);
// lv_obj_align(btn2, LV_ALIGN_CENTER, 0, 40);
lv_obj_add_flag(btn2, LV_OBJ_FLAG_CHECKABLE);
lv_obj_set_width(btn2, 240);
lv_obj_set_height(btn2, 24);
lv_obj_set_x(btn2, 40);
lv_obj_set_y(btn2, 210);
label = lv_label_create(btn2);
lv_label_set_text(label, "Toggle");
lv_obj_center(label);
}
void app_main(void)
{
bsp_i2c_init();
pca9557_init();
// bsp_lcd_init();
// ESP_Timer_Init();
bsp_lvgl_start();
lv_example_demo();
while(1){
vTaskDelay(10);
}
}





