ESP32-C3-LCD-0.71 是一款支持 2.4GHz WiFi 和蓝牙 BLE 5 的微控制器开发板。板载 0.71 英寸 LCD 屏,可流畅运行 LVGL 等 GUI 界面程序;结合多种外设接口,可快速开发基于 ESP32-C3 的低功耗 AI 仿真眼睛,手表等 HMI 应用
MCU | ESP32-C3FH4 | 显示尺寸 | 0.71 inch |
---|---|---|---|
工作电压 | 3.3V | 显示分辨率 | 160 × 160 |
背光电流 | 20mA | 显示面板 | IPS |
显示接口 | 4 线 SPI | 驱动 IC | GC9D01 |
产品尺寸 | 20.12×22.3×1.81 (H×V×D) (mm) | 亮度 | 350 cd/㎡ (典型值) |
1、RESET 复位按键 2、BOOT 按键 3、ESP32-C3FH4 处理器 4、2.4G 陶瓷天线 | 5、ME6217C33M5G 6、PL4054 7、USB Type-C 接口 |
TFT_MOSI | GPIO7 |
---|---|
TFT_SCLK | GPIO6 |
TFT_CS | GPIO5 |
TFT_DC | GPIO4 |
TFT_RST | GPIO8 |
ESP32-C3-LCD-0.71 目前提供 Arduino IDE 开发工具和框架,提供了灵活的开发选择,你可以根据项目需求和个人习惯选择适合的开发工具
本章介绍 Arduino 环境搭建,包括 Arduino IDE、ESP32板管理、相关库的安装,程序编译下载及示例程序测试,帮助用户掌握开发板,便于二次开发
https://espressif.github.io/arduino-esp32/package_esp32_index.json
板名称 | 板安装要求 | 版本号要求 |
---|---|---|
esp32 by Espressif Systems | “离线”安装/“在线”安装 | 2.0.13 |
库名称 | 说明 | 库安装要求 |
---|---|---|
TFT_eSPI | LCD驱动库 | “离线”安装 |
LVGL | LVGL库 | “离线”安装 |
lv_conf.h | LVGL配置文件 | “离线”安装 |
示例程序 | 说明 | 依赖库 |
---|---|---|
01_Text_and_Number_Display | 文字和数字显示 | TFT_eSPI |
02_Shapes_on_Circular_Display | 画图 | TFT_eSPI |
03_Animated_Eye1 | 仿真眼睛样式1 | TFT_eSPI |
04_Animated_Eye2 | 仿真眼睛样式2 | TFT_eSPI |
05_Animated_Eye12 | 仿真眼睛样式1和样式2,交替显示 | TFT_eSPI |
06_Image_Display | 显示图片 | TFT_eSPI 和 LVGL |
07_Clock | 时钟 | TFT_eSPI 和 LVGL |
【程序说明】
【硬件连接】
【代码分析】
setup
函数在程序启动时执行一次,主要负责初始化 TFT 显示屏并进行一些初始设置tft.init();
初始化 TFT 显示屏,为后续的显示操作做好准备tft.fillScreen()
和delay()
实现颜色过渡效果,展示了 TFT 显示屏的颜色填充功能,增加程序启动的视觉吸引力tft.fillScreen(0x04FF);
设置特定的背景颜色,tft.setTextColor(TFT_WHITE, 0x04FF);
设置文本颜色,确保文本在背景下清晰可见tft.drawString("Hello, Waveshare!", 30, 40, 2);
显示欢迎消息,增强用户体验loop
函数在程序运行过程中不断循环,实现核心的数字显示功能置number
转换为字符串displayNumber
,并在数字为一位时添加前导零,确保两位数显示tft.drawString(displayNumber, 55, 80, 6);
在显示屏特定位置以特定字体大小显示格式化后的数字number++
实现数字自增,当number
超过 99 时重置为 0,保证数字在 00 到 99 之间循环delay(1000)
控制数字更新速度,让用户能够清晰地看到数字变化【代码烧录】
【运行效果】
【程序说明】
【硬件连接】
【代码分析】
uint16_t squareColor = tft.color565(random(0, 255), random(0, 255), random(0, 255));
生成一个随机的 RGB565 颜色,确保每次绘制的正方形颜色不同tft.fillRect(squareTopLeftX, squareTopLeftY, squareSize, squareSize, squareColor);
使用随机颜色填充正方形triangleX
和triangleY
数组中tft.fillTriangle(triangleX[0], triangleY[0], triangleX[1], triangleY[1], triangleX[2], triangleY[2], triangleColor);
使用随机颜色填充三角形tft.fillCircle(centerX, centerY, 30, circleColor);
以屏幕中心坐标和固定半径绘制圆形并使用随机颜色填充【代码烧录】
【运行效果】
【程序说明】
【硬件连接】
【代码分析】
LIGHT_PIN
来决定虹膜大小的更新方式。int16_t v = analogRead(LIGHT_PIN);
读取光感引脚的模拟值。LIGHT_PIN_FLIP
等配置进行必要的反转操作(#ifdef LIGHT_PIN_FLIP
部分)。if (v < LIGHT_MIN) v = LIGHT_MIN; else if (v > LIGHT_MAX) v = LIGHT_MAX;
),确保光感值在合理范围内。v = map(v, 0, (LIGHT_MAX - LIGHT_MIN), IRIS_MAX, IRIS_MIN);
)。LIGHT_CURVE
应用伽马曲线调整光感值(#ifdef LIGHT_CURVE
部分)。IRIS_SMOOTH
,选择平滑处理(滤波方式逐渐调整虹膜大小)或直接设置虹膜大小。newIris = random(IRIS_MIN, IRIS_MAX);
生成随机的新虹膜大小。split(oldIris, newIris, micros(), 10000000L, IRIS_MAX - IRIS_MIN);
函数,通过递归方式实现虹膜大小从旧值到新值的逐渐变化,并更新oldIris
为新值digitalWrite(device_A_CS, LOW);
将设备 A 的片选引脚置低,选择对应的设备或显示屏。tft.pushImage(0, 0, 160, 160, gImage_Ax);
来将特定的图像(如gImage_A1
到gImage_A12
)推送到显示区域。这里的参数(0, 0, 160, 160)
可能指定了图像在显示屏上的起始坐标和大小。digitalWrite(device_A_CS, HIGH);
将片选引脚置高,取消对当前设备或显示屏的选择。delay(frameTime);
引入一定的延迟,控制每幅图像的显示时间,从而实现动画的连贯效果【代码烧录】
【运行效果】
【程序说明】
【硬件连接】
【代码分析】
tft.startWrite();
:开始向 TFT 显示屏写入数据tft.setAddrWindow(area->x1, area->y1, area->x2 - area->x1 + 1, area->y2 - area->y1 + 1);
:根据传入的显示区域参数(area
)设置 TFT 显示屏的写地址窗口,明确即将写入数据的屏幕区域范围tft.pushColors(&color_p->full, (area->x2 - area->x1 + 1) * (area->y2 - area->y1 + 1), true);
:将 LVGL 提供的颜色数据(color_p
)按照指定区域大小(通过计算区域宽度和高度的乘积得到像素数量)推送到 TFT 显示屏上,其中true
表示推送数据后自动递增颜色指针,以便下次推送从下一个像素位置开始tft.endWrite();
:结束 TFT 显示屏的写操作,完成数据传输lv_disp_flush_ready(disp);
:通知 LVGL 当前的刷新操作已完成,LVGL 可以继续进行后续的图形处理操作,如准备下一帧数据等printf("LVGL_disp_flush\n");
:打印输出调试信息lv_init();
和tft.begin();
:初始化 LVGL 库,初始化 TFT 显示屏lv_disp_draw_buf_init(&draw_buf, buf, NULL, screenHeight * screenWidth / 15);
初始化 LVGL 的显示缓冲区,其中buf是用于存储显示数据的缓冲区数组,NULL表示不使用双缓冲(这里可以根据需要进行调整),screenHeight * screenWidth / 15
计算了缓冲区的大小,合理的缓冲区设置有助于提高显示性能lv_disp_drv_init(&disp_drv);
初始化 LVGL 的显示驱动结构体disp_drv
disp_drv.flush_cb = my_disp_flush;
将前面定义的my_disp_flush
函数设置为显示驱动的刷新回调函数,使得 LVGL 在需要刷新显示时能够调用该函数来更新屏幕内容disp_drv.draw_buf = &draw_buf;
将之前初始化的显示缓冲区draw_buf
与显示驱动关联起来,确保图形数据能够正确地存储和传输到显示屏lv_disp_drv_register(&disp_drv);
注册显示驱动,使 LVGL 能够使用配置好的显示驱动来进行图形显示操作,至此 LVGL 与 TFT 显示屏的连接和配置完成【代码烧录】
【运行效果】
【程序说明】
【硬件连接】
【代码分析】
a == 1
,则先将屏幕填充为黑色(tft.fillScreen(BLACK);
),然后调用Demo_1
函数,最后通过delay(2000);
延迟 2 秒钟。a == 2
,则使用一个内层循环执行Demo_2
函数多次,这里的循环次数由变量i
控制,循环次数为 7。Demo_2
函数会依次显示一系列图像,实现动画效果。通过这种方式,可以在程序运行过程中不断地循环执行这两个不同的动画序列【代码烧录】
【运行效果】
【程序说明】
【硬件连接】
【代码分析】
w
和高度h
,确保准确确定数据范围tft.setAddrWindow
设置 TFT 显示屏的写地址窗口,为数据写入指定正确位置tft.pushColors
将颜色数据推送到显示屏,这一步决定了显示的图形颜色和内容Serial.begin(115200)
准备串口通信用于可能的调试lv_init()
启动 LVGL 库的核心组件LV_USE_LOG
不为 0,注册串口打印函数用于调试:lv_log_register_print_cb(my_print)
。tft.begin()
初始化 TFT 硬件tft.setRotation(0)
设置显示屏为横向翻转方向lv_disp_draw_buf_init(&draw_buf, buf, NULL, screenWidth * screenHeight / 10)
,为存储图形数据做准备。lv_disp_drv_init(&disp_drv)
初始化显示驱动结构体LV_IMG_DECLARE(A3)
声明图像资源,然后创建图像对象logo_img并设置其源为声明的图像,最后通过lv_obj_center
和lv_obj_align
设置图像对象在屏幕上的位置【代码烧录】
【运行效果】
【程序说明】
【硬件连接】
【代码分析】
LV_USE_LOG
不为 0,注册串口打印函数以便查看 LVGL 日志信息ui_init
初始化用户界面元素【代码烧录】
【运行效果】
..\ESP32-C3-LCD-0.71-Demo\Firmware
①通过设备管理器查看: 按下Windows + R键打开“运行”对话框; 输入devmgmt.msc并按回车键打开设备管理器; 展开“端口(COM和LPT)”部分,这里会列出所有的COM端口及其当前状态。
②使用命令提示符查看: 打开命令提示符(CMD); 输入mode命令,这将显示所有COM端口的状态信息。
③查看硬件连接: 如果你已经连接了外部设备到COM口,通常设备会占用一个端口号,可以通过查看连接的硬件来确定使用的是哪个端口。
①使用dmesg命令查看: 打开终端。
②使用ls命令查看: 输入ls /dev/ttyS*或ls /dev/ttyUSB*来列出所有的串口设备。
③使用setserial命令查看: 输入setserial -g /dev/ttyS*来查看所有串口设备的配置信息。
周一-周五(9:30-6:30)周六(9:30-5:30)
手机:13434470212
邮箱:services04@spotpear.cn
QQ:202004841