一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

ESP32驅(qū)動ST7789觸摸屏開發(fā)指南:LVGL主題設(shè)置與示波器面板

PCB56242069 ? 來源:PCB56242069 ? 作者:PCB56242069 ? 2025-04-28 18:07 ? 次閱讀

一、項目概述

本文介紹如何使用ESP32微控制器驅(qū)動ST7789 TFT液晶屏和XPT2046觸摸芯片,通過LVGL圖形庫實現(xiàn)主題切換功能,并開發(fā)一個實用的觸摸屏示波器應(yīng)用。項目包含兩大核心功能:

LVGL多主題切換:支持8種不同風(fēng)格的UI主題

示波器功能
模擬/數(shù)字信號采集、觸摸控制面板、光標(biāo)測量系統(tǒng)、自動頻率檢測

二、硬件準(zhǔn)備

組件 型號 說明
主控 零知ESP32 雙核240MHz處理器
屏幕 ST7789 2.4寸 240×320分辨率
觸摸芯片 XPT2046 電阻式觸摸控制器
接線 SPI 使用硬件SPI接口

接線圖

wKgZPGgPE5iAVw_4AAWAWieXOA0976.png

三、環(huán)境搭建

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主題設(shè)置

?
// 主題初始化
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));
}

// 顯示驅(qū)動回調(diào)
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 觸摸驅(qū)動(帶消抖)

?
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();
        // 坐標(biāo)轉(zhuǎn)換與校準(zhǔn)
        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{ // 數(shù)字模式
        bool state = digitalRead(DIGITAL_PIN);
        samplesBuffer[sampleIndex] = state ? 4095 : 0;
    }
    sampleIndex = (sampleIndex+1) % MAX_SAMPLES;
}

波形繪制:

?
void updateWaveform() {
    waveSprite.fillSprite(BG_COLOR);
    // 繪制網(wǎng)格
    for(int x=0; x

五、觸摸控制面板實現(xiàn)

?
void create_ui(){
    // 創(chuàng)建選項卡式控制面板
    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);
    
    // 模式切換開關(guān)
    modeSwitch = lv_switch_create(controlPanel);
    lv_obj_set_event_cb(modeSwitch, mode_switch_event_cb);
}

六、性能優(yōu)化技巧

雙緩沖機制:使用TFT_eSPI的Sprite功能減少閃爍

異步采樣:在loop()中分離采樣和顯示邏輯

動態(tài)刷新:根據(jù)時基自動調(diào)整刷新率

內(nèi)存管理

?
static lv_color_t buf[LV_HOR_RES_MAX * 10]; // LVGL緩沖區(qū)
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

八、常見問題解決

觸摸校準(zhǔn)異常

修改cal_x_min/max和cal_y_min/max值

使用校準(zhǔn)例程獲取實際參數(shù)

LVGL內(nèi)存不足

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

完整代碼獲?。?/strong>

Github倉庫:https://github.com/Leeri1y/esp32-st7789

百度網(wǎng)盤:https://pan.baidu.com/s/19TVS2PBJpYqExxsannnH3w?pwd=epyd 提取碼: epyd

互動交流:歡迎在評論區(qū)留言討論,遇到問題可提交Issues

附錄:關(guān)鍵函數(shù)速查表

函數(shù) 功能 調(diào)用示例
lv_btn_create() 創(chuàng)建按鈕 lv_obj_t * btn = lv_btn_create(parent, NULL);
lv_sw_get_state() 獲取開關(guān)狀態(tài) bool state = lv_sw_get_state(sw);
lv_roller_set_options() 設(shè)置滾輪選項 lv_roller_set_options(roller, "1n2n3", true);
waveSprite.pushSprite() 刷新顯示 waveSprite.pushSprite(0, 0);
ts.touched() 檢測觸摸 if(ts.touched()) { ... }

?動手實踐建議

先運行基礎(chǔ)顯示示例驗證硬件連接

逐步添加功能模塊(先顯示后觸摸)

使用串口監(jiān)視器調(diào)試輸出

保存不同版本的代碼備份

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 示波器
    +關(guān)注

    關(guān)注

    113

    文章

    6448

    瀏覽量

    187649
  • ESP32
    +關(guān)注

    關(guān)注

    20

    文章

    999

    瀏覽量

    18600
收藏 人收藏

    評論

    相關(guān)推薦

    ESP32驅(qū)動ST7789觸摸屏開發(fā)指南LVGL主題設(shè)置示波器面板

    一、項目概述本文介紹如何使用ESP32微控制器驅(qū)動ST7789 TFT液晶和XPT2046觸摸芯片,通過
    發(fā)表于 04-29 10:20

    LVGL主題切換 #ST7789 #嵌入式開發(fā)

    嵌入式開發(fā)
    PCB56242069
    發(fā)布于 :2025年04月29日 08:50:04

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

    1、在UI界面上可以看到st7789,但在packages中沒有。 2、沒有看到對應(yīng)的下載信息。 3、在對應(yīng)github中可以正常下載。 4、RTT版本為5.1.0. 5、類似的ili9341的添加是正常的。
    發(fā)表于 03-20 07:51

    ESP32-P4方案4.3寸IPS觸摸屏強勢來襲!支持MIPI CSI攝像頭視覺擴展

    啟明智顯全新推出的ESP32-P44.3寸IPS觸摸屏,搭載強大的雙核400MHzRISC-V處理器,配備32MBPSRAM和16MBFLASH,分辨率800*480,性能和視覺體驗再次突破!核心
    的頭像 發(fā)表于 12-07 01:10 ?873次閱讀
    <b class='flag-5'>ESP32</b>-P4方案4.3寸IPS<b class='flag-5'>觸摸屏</b>強勢來襲!支持MIPI CSI攝像頭視覺擴展

    ESP32-P4方案4.3寸IPS觸摸屏上線!

    啟明智顯全新推出的ESP32-P4 4.3寸IPS觸摸屏,搭載強大的雙核400MHz RISC-V處理器,配備32MB PSRAM和16MB FLASH,分辨率800*480,性能和視覺體驗再次突破!
    的頭像 發(fā)表于 12-06 16:26 ?847次閱讀
    <b class='flag-5'>ESP32</b>-P4方案4.3寸IPS<b class='flag-5'>觸摸屏</b>上線!

    開發(fā)觸摸屏驅(qū)動板需要考慮哪些因素

    驅(qū)動板是現(xiàn)代電子設(shè)備中不可或缺的一部分,它負責(zé)將用戶的觸摸操作轉(zhuǎn)化為設(shè)備可以理解的信號。觸摸屏驅(qū)動板需要通過多個關(guān)鍵步驟來實現(xiàn)其功能,以
    的頭像 發(fā)表于 10-29 14:05 ?1252次閱讀

    LVGL開發(fā)指南介紹

    電子發(fā)燒友網(wǎng)站提供《LVGL開發(fā)指南介紹.pdf》資料免費下載
    發(fā)表于 09-09 10:24 ?20次下載

    啟明智顯Model3A芯片方案7寸高清觸摸屏:開箱、設(shè)置與實操全攻略指南

    一、背景本指南將詳細介紹啟明智顯的Model3A芯片方案下的7寸高清觸摸屏ZX7D00CM21S的開箱步驟、基礎(chǔ)設(shè)置以及實操應(yīng)用。無論您是電子愛好者、開發(fā)者還是工程師,這份
    的頭像 發(fā)表于 07-01 16:09 ?1613次閱讀
    啟明智顯Model3A芯片方案7寸高清<b class='flag-5'>觸摸屏</b>:開箱、<b class='flag-5'>設(shè)置</b>與實操全攻略<b class='flag-5'>指南</b>

    ESP32S2使用HMI例程移植ST7789數(shù)據(jù)位DB0出現(xiàn)延遲怎么解決?

    環(huán)境相關(guān) vscode插件,IDFV4.3版本 使用esp32-s2-hmi-devkit-1例程 硬件是自己畫的ESP32S2開發(fā)板,lcd采用了ST7789v,16位并行8080協(xié)
    發(fā)表于 06-21 06:12

    請問esp32在使用lvgl的時候要怎么配置使用外部ROM?

    請問esp32 在使用lvgl的時候要怎么配置使用外部ROM?我現(xiàn)在用的是git上的的lv_port_esp32 https://github.com/lvgl/
    發(fā)表于 06-20 06:29

    esp32-s3驅(qū)動rgb刷屏卡頓,花屏是什么原因?

    esp32-s3驅(qū)動rgb,根據(jù)test_rgb_panel.c,但是刷屏太卡頓了,運行lvgl的demo,fps為0,想請教一下rgb
    發(fā)表于 06-19 06:21

    請問ESP32-S2在LCD外設(shè)調(diào)用LVGL的情況下LSB如何設(shè)置?

    已經(jīng)成功將pheriphal/lcd/lvgl的例程成功移植到串口上運行,但是在顏色上出現(xiàn)了問題。 IMG_20220417_224308.jpg (2.99 MiB) Viewed 1454
    發(fā)表于 06-17 07:47

    esp32s2同時使用wifi和lvgl出錯重啟是什么原因?

    我嘗試在用lvgl做一組wifi掃描連接界面,但加入wifi掃描后,esp32s2就不斷重啟,使用的版本是release4.4,vscode c開發(fā)。具體我也去查過,也有人遇到這個問題,他用
    發(fā)表于 06-17 06:16

    esp32-s3芯片esp-idf-v4.4-dev編譯帶LVGL工程出錯怎么解決?

    menuconfig查看關(guān)于LVGL的相關(guān)配置,如下: 但是當(dāng)我把目標(biāo)芯片設(shè)置ESP32時工程就能編譯通過。 請各位大佬幫忙看看
    發(fā)表于 06-12 07:16

    【Vision Board創(chuàng)客營連載體驗】RA8D1-Vision Board 移植LVGL8.3驅(qū)動庫和觸摸屏驅(qū)動代碼

    先說結(jié)論:移植LVGL的過程挺順利的,觸摸屏也能正常移植運行,但是目前無法通過觸摸LVGL界面聯(lián)動,原因未知。 移植LVGL8.3.10圖
    發(fā)表于 05-13 19:53