简介
在上一个文章中的代码, 我已经实现了语音的录制和播放, 但是屏幕并没有被驱动起来而且没有连接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上进行播放.
我要赚赏金
