简介
在上一个文章中的代码, 我已经实现了语音的录制和播放, 但是屏幕并没有被驱动起来而且没有连接wifi, 那么在这一次的更新中我新增了WIFI和LVGL UI的支持(使用SquareLine_Studio 来制作UI界面然后在工程中渲染.). 并且已经成功的通过测试.
首先是LVGL的UI支持, 我使用SquareLine_Studio 创建了一个基于乐鑫esp32-s3box的项目,并且在屏幕上加了一个键盘的组件, 如下所示.
在项目的设置中指定了当前的工程路径和导出的UI文件路径
这样的话每一次的UI导出就正好导出到了我的工程文件夹中. 项目文件夹如下所示.
需要注意的是还需要在main下的CmakeList 配置头文件和C文件的查找. 如下所示
idf_build_get_property(project_dir PROJECT_DIR) file(GLOB MAIN_SRCS "src/*.c" "ui/*.c" "ui/screens/*.c") # 注册主组件 idf_component_register( SRCS "main.c" ${MAIN_SRCS} INCLUDE_DIRS "." "inc" "ui" )
这样的话 main.c 文件就可以找到导出的ui.h文件了. 然后我们在主程序中引入 ui.h 并且调用初始化函数初始化UI
/* * SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD * * SPDX-License-Identifier: CC0-1.0 */ #include "esp_log.h" #include "bsp/esp-bsp.h" #include "audio_play.h" #include "esp_system.h" #include "network.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" #include "ui.h" #define REC_FILENAME "/spiffs/recording.wav" void app_main(void) { /* 初始化并挂载 SPIFFS */ bsp_spiffs_mount(); /* 初始化 I2C(用于触摸和音频) */ bsp_i2c_init(); /* 初始化显示和 LVGL */ bsp_display_start(); /* 设置默认显示亮度 */ bsp_display_brightness_set(100); /* 添加并显示 LVGL 组件 */ ui_init(); /* 初始化音频 */ app_audio_init(); }
需要注意的一点是,现在SquareLine_Studio中的lvgl版本是8.3.6或者好似8.3.11 但是 ESP-IDF工程中的LVGL版本是9.0+. 有些旧版本的API在新版本已经被舍弃了. 因此需要把旧版本的API换成新版本的(我个人觉得LVGL官方这一点做的非常不好, 就算版本需要进行更新,除了恶性的bug. 旧版本的API不应该被直接删除或者改名或者禁用. 可以修改成如果使用的话打印警告即可).
然后将程序烧录到开发板上, 效果如下所示.
此时LVGL的测试通过, 和SquareLine_Studio的显示一致. 对于聊天的显示界面之后再进行制作. 我个人的想法是只需要一个按钮来触发录制的声音的事件即可.
WIFI的连接
wifi的连接我是使用的我之前的ESP-IDF系列文章中的wifi初始化方法. 首先来初始化NVS
#include "nvs_init.h" #include "esp_log.h" #include "nvs_flash.h" static const char *TAG = "nvs_init"; void init_nvs() { esp_err_t err = nvs_flash_init(); if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) { ESP_ERROR_CHECK(nvs_flash_erase()); err = nvs_flash_init(); } ESP_ERROR_CHECK(err); }
然后在网络初始化前先初始化NVS
#include "network.h" #include "esp_log.h" #include "esp_wifi.h" #include "protocol_examples_common.h" #include "nvs_init.h" static const char *TAG = "network"; void init_network() { init_nvs(); ESP_ERROR_CHECK(esp_netif_init()); ESP_ERROR_CHECK(esp_event_loop_create_default()); ESP_ERROR_CHECK(example_connect()); #if CONFIG_EXAMPLE_CONNECT_WIFI esp_wifi_set_ps(WIFI_PS_NONE); #endif // CONFIG_EXAMPLE_CONNECT_WIFI }
此时即可完成WIFI的连接. 由于这里并没有保存WIFI的连接信息. 因此我自定义了一个Kconfig.projbuild 用于生成menuconfig内的wifi初始化信息. 如下所示
由于这里使用的wifi连接方法为example connect, 所以要想使用这个方法的话, 还需要在idf_component.yml 中进行配置(如下所示)
dependencies: protocol_examples_common: path: ${IDF_PATH}/examples/common_components/protocol_examples_common esp_jpeg: "*" esp-box-3: version: "*" override_path: "../../../bsp/esp-box-3"
wifi 连接效果如下
总结
截止到目前,所有的准备工作已经做好了. 音频的录制、播放、 屏幕的显示和网络的连接. 那么在下一篇文章中我将准备把音频数据通过HTTP/HTTPS发送给ASR服务,然后再将数据发送给大模型实现消息的应答功能. 然后再调用TTS服务将文字转换成语音,最终在ESP32-S3-box上进行播放.