娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇

發(fā)布者:WanderlustGlow最新更新時(shí)間:2025-06-09 來源: cnblogs關(guān)鍵字:ESP32 手機(jī)看文章 掃描二維碼
隨時(shí)隨地手機(jī)看文章

前言

我們?cè)谏掀幸呀?jīng)實(shí)現(xiàn)了模擬器環(huán)境下可變字體字重的設(shè)置.

是時(shí)候掏出你吃灰已久的ESP32了.

本文會(huì)使用PlatformIO創(chuàng)建一個(gè)全新的項(xiàng)目,直到顯示出現(xiàn)上篇文章末尾的動(dòng)圖為止.
如遇到問題,可參考'常見問題'內(nèi)解答.

準(zhǔn)備工作

軟件準(zhǔn)備

為了后續(xù)內(nèi)容順利進(jìn)行下去,這里需要你安裝好VSCode,并在VSCode上安裝PlatformIO插件.

硬件準(zhǔn)備

名稱數(shù)量備注圖例
ESP32 開發(fā)板1

ESP32

1.54寸LCD1驅(qū)動(dòng)ST7789,分辨率240x240

LCD

杜邦線若干N

wires

創(chuàng)建項(xiàng)目

使用PlatformIO創(chuàng)建一個(gè)名為lvgl_with_freetype的項(xiàng)目


create project


創(chuàng)建完畢后目錄結(jié)構(gòu)如下:


.
├── include
│   └── README
├── lib
│   └── README
├── platformio.ini
├── src
│   └── main.cpp
└── test
    └── README

點(diǎn)亮屏幕

由于已經(jīng)寫過一篇點(diǎn)亮屏幕的文章,故本文不做過多贅述,只說明一下區(qū)別.

之前的屏幕分辨率是135x240,這次的屏幕分辨率是240x240.

所以需要使用TFT_eSPI里面的Setup24_ST7789.h

同時(shí)接線變更為

ESP32引腳名稱液晶屏引腳名稱
VCCVCC
GNDGND
G23SDA
G18SCL
G2DC
G4RES
GNDCS
VCCBLK

對(duì)應(yīng)Setup24_ST7789.h里面內(nèi)容


#define TFT_MISO    19#define TFT_MOSI    23#define TFT_SCLK    18#define TFT_CS      -1#define TFT_DC      2#define TFT_RST     4

隨便寫點(diǎn)內(nèi)容.測(cè)試下屏幕的點(diǎn)亮.




#include #include // Hardware-specific library#include TFT_eSPI tft = TFT_eSPI(); // Invoke custom libraryvoid setup() {

  Serial.begin(115200); // Set to a high rate for fast image transfer to a PC


  tft.init();

  tft.setRotation(0);

  tft.fillScreen(TFT_BLACK);}void loop() {

  tft.print('Ready Perfectly');}


lcd_ready_perfect

移植LVGL

屏幕點(diǎn)亮以后,就可以開始移植LVGL了.

當(dāng)前時(shí)間為2021.12.19,GitHub上LVGL最新版本是8.1.1-dev

使用命令


git clone https://github.com/lvgl/lvgl.git

獲取LVGL后將其復(fù)制到lib文件夾下.此時(shí)文件目錄為


.
├── include
│   └── README
├── lib
│   └── README
│   └── lvgl
│   └── TFT_eSPI
├── platformio.ini
├── src
│   └── main.cpp
└── test
    └── README

platformio.ini文件內(nèi)容


[env:pico32]
platform = espressif32
board = pico32
framework = arduino
monitor_speed = 115200
lib_extra_dirs = 
                lib/TFT_eSPI
                lib/lvgl

修改LVGL配置文件

創(chuàng)建LVGL的配置文件,找到lvgl文件夾內(nèi)的lv_conf_templat.h,復(fù)制一份lv_conf_templat.h并重命名為lv_conf.h,然后打開lv_conf.h

為了使配置文件內(nèi)容生效,找到第15行(其他版本的lvgl行數(shù)可能不在這里,需要自行尋找)


#if 0 /*Set it to '1' to enable content*/

改為


#if 1 /*Set it to '1' to enable content*/

找到第30行,修改顏色順序


#define LV_COLOR_16_SWAP 0

改為


#define LV_COLOR_16_SWAP 1

找到第49行,啟用自定義內(nèi)存管理


#define LV_MEM_CUSTOM 0

修改為


#define LV_MEM_CUSTOM 1

找到第88行,設(shè)置自定義周期函數(shù)


#define LV_TICK_CUSTOM 0

修改為


#define LV_TICK_CUSTOM 1

找到第174行,啟用LVGL日志功能


#define LV_USE_LOG 1

修改為


#define LV_USE_LOG 1

對(duì)接LVGL和TFT_eSPI

按照目錄


.
├── include
│   └── README
├── lib
│   └── README
│   └── lvgl
│   └── TFT_eSPI
├── platformio.ini
├── src
│   └── main.cpp
│   └── Port
│       └── lv_port_disp.cpp
│       └── lv_port_disp.h
└── test
    └── README

創(chuàng)建lv_port_disp.cpp和lv_port_disp.h


#ifndef LV_PORT_DISP_H_#define LV_PORT_DISP_H_#include 'TFT_eSPI.h'#include 'lvgl.h'#define DISP_HOR_RES 240#define DISP_VER_RES 240#define DISP_BUF_SIZE (DISP_HOR_RES*DISP_VER_RES/4)extern TaskHandle_t handleTaskLvgl;void Port_Init();void lv_port_disp_init(TFT_eSPI* scr);#endif{% endcodeblock %}{% codeblock 'lv_port_disp.cpp' lang:cpp%}#include 'lv_port_disp.h'// 用于初始化完畢后啟用LVGL顯示的TaskHandle_tTaskHandle_t handleTaskLvgl;// lvgl顯示驅(qū)動(dòng)static lv_disp_drv_t disp_drv;// lvgl更新任務(wù)void TaskLvglUpdate(void* parameter) {

  // 阻塞在此處,直到xTaskNotifyGive

  ulTaskNotifyTake(pdTRUE, portMAX_DELAY);

  for (;;) {

    lv_task_handler();


    delay(5);

  }}/**

 * @brief  顯示初始化

 * @param  無

 * @retval 無

 */void Port_Init() {

  static TFT_eSPI screen;


  /* 屏幕初始化 */

  screen.begin();

  screen.initDMA(true);

  screen.setRotation(0);

  screen.fillScreen(TFT_BLACK);


  /* lvgl初始化 */

  lv_init();

  lv_port_disp_init(&screen);

  printf('lvInitDonen');

  // 在核心2上執(zhí)行LVGL

  xTaskCreatePinnedToCore(TaskLvglUpdate, 'LvglThread', 20480, nullptr,

                          configMAX_PRIORITIES, &handleTaskLvgl, 1);}/**

 * @brief  自定義打印函數(shù)

 * @param  無

 * @retval 無

 */void my_print(lv_log_level_t level, const char *file, uint32_t line,

              const char *fun, const char *dsc) {

  Serial.printf('%s@%d %s->%srn', file, line, fun, dsc);

  Serial.flush();}/**

 * @brief  屏幕刷新回調(diào)函數(shù)

 * @param  disp:屏幕驅(qū)動(dòng)地址

 * @param  area:刷新區(qū)域

 * @param  color_p:刷新緩沖區(qū)地址

 * @retval 無

 */static void disp_flush_cb(lv_disp_drv_t *disp, const lv_area_t *area,

                          lv_color_t *color_p) {

  TFT_eSPI *screen = (TFT_eSPI *)disp->user_data;


  int32_t w = (area->x2 - area->x1 + 1);

  int32_t h = (area->y2 - area->y1 + 1);


  screen->startWrite();

  screen->setAddrWindow(area->x1, area->y1, w, h);

  screen->pushPixelsDMA((uint16_t *)(&color_p->full), w * h);

  screen->endWrite();


  lv_disp_flush_ready(disp);}/**

 * @brief  屏幕初始化

 * @param  無

 * @retval 無

 */void lv_port_disp_init(TFT_eSPI* scr) {

  lv_log_register_print_cb(reinterpret_cast(

      my_print)); /* register print function for debugging */

  DMA_ATTR static lv_color_t *lv_disp_buf =

      static_cast(heap_caps_malloc(

          DISP_BUF_SIZE * sizeof(lv_color_t), MALLOC_CAP_DMA));

  static lv_disp_draw_buf_t disp_buf;

  lv_disp_draw_buf_init(&disp_buf, lv_disp_buf, nullptr,

                        DISP_BUF_SIZE);


  /*Initialize the display*/

  lv_disp_drv_init(&disp_drv);

  disp_drv.hor_res = DISP_HOR_RES;

  disp_drv.ver_res = DISP_VER_RES;

  disp_drv.flush_cb = disp_flush_cb;

  disp_drv.draw_buf = &disp_buf;

  disp_drv.user_data = scr;

  lv_disp_drv_register(&disp_drv);}{% endcodeblock %}再寫個(gè)簡(jiǎn)單例子測(cè)試下LVGL能不能運(yùn)行{% codeblock 'main.cpp' lang:cpp%}#include #include './Port/lv_port_disp.h'void setup() {

  Serial.begin(115200); // Set to a high rate for fast image transfer to a PC

  Port_Init();



  lv_obj_t *label = lv_label_create(lv_scr_act());

  lv_label_set_text(label, 'Toou.nAnata wa watashi no masuta ka?');

  

  // 一切就緒, 啟動(dòng)LVGL任務(wù)

  xTaskNotifyGive(handleTaskLvgl);}void loop() {}

Toou.Anata wa watashi no masuta ka?


lvgl_ready_perfect


施工中,待更新

常見問題

Q:點(diǎn)亮屏幕時(shí)候,編譯器報(bào)找不到TFT_eSPI


A:檢查TFT_eSPI是否集成

將TFT_eSPI放置在lib文件夾內(nèi),并向platformio.ini文件末尾添加


lib_extra_dirs =  lib/TFT_eSPI

Q:在移植LVGL時(shí)候,屏幕顏色異常


A:可能與lv_conf.h文件內(nèi)#define LV_COLOR_16_SWAP 0有關(guān)

可以嘗試將此處的0改成1,或1改回0


環(huán)境:


Espressif 32 (3.4.0) > ESP32 Pico Kit

framework-arduinoespressif32 3.10006.210326 (1.0.6)tool-esptoolpy 1.30100.210531 (3.1.0)toolchain-xtensa32 2.50200.97 (5.2.0) 8.1.1-dev

2.3.89

esptool.py v3.1

參考資料

https://github.com/lvgl/lvgl


https://github.com/peng-zhihui/Peak



關(guān)鍵字:ESP32 引用地址:LGVL配合FreeType為可變字體設(shè)置字重-ESP32篇

上一篇:使用樹莓派進(jìn)行 ESP32 Jtag 調(diào)試
下一篇:最后一頁

推薦閱讀最新更新時(shí)間:2025-06-09 11:25

玩轉(zhuǎn) ESP32 + Arduino (十九) SIM800L調(diào)試(基于TTGO T-CALL)
一. 初識(shí)LiLyGO T-CALL 根據(jù)原理圖, 我們可以得到以下結(jié)論 1.SIM800L電源使能引腳接在ESP32的GPIO23引腳 2.SIM800L開關(guān)機(jī)引腳接在ESP32的GPIO4引腳 3.SIM800L復(fù)位引腳接在ESP32的GPIO5引腳 4. SIM800L的串口接在了ESP32的26, 27引腳 二. 實(shí)驗(yàn)1: PC端通過串口調(diào)試助手調(diào)試SIM800L 思路: 串口0收到PC的信息就轉(zhuǎn)發(fā)給串口1, 串口0 收到串口1的信息就轉(zhuǎn)發(fā)給PC #include Arduino.h #define MODEM_RST 5 //SIM800L復(fù)位引腳接在GPIO5#define MODEM
[單片機(jī)]
ESP32學(xué)習(xí)筆記(4)——UART串口使用
一、概述 通用異步收發(fā)送器(UART)是一種硬件特性,它使用廣泛適應(yīng)的異步串行通信接口(如RS 232、RS 422、RS 485)來處理通信(即時(shí)序要求和數(shù)據(jù)幀)。UART提供了一種廣泛采用和廉價(jià)的方法來實(shí)現(xiàn)不同設(shè)備之間的全雙工或半雙工數(shù)據(jù)交換。 ESP32芯片有三個(gè)UART控制器(UART 0、UART 1和UART 2),它們具有一組相同的寄存器,以便于編程和靈活性。 每個(gè)UART控制器都是獨(dú)立配置的,參數(shù)包括波特率、數(shù)據(jù)比特長(zhǎng)度、位序、停止位數(shù)、奇偶校驗(yàn)位等。所有控制器都與不同廠商的UART支持設(shè)備兼容,還可以支持紅外數(shù)據(jù)關(guān)聯(lián)協(xié)議(IRDA)。 ESP-IDF 編程指南——UART 二、API說明 以下 UART 接口
[單片機(jī)]
ESP32學(xué)習(xí)筆記(33)——BLE GATT客戶端發(fā)現(xiàn)服務(wù)和讀寫特征值
一、背景 1.1 GATT協(xié)議 GATT(Generic Attributes Profile)的縮寫,中文是通用屬性協(xié)議,是已連接的低功耗藍(lán)牙設(shè)備之間進(jìn)行通信的協(xié)議。 一旦兩個(gè)設(shè)備建立起了連接,GATT 就開始起作用了,這也意味著,你必需完成前面的GAP協(xié)議。 GATT使用了 ATT(Attribute Protocol)協(xié)議,ATT 協(xié)議把 Service,Characteristic 對(duì)應(yīng)的數(shù)據(jù)保存在一個(gè)查找表中,查找表使用 16bit ID 作為每一項(xiàng)的索引。 GATT定義的多層數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)要概括起來就是 服務(wù)(Service) 可以包含多個(gè) 特征(Characteristic),每個(gè)特征包含 屬性(Properties)
[單片機(jī)]
基于ESP32構(gòu)建一個(gè)具有3.5英寸大顯示屏的互聯(lián)網(wǎng)廣播設(shè)備
在這個(gè)項(xiàng)目中,我將使用便宜的 ESP32 板構(gòu)建一個(gè)具有 3.5 英寸大顯示屏的互聯(lián)網(wǎng)廣播設(shè)備。 你可能不太相信,在這個(gè)項(xiàng)目,我們能夠以不到 10 分鐘的時(shí)間內(nèi)并且用不到 30 美元的成本構(gòu)建一個(gè)網(wǎng)絡(luò)收音機(jī)。接下來讓我們開始吧! 幾個(gè)月前,我完成了一個(gè)Arduino FM Radio 項(xiàng)目,效果很好。問題是,雖然那臺(tái)收音機(jī)看起來很酷,但它并不實(shí)用,我住的地方發(fā)射信號(hào)并不好。所以,我在筆記本電腦或平板電腦上在線收聽我最喜歡的收音機(jī),但這也不太實(shí)用。所以,今天我要構(gòu)建一個(gè)網(wǎng)絡(luò)廣播設(shè)備,以便能夠收聽來自世界各地的我最喜歡的廣播電臺(tái)! 我已經(jīng)收聽了真正的 FM 廣播電臺(tái),通過使用這些按鈕,我們可以更改我們正在收聽的廣播電臺(tái)。我
[嵌入式]
基于<font color='red'>ESP32</font>構(gòu)建一個(gè)具有3.5英寸大顯示屏的互聯(lián)網(wǎng)廣播設(shè)備
小廣播
設(shè)計(jì)資源 培訓(xùn) 開發(fā)板 精華推薦

最新單片機(jī)文章

 
EEWorld訂閱號(hào)

 
EEWorld服務(wù)號(hào)

 
汽車開發(fā)圈

 
機(jī)器人開發(fā)圈

電子工程世界版權(quán)所有 京ICP證060456號(hào) 京ICP備10001474號(hào)-1 電信業(yè)務(wù)審批[2006]字第258號(hào)函 京公網(wǎng)安備 11010802033920號(hào) Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 高雄市| 荔波县| 海兴县| 漳州市| 和田县| 宜城市| 扎赉特旗| 广东省| 通渭县| 孙吴县| 巢湖市| 从化市| 梁山县| 钟祥市| 明光市| 湖州市| 沛县| 伊金霍洛旗| 台前县| 宁津县| 武平县| 洪江市| 昌邑市| 闽侯县| 扎鲁特旗| 北辰区| 新和县| 甘洛县| 沈丘县| 固安县| 田东县| 南京市| 凉山| 德昌县| 台安县| 白河县| 肥东县| 巴青县| 峡江县| 威宁| 河南省|