本帖最后由 云天 于 2025-9-6 17:06 编辑
在数字化时代,智能设备已经深入到我们生活的方方面面。今天,我将分享一个有趣的创客项目——如何使用行空板K10结合小智AI制作一个个性化的智能闹钟,并且修改表情包图片,让设备更加符合个人喜好。
【项目背景】
行空板K10是一款功能强大的开发板,它集成了多种传感器和接口,非常适合用于物联网和智能设备的开发。小智AI则是一个智能语音助手,能够通过语音交互完成各种任务。将两者结合起来,我们可以制作一个既能提醒时间又能与用户互动的智能闹钟。
【硬件准备】
- 行空板K10
- 小智AI开发环境
- 电脑(用于编程和配置)
- 数据线(连接行空板K10和电脑)
- 3.7V锂电池(为行空板K10供电)- LED灯环接行空板k10引脚P1
【软件准备】
- ESP-IDF(Espressif IoT Development Framework)
- Visual Studio Code(代码编辑器)
- LVGL图片转换工具(用于将图片转换为LVGL格式)
- OGG批量转换工具(用于将音频文件转换为OGG格式)
- OGG音频文件(用于闹钟提示音)
- 表情包图片(用于个性化显示)
【开发步骤】
1. 环境搭建
安装ESP-IDF
(1) 根据[官方文档](https://docs.espressif.com/proje ... -started/index.html)安装ESP-IDF。
(2) 配置环境变量,确保可以在终端中直接使用`idf.py`命令。
配置Visual Studio Code
(1) 安装Visual Studio Code。
(2) 安装ESP-IDF插件,以便在VS Code中直接使用ESP-IDF功能。
2. 硬件初始化
在代码中,需要用于提供定时器相关的功能。这个头文件包含了创建、启动、停止和删除定时器的函数。
复制代码
3. 闹钟功能实现
闹钟功能的核心是使用ESP-IDF的定时器功能。我们定义了一个定时器回调函数`AlarmTimerCallback`,当定时器到期时,会触发这个回调函数,执行闹钟提醒的操作。(df_k10_board.cc)
- // 闹钟相关变量
- esp_timer_handle_t alarm_timer_ = nullptr;
- std::string alarm_name_;
- int seconde_from_now;
复制代码
- static void AlarmTimerCallback(void* arg) {
- Df_K10Board* self = static_cast<Df_K10Board*>(arg);
- self->HandleAlarm();
- }
复制代码
在`HandleAlarm`函数中,我们更新显示屏显示闹钟提醒信息,控制LED灯带闪烁,并通过小智AI播放语音提醒。- // 处理闹钟触发
- void HandleAlarm() {
- ESP_LOGI(TAG, "闹钟时间到: %s", alarm_name_.c_str());
-
- // 更新显示
- display_->SetEmotion("excited");
- display_->SetStatus("闹钟提醒");
-
- // LED提示
- led_strip_->SetAllColor({255, 0, 0});
- vTaskDelay(500 / portTICK_PERIOD_MS);
- led_strip_->SetAllColor({0, 0, 0});
- vTaskDelay(200 / portTICK_PERIOD_MS);
- led_strip_->SetAllColor({255, 0, 0});
- vTaskDelay(500 / portTICK_PERIOD_MS);
- led_strip_->SetAllColor({0, 0, 0});
-
- // 向小智AI发送文字并语音播报
- SendTextToXiaoZhi();
- }
-
- // 向小智AI屏幕发送文字并播放提示语音
- void SendTextToXiaoZhi() {
- auto& app = Application::GetInstance();
- app.SetDeviceState(kDeviceStateIdle);
- std::string message = "闹钟时间到了," + alarm_name_;
- app.PlaySound(Lang::Sounds::OGG_ALARM);
- // 显示发送的文字
- display_->SetChatMessage("user", message.c_str());
- vTaskDelay(3000 / portTICK_PERIOD_MS);
- app.SetDeviceState(kDeviceStateListening);
- }
- // 物联网初始化,添加对 AI 可见设备
- void InitializeIot() {
- //led_strip_ = new CircularStrip(BUILTIN_LED_GPIO, 3);
- led_strip_ = new CircularStrip(GPIO_NUM_2, 24);
- new LedStripControl(led_strip_);
- auto& mcp_server = McpServer::GetInstance();
- auto& app = Application::GetInstance();
-
- // 提醒闹钟
- mcp_server.AddTool("self.Alarm",
- "一个闹钟, 可以定时提醒,seconde_from_now:闹钟多少秒以后响;alarm_name:时钟的描述(名字)",
- PropertyList({Property("seconde_from_now", kPropertyTypeInteger, 10, 0, 7200),Property("alarm_name", kPropertyTypeString)}),
- [this,&app](const PropertyList& properties) -> ReturnValue {
- seconde_from_now = properties["seconde_from_now"].value<int>();
- std::string alarm_name = properties["alarm_name"].value<std::string>();
- // 调用 AlarmManager 设置闹钟
-
- // 保存闹钟名称
- alarm_name_ = alarm_name;
-
- // 创建或重启定时器
- if (alarm_timer_ != nullptr) {
- esp_timer_stop(alarm_timer_);
- esp_timer_delete(alarm_timer_);
- }
-
- esp_timer_create_args_t timer_args = {};
- timer_args.callback = &Df_K10Board::AlarmTimerCallback;
- timer_args.arg = this;
- timer_args.dispatch_method = ESP_TIMER_TASK;
- timer_args.name = "alarm_timer";
-
- if (esp_timer_create(&timer_args, &alarm_timer_) == ESP_OK) {
- esp_timer_start_once(alarm_timer_, seconde_from_now * 1000000);
- ESP_LOGI(TAG, "闹钟设置成功: %d秒后提醒 '%s'", seconde_from_now, alarm_name.c_str());
-
- // 更新显示
- // display_->SetEmotion("neutral");
- //display_->SetStatus(alarm_name.c_str());
- //std::string message ="闹钟设置成功,将在" +std::to_string(seconde_from_now) + "秒后提醒: " + alarm_name;
- //display_->SetChatMessage("system", message.c_str());
-
- return ReturnValue("闹钟设置成功");
- } else {
- return ReturnValue("闹钟设置失败");
- }
- });
-
- }
复制代码
4. 修改提示音
为了使闹钟更加个性化,我们可以修改闹钟的提示音。使用`ogg_converter`工具,可以将音频文件转换为OGG格式,适用于小智AI。
(1) 创建并激活虚拟环境:
- python -m venv venv
- source venv/bin/activate # Mac/Linux
- venv\Scripts\activate # Windows
复制代码
(2) 安装依赖:
- pip install ffmpeg-python
复制代码
(3) 运行脚本:
- python xiaozhi_ogg_converter.py
复制代码
(4)lang_config.h文件里面添加你的配置
- extern const char ogg_wificonfig_start[] asm("_binary_wificonfig_ogg_start");
- extern const char ogg_wificonfig_end[] asm("_binary_wificonfig_ogg_end");
- static const std::string_view OGG_WIFICONFIG {
- static_cast<const char*>(ogg_wificonfig_start),
- static_cast<size_t>(ogg_wificonfig_end - ogg_wificonfig_start)
复制代码
(5) 改一下实际播放的音频
- app.PlaySound(Lang::Sounds::OGG_ALARM);
复制代码
5. 修改表情包图片
为了让设备的显示更加个性化,我们可以修改表情包图片。使用`LVGL图片转换工具`,可以将图片转换为LVGL格式,适用于行空板K10的显示屏。
(1) 创建并激活虚拟环境:
- python -m venv venv
- source venv/bin/activate # Mac/Linux
- venv\Scripts\activate # Windows
复制代码
(2) 安装依赖:
- pip install -r requirements.txt
复制代码
(3) 运行转换工具:
复制代码
(xiaozhi-esp32-main\managed_components\78__xiaozhi-fonts\src)
【测试与调试】
完成代码编写和硬件配置后,就可以将代码烧录到行空板K10上进行测试了。在测试过程中,注意检查闹钟是否能按时提醒,提示音是否正确播放,以及表情包图片是否正确显示。
【演示视频】
【总结】
通过这个项目,我们不仅实现了一个功能丰富的智能闹钟,还学会了如何使用行空板K10和小智AI进行开发,以及如何个性化设备的提示音和表情包图片。这个项目不仅适合初学者学习物联网开发,也适合有一定基础的创客进行进一步的拓展和创新。
【往期相关项目】
1.基于 ESP-IDF 和行空板 K10 的智能风扇与 LED 灯带控制系统
2.行空板K10打造智能舵机云台与拍照识别系统
|