一.项目介绍
本任务是由电子森林组织的funpack第二季第五期,使用的模块是esp32-s3-box-lite,小模块很漂亮,制作的很精美,可以称为很好的工艺品了。
本次要实现的功能为联网获取粉丝数,并播报。本模块具有3个按键,2.4寸的屏幕,可玩性比较高。
模块到手官方建议首先更新模块的固件,更新的说明资料地址:esp-box/docs/firmware_update_cn.md at master · espressif/esp-box (github.com)
下载更新固件工具,选项如下图所示
烧写完成后,按reset按键,可以试用最新固件的效果。
二. 设计思路
本项目设计硬件基于esp32-s3-box-lite。首先测试了官方的demo代码,初步掌握板载的IO硬件以及各个外设的功能与实际效果。根据硬件的具体功能,设计本任务功能,代码借鉴了大佬KafCoppelia,向大佬学习,希望自己也能像大佬一样厉害。
功能设计分三个部分,第一个是tts语音播报,第二个是联网获取粉丝数,第三个部分注册三个按键的回调,实现按键播报功能。
三. 硬件介绍
下图是硬件结构体,配备一块 2.4 寸 LCD 显示屏、双麦克风、一个扬声器、两个用于硬件拓展的 Pmod™ 兼容接口、三个独立按键,一个boot按键,一个reset按键。lcd显示效果细腻,mcu频率足够高,可以流畅的刷新画面。
板卡集成了 2.4 GHz Wi-Fi 和 Bluetooth 5 (LE) 的 MCU 芯片,支持远距离模式 (Long Range)。ESP32-S3 搭载 Xtensa® 32 位 LX7 双核处理器,主频高达 240 MHz,内置 512 KB SRAM (TCM),具有 45 个可编程 GPIO 管脚和丰富的通信接口。
四. 功能介绍
1 开机页面窗口显示:吆嚯信息小框,中间显示show fans,如下图所示
2 上电模块会连接wifi,账号密码是固定写在代码中的,效果如下
可以看出正常获取到了IP地址,此时可以通过http协议获取粉丝数的数据了。
3 按左键获取粉丝数,效果如下图所示。
中间和右按键播报了自定义语音,没有实际功能。
五. 主要代码
配置文件,配置wifi的账号密码,和获取粉丝账号的id
#ifndef _CONFIG_H_
#define _CONFIG_H_
#define BILIBILI_VMID "318568697"
#define WIFI_SSID "zsywifi_F264"
#define WIFI_PASSWORD "12312345678"
#endif /* _CONFIG_H_ */
main主函数显示各个模块的初始化,并实现wifi联网。
/* Initialize TTS */
ESP_ERROR_CHECK(tts_init());
/* Connect to WIFI */
wifi_init_sta();
/* Initialize LCD & LVGL */
ESP_ERROR_CHECK(lv_port_init());
bsp_lcd_set_backlight(true);
完成初始化后,启动三个工作线程,完成本任务的主要功能
xTaskCreate(&tts_welcome_task, "tts_welcome_task", 4 * 1024, NULL, 5, NULL);
xTaskCreate(&https_request_task, "https_request_task", 8 * 1024, NULL, 5, NULL);
xTaskCreate(&lvgl_display_init_task, "lvgl_display_init_task", 4 * 1024, NULL, 6, NULL);
显示模块,具有两个字符显示句柄,并设置了两种句柄,其中项目使用的汉字字体通过网站()转换得到一个c文件,放到box项目的lvgl文件夹中的font目录中。
lv_obj_set_style_bg_color(lv_scr_act(), lv_color_hex(0xc7edcc), LV_PART_MAIN);
Hzlabel = lv_label_create(lv_scr_act());
lv_obj_set_style_text_font(Hzlabel,&SiYuanHeiTi,LV_PART_MAIN);
lv_label_set_text(Hzlabel, "吆嚯 信息小框");
lv_obj_set_style_text_color(Hzlabel, lv_palette_main(LV_PALETTE_TEAL), LV_PART_MAIN);
lv_obj_align(Hzlabel, LV_ALIGN_TOP_LEFT, 10, 10);
/* Create a white label, set its text and align it to the center */
label = lv_label_create(lv_scr_act());
lv_obj_set_style_text_font(label, &lv_font_montserrat_24, LV_PART_MAIN); // Font size 24
lv_label_set_text(label, "Show Fans: 0");
lv_obj_set_style_text_color(lv_scr_act(), lv_palette_main(LV_PALETTE_ORANGE), LV_PART_MAIN);
lv_obj_align(label, LV_ALIGN_CENTER, 0, 0);
vTaskDelete(NULL);
此处是三个按键注册回调
bsp_btn_register_callback(BOARD_BTN_ID_PREV, BUTTON_PRESS_DOWN, tts_report_cb, NULL);
bsp_btn_register_callback(BOARD_BTN_ID_ENTER, BUTTON_PRESS_DOWN, tts_welcome_report_cb, NULL);
bsp_btn_register_callback(BOARD_BTN_ID_NEXT, BUTTON_PRESS_DOWN, tts_lalal_report_cb, NULL);
整个程序的流程图如下:
六. 活动总结与未来计划
通过对本项目的辛苦学习,对esp32模块一无所知的我有了大概的了解,能够较熟悉esp32的编程架构,一直对esp32的无线能力感兴趣,这次让我初步了解了esp32板卡,受益匪浅。未来期望再次参加活动,像更多大佬学习新技能,学习更多板卡的环境搭建,开拓自己的视野,让自己能够在大佬的道路上前进几步,非常感谢电子森林。在下载程序的过程中,遇到个问题,通过linux虚拟机向串口下载程序,会失败,通过window物理机,则能成功,在群里问过各个大佬,没有解决方案,后续会继续调查一下是否是官方的下载实现方案缺少一些兼容性。