SeasonMay 发表于 2024-10-29 08:45

【2024 DigiKey创意大赛】+基于大语言模型的智能家居平台+ESP32S3 EV BOARD上手指引

开发ESP32的环境选择有很多很多,我个人尝试过MicroPython、Arduino、VScode+ESP idf以及VScode+PlatformIO等环境,综合来看,Arduino上手比较快,mpy驱动配置有点复杂,PlatformIO上手有一些基础后最为推荐,因此本篇记录下初学者入门使用的一些开发过程,基于Arduino进行开发,由于本人也是摸着石头过河,可能存在说的不对的地方,也麻烦指出。
## 配置Arduino开发环境

首先参考官方的arduino使用说明,安装依赖,参考链接:(https://github.com/esp-arduino-libs/ESP32_Display_Panel/blob/v0.1.6/README_CN.md)

我安装的版本如下:

```
arduino-esp32:3.0.5
ESP32_IO_Expander:0.0.4
ESP32_Display_Panel:0.18.0
lvgl:8.4.0
```

初次安装lvgl需要配置一下环境,本机环境为win11,首先定位到类似C:\Users\SeasonMay\Documents\Arduino\libraries路径下,可以看到lvgl的文件夹
刚开始是没有lv_conf.h文件的,需要去lvgl文件夹下,将lv_conf_template.h文件复制一份放到上图中的文件夹内,并修改文件中第15行来使能文件

```
#if 0 -> #if 1
```

打开示例项目,点击示例->ESP32_Display_Panel -> LVGL ->v8->Porting,打开的项目文件组织如图所示
基于EV Board使用,需要修改几处地方代码,使能对应功能代码

```
# ESP_Panel_Board_Supported.h
line 10 0>1
line44 取消注释(注意是v1.5那行)
```

其他地方按具体需求修改或者注释即可

## 编译使用

点击工具,配置下方参数,这里我修改的地方主要如下

```
# 修改Flash大小 从4MB->16MB
# 修改分区,Partition Scheme,从默认改为16M Flash(3+9.9),实际只用默认,LVGL+WIFI等功能就能把控件挤爆了,推荐改下分区大小
# 使能PSRAM,使用OPI PSRAM,否则烧录程序会不断重启,这个我看别的博主也提到了
# 其他按需修改
```
## 效果初试

在编辑完参数列表后,就可以编写修改示例代码或者直接用示例代码运行了,这里提供一个我修改后的demo,放入了一个按钮控件和文本输入框控件,其中点击文本输入框,会弹出软键盘可以输入文字,再点击按钮,就会显示所输入的文字

```c
#include <Arduino.h>
#include <ESP_Panel_Library.h>
#include <lvgl.h>
#include "lvgl_port_v8.h"

// 定义全局变量存储文本框和键盘对象
lv_obj_t *textarea;
lv_obj_t *keyboard;
/* 按钮事件处理函数 */
static void btn_event_cb(lv_event_t * e)
{
    // 获取文本框的内容
    const char * text = lv_textarea_get_text(textarea);

    // 在串口输出文本框中的内容
    Serial.print("Text input: ");
    Serial.println(text);

    // 弹出提示框
    lv_obj_t *msg = lv_msgbox_create(NULL, "Input", text, NULL, true);
    lv_obj_align(msg, LV_ALIGN_CENTER, 0, 0);
}

/* 文本框事件处理函数,点击文本框时弹出键盘 */
static void textarea_event_cb(lv_event_t * e)
{
    // 显示虚拟键盘
    lv_keyboard_set_textarea(keyboard, textarea);// 关联键盘和文本输入框
    lv_obj_clear_flag(keyboard, LV_OBJ_FLAG_HIDDEN);// 显示键盘
}

/* 键盘事件处理函数 */
static void keyboard_event_cb(lv_event_t * e)
{
    lv_event_code_t code = lv_event_get_code(e);
    lv_obj_t *kb = lv_event_get_target(e);
    if(code == LV_EVENT_CANCEL) {
      lv_obj_add_flag(kb, LV_OBJ_FLAG_HIDDEN);// 隐藏键盘
    }
}

void setup()
{
    String title = "LVGL porting example with button, text area, and keyboard";

    Serial.begin(115200);
    Serial.println(title + " start");

    Serial.println("Initialize panel device");
    ESP_Panel *panel = new ESP_Panel();
    panel->init();
#if LVGL_PORT_AVOID_TEAR
    // 如果启用避免撕裂功能,配置RGB总线
    ESP_PanelBus_RGB *rgb_bus = static_cast<ESP_PanelBus_RGB *>(panel->getLcd()->getBus());
    rgb_bus->configRgbFrameBufferNumber(LVGL_PORT_DISP_BUFFER_NUM);
    rgb_bus->configRgbBounceBufferSize(LVGL_PORT_RGB_BOUNCE_BUFFER_SIZE);
#endif
    panel->begin();

    Serial.println("Initialize LVGL");
    lvgl_port_init(panel->getLcd(), panel->getTouch());

    Serial.println("Create UI");
    lvgl_port_lock(-1);

    // 创建一个简单的标签
    lv_obj_t *label = lv_label_create(lv_scr_act());
    lv_label_set_text(label, title.c_str());
    lv_obj_align(label, LV_ALIGN_TOP_MID, 0, 20);

    // 创建一个文本输入框
    textarea = lv_textarea_create(lv_scr_act());
    lv_obj_set_width(textarea, 200);
    lv_obj_align(textarea, LV_ALIGN_CENTER, 0, -40);// 让文本输入框居中
    lv_obj_add_event_cb(textarea, textarea_event_cb, LV_EVENT_CLICKED, NULL);// 点击文本框时弹出键盘

    // 创建一个按钮
    lv_obj_t *btn = lv_btn_create(lv_scr_act());
    lv_obj_align(btn, LV_ALIGN_CENTER, 0, 40);// 让按钮位于文本输入框的下方
    lv_obj_set_size(btn, 100, 50);
   
    // 创建按钮的标签(按钮上的文字)
    lv_obj_t *btn_label = lv_label_create(btn);
    lv_label_set_text(btn_label, "Submit");
    lv_obj_center(btn_label);

    // 为按钮设置事件回调函数
    lv_obj_add_event_cb(btn, btn_event_cb, LV_EVENT_CLICKED, NULL);

    // 创建虚拟键盘,并设置为初始隐藏状态
    keyboard = lv_keyboard_create(lv_scr_act());
    lv_obj_add_flag(keyboard, LV_OBJ_FLAG_HIDDEN);// 默认隐藏键盘
    lv_obj_add_event_cb(keyboard, keyboard_event_cb, LV_EVENT_CANCEL, NULL);// 设置键盘取消事件

    lvgl_port_unlock();

    Serial.println(title + " end");
}
void loop()
{
    Serial.println("IDLE loop");
    delay(1000);
}

```

## 其他

其他不说,Arduino确实配置环境起来比较方便,但编译实在太慢了,塞个LVGL,编译在我电脑上起码十分钟左右,后面我又尝试了一下VSCode+PlatformIO进行开发,编译速度快了好几倍,也推荐大家可以尝试一下,arduino入门完后就可以试试看PlatformIO开发了。此外我也看到有Circuitpython的支持,做完比赛后也会尝试用一用,效果好再发个帖子上来。

wangerxian 发表于 2024-10-29 08:57

<p>PlatformIO和IDF有啥区别呀?</p>

William-sz 发表于 2024-10-29 13:00

<p>学习了,内容非常清晰,非常感谢楼主的分享。好文,有需要的可以看看。</p>
页: [1]
查看完整版本: 【2024 DigiKey创意大赛】+基于大语言模型的智能家居平台+ESP32S3 EV BOARD上手指引