学习笔记ESP32——lvgl模拟器

 文章中的工程 阿里云盘 https://www.aliyundrive.com/s/Zfuc6FZYiAB

一、lvgl模拟器获取

在GitHub上搜索lvgl

用VSstudio打开模拟器

 安装VSstudio时,勾选一下插件

二、文件系统配置

在lv_conf文件内,将模拟器色深配置为16位

 设置文件系统open的文件夹,新建一个lvgl_path文件夹在LVGL.Simulator下

  ctrl左键跳转过去是空的“”,在里面加上刚刚新建文件夹的名字

 设置盘符为'/'

在lv_conf开启gif和png

 在lvgl_path里放入自己的gif,并修改路径

 最后,在主函数里把默认展示的注释掉

 放入刚刚修改的gif函数

记得修改成x86,然后本地编译器编译

编译成功

 三、生成字库

增加外部/内部中文字库

1、生成部分字库

下载下来字体文件,先点击安装

 选择刚刚安装的字体

 输入要生成的部分字库内容        包含这个头文件

#include "lvgl_porting/lvgl_mount_cus_font.h"

 新建文件夹——保存在工程里

lv_port_pc_visual_studio\LVGL.Simulator\lvgl_porting\lvgl_fonts

2、生成全字库

选择4.0来生成全字库

插入全部图标加入常用汉字,选择字体,选择配置

输入包含里,包含这个头文件

#include "lvgl_porting/lvgl_mount_cus_font.h"

点击转换,在工程里新建一个sd来存放生成的bin文件

 完成之后,复制.c文件到porting文件夹里

3、字体使用

在工程里进行修改

添加刚刚生成的文件

 添加支持文件

 使用这个方式在虚拟器里没问题,但是在单片机里不行

把这段删除

static uint8_t *__user_font_getdata(int offset, int size){
    //如字模保存在SPI FLASH, SPIFLASH_Read(__g_font_buf,offset,size);
    //如字模已加载到SDRAM,直接返回偏移地址即可如:return (uint8_t*)(sdram_fontddr+offset);
    return __g_font_buf;
}

修改成


static uint8_t __g_font_buf[612];//如bin文件存在SPI FLASH可使用此buff
static lv_fs_file_t lv_file;
int siyuan_Medium_51_flash_fs_init(void)
{

    lv_fs_res_t  lv_res;


    lv_res = lv_fs_open(&lv_file, LVGL_PATH"/fonts/lv_siyuan_Medium_51.bin", LV_FS_MODE_RD);
    if (lv_res != LV_FS_RES_OK)
    {
        //lv_printf("LVGL FS open error. (%d)\n", lv_res);
    }
    else
    {
        lv_fs_seek(&lv_file, 0, LV_FS_SEEK_SET);/* 移动到头部 */
        //lv_printf("rey 11 -> file -> %x\r\n", *(int*)lv_file.file_d);
        //lv_printf("rey 12 -> file -> %d %d\r\n", offset, size);
        //lv_fs_seek(&lv_file, offset);
        //lv_fs_read(&lv_file, __g_font_buf, size, NULL);
        //lv_printf("LVGL FS open Ok\n");
        //lv_fs_close(&lv_file);
    }
    return 0;
}

static uint8_t* __user_font_getdata(int offset, int size) {
    //如字模保存在SPI FLASH, SPIFLASH_Read(__g_font_buf,offset,size);
    //如字模已加载到SDRAM,直接返回偏移地址即可如:return (uint8_t*)(sdram_fontddr+offset);
    lv_fs_seek(&lv_file, offset, LV_FS_SEEK_SET);
    lv_fs_read(&lv_file, __g_font_buf, size, NULL);
    return __g_font_buf;
}

同时,把支持文件里的lv_siyuanheiti_23用lv_siyuan_Medium_51替换

修改初始化文件系统siyuanheiti_23_flash_fs_init用刚刚增加的siyuan_Medium_51_flash_fs_init替换

同上,继续增加82号字体,只需要在上图的文件中增加既可

 在.h文件里,声明刚刚增加的

  在LVGL.Simulator.cpp文件中,先包含#include "lvgl_porting/lvgl_mount_cus_font.h"头文件

 测试一下

 

四、消息订阅和发布

1、消息第三方库

msg是第三方库,需要自己在lv_conf添加定义

 #define LV_USE_MSG  1 把msg打开

 背景修改 

 2、lvgl_app

新建一个文件夹,存放消息订阅函数

 把刚刚的消息代码放在weather.c文件里

#ifdef LV_LVGL_H_INCLUDE_SIMPLE
#include "lvgl.h"
#else
#include "lvgl/lvgl.h"
#endif
#include "lvgl_app/lvgl_app.h"

static void label_event_cb(lv_event_t* e)
{
    lv_obj_t* label = lv_event_get_target(e);
    lv_msg_t* m = lv_event_get_msg(e);

    const char* fmt = lv_msg_get_user_data(m);
    const int32_t* v = lv_msg_get_payload(m);

    lv_label_set_text_fmt(label, fmt, *v);
}

void lv_weather_main()
{
    lv_obj_t* temp_lab = lv_label_create(lv_scr_act());
    lv_label_set_long_mode(temp_lab, LV_LABEL_LONG_SCROLL_CIRCULAR);
    lv_obj_add_style(temp_lab, &font_style_siyuan_Medium_51, LV_PART_MAIN);
    lv_label_set_text(temp_lab, "最高温度 30度");

    lv_obj_add_event_cb(temp_lab, label_event_cb, LV_EVENT_MSG_RECEIVED, NULL);        //增加一个回调
    lv_msg_subscribe_obj(1, temp_lab, "最高温度 %d度");

    int data = 20;
    lv_msg_send(1, &data);
}

lvgl_app.h文件

/**
 * @file lv_examples.h
 *
 */

#ifndef LVGL_APP_H
#define LVGL_APP_H

#ifdef __cplusplus
extern "C" {
#endif

/*********************
*      INCLUDES
*********************/
#include "lvgl_porting/lvgl_mount_cus_font.h"
/*********************
*      DEFINES
*********************/

/**********************
*      TYPEDEFS
**********************/

/**********************
* GLOBAL PROTOTYPES
**********************/

/**********************
*      MACROS
**********************/
void lv_weather_main(void);
#ifdef __cplusplus
} /*extern "C"*/
#endif

#endif /*LVGL_APP_H*/

在主函数中直接调用lv_weather_main函数即可

 五、全部函数

增加了其他字体,布局

 最终效果 

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ESP32的FreeRTOS使用上与传统的FreeRTOS有一些区别。在ESP32中,基本不需要单独配置FreeRTOSConfig.h文件,因为ESP-IDF中的menuconfig功能可以对所有涉及到的内容进行配置,使用起来更加直观和便利。主要的数据类型说明中,有一个重要的数据类型是TickType_t。 在ESP32的魔改版FreeRTOS中,很少使用正经的事件集,而是使用ESP-IDF提供的更方便的事件循环。这使得在ESP32中使用事件循环更加方便。 另外,ESP32的分区表是采用二进制格式而不是CSV文件。ESP-IDF提供了gen_esp32part.py工具来配置和构建分区表。默认情况下,使用的是默认分区表。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [【ESP32+freeRTOS学习笔记-(一)freeRTOS介绍】](https://blog.csdn.net/weixin_45499326/article/details/128226443)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [ESPIDF开发ESP32学习笔记ESP32上的FreeRTOS】](https://blog.csdn.net/qq_40500005/article/details/114794039)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值