0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ESP32驱动ST7789触摸屏开发指南:LVGL主题设置与示波器面板

零知实验室 来源:PCB56242069 作者:PCB56242069 2025-04-28 18:07 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

一、项目概述

本文介绍如何使用ESP32微控制器驱动ST7789 TFT液晶屏和XPT2046触摸芯片,通过LVGL图形库实现主题切换功能,并开发一个实用的触摸屏示波器应用。项目包含两大核心功能:

LVGL多主题切换:支持8种不同风格的UI主题

示波器功能
模拟/数字信号采集、触摸控制面板、光标测量系统、自动频率检测

二、硬件准备

组件 型号 说明
主控 零知ESP32 双核240MHz处理器
屏幕 ST7789 2.4寸 240×320分辨率
触摸芯片 XPT2046 电阻式触摸控制器
接线 SPI 使用硬件SPI接口

接线图

wKgZPGgPE5iAVw_4AAWAWieXOA0976.png

三、环境搭建

1. 安装库

lv_arduino v3.0.1

TFT_eSPI

XPT2046_Touchscreen

2. TFT_eSPI配置(User_Setup.h):

​
​#define ST7789_DRIVER      // Full configuration option, define additional parameters below for this display

#define TFT_WIDTH  240 // ST7789 240 x 240
#define TFT_HEIGHT 320 // ST7789 240 x 320

#define TFT_MISO 19
#define TFT_MOSI 23   
#define TFT_SCLK 18
#define TFT_CS   15  Chip select control pin
#define TFT_DC   2   Data Command control pin
#define TFT_RST  4   Reset pin (could connect to RST pin)

四、核心代码解析

4.1 LVGL主题设置

​
// 主题初始化
void setup() {
    lv_test_theme(); // 默认主题
    // 可选主题:
    // lv_test_theme_1(lv_theme_night_init(210, NULL));
    // lv_test_theme_1(lv_theme_material_init(210, NULL));
}

// 显示驱动回调
void my_disp_flush(lv_disp_drv_t *disp, const lv_area_t *area, lv_color_t *color_p) {
    tft.setAddrWindow(area->x1, area->y1, area->x2, area->y2);
    for(int y=area->y1; y<=area- >y2; y++){
        for(int x=area->x1; x<=area- >x2; x++){
            tft.writeColor(color_p->full, 1);
            color_p++;
        }
    }
    lv_disp_flush_ready(disp);
}

4.2 触摸驱动(带消抖)

​
bool my_touchpad_read(lv_indev_drv_t *indev, lv_indev_data_t *data) {
    static lv_coord_t last_x = 0, last_y = 0;
    bool is_touched = ts.touched();
    
    if(is_touched){
        TS_Point p = ts.getPoint();
        // 坐标转换与校准
        last_x = map(p.x, cal_x_min, cal_x_max, 0, 320);
        last_y = map(p.y, cal_y_max, cal_y_min, 0, 240);
        
        // 滑动检测
        if(abs(last_x - prev_x) >5 || abs(last_y - prev_y) >5){
            is_sliding = true;
        }
        
        // 消抖处理
        if(!is_sliding && (millis()-last_touch_time)>CLICK_DEBOUNCE_MS){
            last_touch_time = millis();
        }
    }
    data->point.x = last_x;
    data->point.y = last_y;
    return false;
}

4.3 简易示波器核心逻辑

波形采样:

​
void takeSample() {
    if(!digitalMode){ // 模拟模式
        uint16_t raw = analogRead(ADC_PIN);
        samplesBuffer[sampleIndex] = raw * amplitudeScale;
    }else{ // 数字模式
        bool state = digitalRead(DIGITAL_PIN);
        samplesBuffer[sampleIndex] = state ? 4095 : 0;
    }
    sampleIndex = (sampleIndex+1) % MAX_SAMPLES;
}

波形绘制:

​
void updateWaveform() {
    waveSprite.fillSprite(BG_COLOR);
    // 绘制网格
    for(int x=0; x< GRAPH_WIDTH; x+=32){
        waveSprite.drawFastVLine(x,0,GRAPH_HEIGHT,GRID_COLOR);
    }
    // 绘制波形
    for(int i=0; i< visibleSamples; i++){
        uint16_t y = map(samplesBuffer[i],0,4095,GRAPH_HEIGHT,0);
        waveSprite.drawPixel(i*2, y, WAVE_COLOR);
    }
    // 绘制光标
    if(cursorMode){
        waveSprite.drawFastVLine(cursor1Pos,0,GRAPH_HEIGHT,CURSOR1_COLOR);
        waveSprite.drawFastVLine(cursor2Pos,0,GRAPH_HEIGHT,CURSOR2_COLOR);
    }
    waveSprite.pushSprite(0, GRAPH_TOP);
}

五、触摸控制面板实现

​
void create_ui(){
    // 创建选项卡式控制面板
    lv_obj_t *tabview = lv_tabview_create(rightPanel, NULL);
    lv_obj_t *timeTab = lv_tabview_add_tab(tabview, "时基");
    
    // 时基选择滚轮
    lv_obj_t *timebaseRoller = lv_roller_create(timeTab);
    lv_roller_set_options(timebaseRoller, "0.5msn1.0msn2.0ms", LV_ROLLER_MODE_NORMAL);
    
    // 幅度控制滑块
    lv_obj_t *ampSlider = lv_slider_create(ampTab);
    lv_slider_set_range(ampSlider, 0, 400);
    
    // 模式切换开关
    modeSwitch = lv_switch_create(controlPanel);
    lv_obj_set_event_cb(modeSwitch, mode_switch_event_cb);
}

六、性能优化技巧

双缓冲机制:使用TFT_eSPI的Sprite功能减少闪烁

异步采样:在loop()中分离采样和显示逻辑

动态刷新:根据时基自动调整刷新率

内存管理

​
static lv_color_t buf[LV_HOR_RES_MAX * 10]; // LVGL缓冲区
TFT_eSprite waveSprite = TFT_eSprite(&tft); // 波形缓冲

七、实测效果

7.1 LVGL不同主题切换

wKgZPGgPUXGAMURlAEDocwUkdmk964.png

演示视频:
https://www.bilibili.com/video/BV1CwjAziEKj/?spm_id_from=888.80997.embed_other.whitelist&bvid=BV1CwjAziEKj&vd_source=a31e3d8d8ce008260eee442534c2f63d

7.2示波器触控界面效果

wKgZO2gPUeWAH6IOAFIlaHG6FZY336.png

演示视频:
https://www.bilibili.com/video/BV1FxjwzwEyF/?spm_id_from=888.80997.embed_other.whitelist&bvid=BV1FxjwzwEyF&vd_source=a31e3d8d8ce008260eee442534c2f63d

八、常见问题解决

触摸校准异常

修改cal_x_min/max和cal_y_min/max值

使用校准例程获取实际参数

LVGL内存不足

​// 修改lv_conf.h配置
#define LV_MEM_SIZE (48*1024)
#define LV_DISP_DEF_REFR_PERIOD 30

完整代码获取:

Github仓库:https://github.com/Leeri1y/esp32-st7789

百度网盘:https://pan.baidu.com/s/19TVS2PBJpYqExxsannnH3w?pwd=epyd 提取码: epyd

互动交流:欢迎在评论区留言讨论,遇到问题可提交Issues

附录:关键函数速查表

函数 功能 调用示例
lv_btn_create() 创建按钮 lv_obj_t * btn = lv_btn_create(parent, NULL);
lv_sw_get_state() 获取开关状态 bool state = lv_sw_get_state(sw);
lv_roller_set_options() 设置滚轮选项 lv_roller_set_options(roller, "1n2n3", true);
waveSprite.pushSprite() 刷新显示 waveSprite.pushSprite(0, 0);
ts.touched() 检测触摸 if(ts.touched()) { ... }

动手实践建议

先运行基础显示示例验证硬件连接

逐步添加功能模块(先显示后触摸)

使用串口监视器调试输出

保存不同版本的代码备份

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 示波器
    +关注

    关注

    113

    文章

    6969

    浏览量

    194707
  • ESP32
    +关注

    关注

    24

    文章

    1083

    浏览量

    20862
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    【课程升级】鸿蒙星闪WS63开发板新增《LVGL应用开发指南》课程,带开发让你的毕设项目更出彩!

    用的图形界面。01课程升级核心内容快速入门,LVGL图形界面开发新增《LVGL应用开发指南》精品课程,这部分升级已完成,共58讲精讲,17小时干货。课程基于Windows
    的头像 发表于 11-04 11:45 185次阅读
    【课程升级】鸿蒙星闪WS63<b class='flag-5'>开发</b>板新增《<b class='flag-5'>LVGL</b>应用<b class='flag-5'>开发指南</b>》课程,带<b class='flag-5'>屏</b><b class='flag-5'>开发</b>让你的毕设项目更出彩!

    LVGL实战指南:手把手教你玩转ESP32-S3 2.8寸串口UI开发

    你是否也曾被ESP32的显示开发折磨到“头秃”?环境配置报错、LVGL移植失败、屏幕死活不亮……无数个小时在调试中白白浪费。别担心,这篇指南就是你的“速救手册”。我们将跳过所有繁琐的坑
    的头像 发表于 10-30 18:04 1434次阅读
    <b class='flag-5'>LVGL</b>实战<b class='flag-5'>指南</b>:手把手教你玩转<b class='flag-5'>ESP32</b>-S3 2.8寸串口<b class='flag-5'>屏</b>UI<b class='flag-5'>开发</b>

    快速上手!带你用LVGL工具完成乐鑫科技ESP32-S3 2.8寸串口UI开发!代码完全开源!

    还在为嵌入式显示界面的开发而烦恼吗?配置环境复杂、移植LVGL困难、烧录过程频频出错——这些问题我们都懂。今天,我们将手把手带你走完启明云端ESP32-S32.8寸串口的完整
    的头像 发表于 10-30 18:04 1125次阅读
    快速上手!带你用<b class='flag-5'>LVGL</b>工具完成乐鑫科技<b class='flag-5'>ESP32</b>-S3 2.8寸串口<b class='flag-5'>屏</b>UI<b class='flag-5'>开发</b>!代码完全开源!

    st7789软件包不能添加是怎么回事?

    1、在UI界面上可以看到st7789,但在packages中没有。 2、没有看到对应的下载信息。 3、在对应github中可以正常下载。 4、RTT版本为5.1.0. 5、类似的ili9341的添加是正常的。
    发表于 09-26 07:56

    ESP32-P4-MINI开发板开箱和上手指南来了!速速码住!

    上期“梦中情板”ESP32-P4-MINI开发板一出就备受青睐这期我们立马就端着开箱和上手指南来了!不用惊叹,我们就是这么迅速,请把“启明云端权威”打在公上好嘛!开箱展示拿到
    的头像 发表于 07-25 18:02 1428次阅读
    <b class='flag-5'>ESP32</b>-P4-MINI<b class='flag-5'>开发</b>板开箱和上手<b class='flag-5'>指南</b>来了!速速码住!

    ESP32开发板元件资料

    ESP32开发板元件
    发表于 07-21 14:47 14次下载

    零知开源——STM32F4结合BMP581气压传感器实现ST7789中文显示教程

    零知开源平台是一个专为国开发者设计的软硬件开源平台,提供比Arduino更易上手的开发体验。本教程展示了如何在STM32F407VET6增强板上实现ST7789显示的中文显示功能,结
    的头像 发表于 07-09 09:21 1257次阅读
    零知开源——STM32F4结合BMP581气压传感器实现<b class='flag-5'>ST7789</b>中文显示教程

    启明云端ESP32-S3 2.8寸串口到手了?如何上手?看这篇!

    【场外插播】ESP32-S32.8寸串口、MX1.25-7P线、MX1.25-8P线我们都带来了,开箱展示如下【竞猜继续】ESP32-S32.8寸串口到手还不知道如何上手点
    的头像 发表于 07-07 18:04 619次阅读
    启明云端<b class='flag-5'>ESP32</b>-S3 2.8寸串口<b class='flag-5'>屏</b>到手了?如何上手?看这篇!

    零知开源——STM32F1驱动BMP581压强传感器使用SPI实现ST7789显示的环境监测系统

    clockFrequency = 100000;// 设置SPI时钟频率 // ST7789 显示引脚定义 #define TFT_CS6// 设置软件SPI的片选引脚 #def
    发表于 07-03 17:26

    泰克4系列MSO示波器触摸屏操作、协议解码与电源噪声分析指南

    高速信号调试与复杂系统测试中的得力助手。本文将详细介绍该示波器触摸屏操作、协议解码应用及电源噪声分析的具体方法,帮助用户高效掌握其核心功能。   一、触摸屏操作指南:直观交互与高效控
    的头像 发表于 05-30 14:19 889次阅读
    泰克4系列MSO<b class='flag-5'>示波器</b><b class='flag-5'>触摸屏</b>操作、协议解码与电源噪声分析<b class='flag-5'>指南</b>

    ESP32驱动ST7789触摸屏开发指南LVGL主题设置示波器面板

    一、项目概述本文介绍如何使用ESP32微控制器驱动ST7789 TFT液晶和XPT2046触摸芯片,通过
    发表于 04-29 10:20

    示波器触控界面设计 #ST7789 #嵌入式

    示波器
    PCB56242069
    发布于 :2025年04月29日 09:29:20

    LVGL主题切换 #ST7789 #嵌入式开发

    嵌入式开发
    PCB56242069
    发布于 :2025年04月29日 08:50:04

    基于ESP32的圆形显示圣诞主题互动式雪球

    用一款以圣诞为主题的互动式雪球让节日氛围鲜活起来!项目使用矽递科技(SeeedStudio)圆形显示和(XIAO)ESP32S3开发板打造出极具视觉吸引力的雪景动画,包含动态飘落的雪
    的头像 发表于 04-15 11:48 1052次阅读
    基于<b class='flag-5'>ESP32</b>的圆形显示<b class='flag-5'>屏</b>圣诞<b class='flag-5'>主题</b>互动式雪球

    st7789软件包不能添加是怎么回事?

    1、在UI界面上可以看到st7789,但在packages中没有。 2、没有看到对应的下载信息。 3、在对应github中可以正常下载。 4、RTT版本为5.1.0. 5、类似的ili9341的添加是正常的。
    发表于 03-20 07:51