本文为机器人设计与应用综合实训中,基于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

成功

4

GIF图片显示

使用GIF工具进行图片帧数大小的转换与分离后修改显示代码

GIF Resize

GIF2BMP

成功

四、ESP32开发常见问题及解决方案

记录实训过程中遇到的ESP32开发相关问题(如烧录失败、外设通信异常、代码报错等),填写解决方案与总结,便于后续复盘和同学参考。

问题序号

问题描述(ESP32相关)

排查过程

解决方案

问题总结(避免方法)

1

代码运行出现错误强制退出

查看源代码错误,避免因系统未重新加载报错

重新进入程序,先修改代码后运行

详细排除代码,避免未保存丢失

2

编译器找不到Timer.h文件

确定文件实际位置

修改代码中#include的路径

必须先确认 Timer.h 的实际位置,否则路径修改无意义。

3

分离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);

    }

}

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐