机器人设计与应用综合实训——ESP32开发技术分享(文字也图片结合设计页面,GIF动图显示)
本文为机器人设计与应用综合实训中,基于ESP32的开发技术分享帖,主要记录实训过程中的ESP32开发要点、问题排查及实践总结,表格部分留空供同学们根据自身实训情况填写,适配实训报告补充、技术复盘及同学间交流使用。服务机器人(如展厅导览、餐饮机器人)需要展示动态提示(如 “请扫码”“正在送餐”)、表情动画(如开心、抱歉),或工业机器人展示工作状态(如 “运行中”“故障预警”)。按实训流程,记录从环境
本文为机器人设计与应用综合实训中,基于ESP32的开发技术分享帖,主要记录实训过程中的ESP32开发要点、问题排查及实践总结,表格部分留空供同学们根据自身实训情况填写,适配实训报告补充、技术复盘及同学间交流使用。
核心方向:ESP32芯片基础应用、机器人控制模块开发、传感器数据交互、代码调试与优化,贴合实训核心需求,兼顾技术细节与实操记录。
一、实训基础信息
|
实训项目名称 |
实训时间 |
ESP32开发板型号 |
开发环境 |
实训小组人数 |
|
ESP32文字及图片显示结合 |
3月11日 |
ESP32-S3 |
VSCode ESP-IDF |
1 |
二、ESP32开发核心知识点梳理
本部分记录实训中涉及的ESP32核心技术点,包括引脚配置、外设驱动、通信协议等,结合机器人设计场景补充细节。
|
知识点类别 |
具体知识点 |
核心原理简述 |
实训应用场景 (机器人相关) |
备注 (易错点/重点) |
|
图片显示 |
将想要显示的图片于LCD显示 |
将图像分解为像素点阵,通过通信接口将每个像素的颜色数据按坐标发送至液晶显示屏,驱动液晶分子改变透光率,从而在屏幕上组合并还原出完整的图像。 |
机器人显示图片,表情包,动图等。 |
图片是否放置在正确的项目工程。 |
|
文字显示 |
在LCD屏幕显示文字 |
将一块区域看成整体(汉字16*16,字符8*16),在这块区域上设置字体颜色和背景色,由字体色组合出想要的文字。 |
机器人LCD显示文字进行与外界交互。 |
调节文字大小及行间距。 |
|
GIF表情包显示 |
将GIF图片分离后显示在屏幕上 |
按文件结构解析出每一帧图像数据,再按帧延迟时间依次渲染,本质是 “多帧静态图 + 时间控制” 的幻灯片式播放。 |
服务机器人(如展厅导览、餐饮机器人)需要展示动态提示(如 “请扫码”“正在送餐”)、表情动画(如开心、抱歉),或工业机器人展示工作状态(如 “运行中”“故障预警”)。 |
帧数过大导致显示不出结果 |
三、ESP32机器人开发实操步骤
按实训流程,记录从环境搭建到机器人功能实现的完整步骤,重点填写ESP32相关操作,明确每一步的核心操作与目的。
|
步骤序号 |
实操内容 (ESP32相关) |
操作步骤细节 |
使用工具/代码片段 |
操作结果 (成功/失败及原因) |
|
1 |
放大已显示的字体 |
将点阵及索引放大到规定大小后修改代码 |
LCD_ShowString(60,40,"123418",BLACK,WHITE); |
成功 |
|
2 |
动态显示 |
一.进入SDK配置界面;二.输入FreeRTOS;.三.设置1000HZ的时钟频率;四.保存设置 |
#ifndef __TIMER_H_ #define __TIMER_H_ #include <stdio.h> #include <string.h> #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "LCD.h" #include <time.h> #include "esp_timer.h" #include "esp_sntp.h" extern time_t timer_sec; extern struct tm timeinfo; void ESP_Timer_Init(void); void ESP_Network_Init(void); #endif |
成功 |
|
GIF图片显示 |
使用GIF工具进行图片帧数大小的转换与分离后修改显示代码 |
GIF Resize GIF2BMP |
成功 |
四、ESP32开发常见问题及解决方案
记录实训过程中遇到的ESP32开发相关问题(如烧录失败、外设通信异常、代码报错等),填写解决方案与总结,便于后续复盘和同学参考。
|
问题序号 |
问题描述(ESP32相关) |
排查过程 |
解决方案 |
问题总结(避免方法) |
|
1 |
代码运行出现错误强制退出 |
查看源代码错误,避免因系统未重新加载报错 |
重新进入程序,先修改代码后运行 |
详细排除代码,避免未保存丢失 |
|
2 |
编译器找不到Timer.h文件 |
确定文件实际位置 |
修改代码中#include的路径 |
必须先确认 Timer.h 的实际位置,否则路径修改无意义。 |
|
分离GIF后图片源文件后缀没有出现.h |
试图转换 |
使用工具将.c转化为.h |
明确源文件 |
五、实训总结与ESP32开发心得
|
项目完成情况 |
ESP32开发重点收获 |
存在的不足 |
后续改进计划 |
|
屏幕图片,文字及动态时钟显示结合 |
理解图片像素点的应用,修改图片尺寸编写代码,完成屏幕图片显示。通过取模,编写显示文字代码完成文字大小调节与显示 |
代码烧录出现报错,软件运行路径不匹配 |
更换路径,修改代码学习使用网络显示 |
- 代码附录
作业代码:
/*
* 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 "hhh.c"
extern const unsigned char gImage_hhh[];//引入图片
void app_main(void)
{
bsp_i2c_init();
pca9557_init();
bsp_lcd_init();
lcd_set_color(0x1F00);
lcd_draw_pictrue(0,0,gImage_hhh);
LCD_ShowString(60,20,"23机器1班磨俊团",BLACK,WHITE);
LCD_ShowString(60,40,"1234160118",BLACK,WHITE);
LCD_ShowString(0,0,"Have a good day",RED,WHITE);
LCD_ShowString32(40,200,"1234160118",GREEN,WHITE);
while(1){
vTaskDelay(100);
}
}
字体放大代码:
void LCD_ShowString(int x,int y, char *p, uint16_t fc, uint16_t bc)
{
while(*p!='\0'){
if(*p<0x80){
lcd_draw_char(x,y,*p,fc,bc);//写完一个字
x+=8;//往下一个偏移,x偏移一个字体大小位置
p++;//字符地址偏移,指向下一个字符
}else{
lcd_draw_hz(x,y,p,fc,bc);//写完一个字
x+=16; //往下一个偏移,x偏移一个字体大小位置
p+=3; //汉字地址偏移,指向下一个汉字
}
}
}
void lcd_draw_hz22(int x_start, int y_start, char *pHz, uint16_t fc, uint16_t bc)
{
// 分配内存 分配了需要的字节大小 且指定在外部SPIRAM中分配
size_t pixels_byte_size = 24 * 22 * 2;
uint16_t *pixels = (uint16_t *)heap_caps_malloc(pixels_byte_size, MALLOC_CAP_8BIT | MALLOC_CAP_SPIRAM);
if (NULL == pixels){
ESP_LOGE(TAG, "Memory for char is not enough");
return;
}
if((*pHz<0x80)||(*(pHz+1)<0x80)) return;
char tmpHz[4] = {0};
memcpy(tmpHz, pHz, 3);
for (int i=0;i<(sizeof(tHz22)/sizeof(typFNT_GB22));i++){
if(0==strcmp(tmpHz, tHz22[i].Hz)){
for(int m=0;m<66;m++){
uint8_t MskCh = tHz22[i].Msk[m];
for(int n=0;n<8;n++){
if(MskCh&(0x01<<n)) pixels[m*8+n] = fc;
else pixels[m*8+n] = bc;
}
}
}
}
esp_lcd_panel_draw_bitmap(panel_handle, x_start, y_start, x_start+24, y_start+22, (uint16_t *)pixels); // 显示一个汉字数据
heap_caps_free(pixels); // 释放内存
}
typedef struct {
char Hz[4]; // 存放汉字索引
unsigned char Msk[120]; // 字模
}typFNT_GB30;
GIF显示代码:
/*
* 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 "hhh.c"
#include "Timer.h"
#include "IMG00000.h"
#include "IMG00001.h"
#include "IMG00002.h"
#include "IMG00003.h"
#include "IMG00004.h"
#include "IMG00005.h"
#include "IMG00006.h"
#include "IMG00007.h"
unsigned char *images[]={
gImage_IMG00000,
gImage_IMG00001,
gImage_IMG00002,
gImage_IMG00003,
gImage_IMG00004,
gImage_IMG00005,
gImage_IMG00006,
gImage_IMG00007,
};
// extern const unsigned char gImage_hhh[];//引入图片
void app_main(void)
{
int sec = 0;
char str[20]={0};
bsp_i2c_init();
pca9557_init();
bsp_lcd_init();
while(1){
for(uint8_t i=0;i<=5;i++){
lcd_draw_pictrue(0,0,images[i]);
vTaskDelay(100);
}
vTaskDelay(1);
}
}
DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐


所有评论(0)