14浏览
查看: 14|回复: 0

[K10项目分享] 行空板K10和小智AI打造个性化智能闹钟

[复制链接]
本帖最后由 云天 于 2025-9-6 17:06 编辑

       在数字化时代,智能设备已经深入到我们生活的方方面面。今天,我将分享一个有趣的创客项目——如何使用行空板K10结合小智AI制作一个个性化的智能闹钟,并且修改表情包图片,让设备更加符合个人喜好。

【项目背景】

       行空板K10是一款功能强大的开发板,它集成了多种传感器和接口,非常适合用于物联网和智能设备的开发。小智AI则是一个智能语音助手,能够通过语音交互完成各种任务。将两者结合起来,我们可以制作一个既能提醒时间又能与用户互动的智能闹钟。
行空板K10和小智AI打造个性化智能闹钟图5

【硬件准备】

    - 行空板K10
    - 小智AI开发环境
    - 电脑(用于编程和配置)
    - 数据线(连接行空板K10和电脑)
    - 3.7V锂电池(为行空板K10供电)- LED灯环接行空板k10引脚P1

行空板K10和小智AI打造个性化智能闹钟图6

【软件准备】

    - 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. 硬件初始化

       在代码中,需要用于提供定时器相关的功能。这个头文件包含了创建、启动、停止和删除定时器的函数。

  1. #include <esp_timer.h>
复制代码


       3. 闹钟功能实现

       闹钟功能的核心是使用ESP-IDF的定时器功能。我们定义了一个定时器回调函数`AlarmTimerCallback`,当定时器到期时,会触发这个回调函数,执行闹钟提醒的操作。(df_k10_board.cc)
  1. // 闹钟相关变量
  2. esp_timer_handle_t alarm_timer_ = nullptr;
  3. std::string alarm_name_;
  4. int seconde_from_now;
复制代码
  1. static void AlarmTimerCallback(void* arg) {
  2.     Df_K10Board* self = static_cast<Df_K10Board*>(arg);
  3.     self->HandleAlarm();
  4. }
复制代码


       在`HandleAlarm`函数中,我们更新显示屏显示闹钟提醒信息,控制LED灯带闪烁,并通过小智AI播放语音提醒。
  1. // 处理闹钟触发
  2. void HandleAlarm() {
  3.     ESP_LOGI(TAG, "闹钟时间到: %s", alarm_name_.c_str());
  4.    
  5.     // 更新显示
  6.     display_->SetEmotion("excited");
  7.     display_->SetStatus("闹钟提醒");
  8.       
  9.     // LED提示
  10.     led_strip_->SetAllColor({255, 0, 0});
  11.     vTaskDelay(500 / portTICK_PERIOD_MS);
  12.     led_strip_->SetAllColor({0, 0, 0});
  13.     vTaskDelay(200 / portTICK_PERIOD_MS);
  14.     led_strip_->SetAllColor({255, 0, 0});
  15.     vTaskDelay(500 / portTICK_PERIOD_MS);
  16.     led_strip_->SetAllColor({0, 0, 0});
  17.    
  18.     // 向小智AI发送文字并语音播报
  19.     SendTextToXiaoZhi();
  20. }
  21. // 向小智AI屏幕发送文字并播放提示语音
  22. void SendTextToXiaoZhi() {
  23.     auto& app = Application::GetInstance();
  24.     app.SetDeviceState(kDeviceStateIdle);
  25.     std::string message = "闹钟时间到了," + alarm_name_;
  26.     app.PlaySound(Lang::Sounds::OGG_ALARM);
  27.     // 显示发送的文字
  28.     display_->SetChatMessage("user", message.c_str());
  29.     vTaskDelay(3000 / portTICK_PERIOD_MS);
  30.     app.SetDeviceState(kDeviceStateListening);
  31. }
  32.     // 物联网初始化,添加对 AI 可见设备
  33.     void InitializeIot() {
  34.         //led_strip_ = new CircularStrip(BUILTIN_LED_GPIO, 3);
  35.         led_strip_ = new CircularStrip(GPIO_NUM_2, 24);
  36.         new LedStripControl(led_strip_);
  37.          auto& mcp_server = McpServer::GetInstance();
  38.          auto& app = Application::GetInstance();
  39.         
  40.         // 提醒闹钟
  41.        mcp_server.AddTool("self.Alarm",
  42.                        "一个闹钟, 可以定时提醒,seconde_from_now:闹钟多少秒以后响;alarm_name:时钟的描述(名字)",
  43.                        PropertyList({Property("seconde_from_now", kPropertyTypeInteger, 10, 0, 7200),Property("alarm_name", kPropertyTypeString)}),
  44.                        [this,&app](const PropertyList& properties) -> ReturnValue {
  45.                            seconde_from_now = properties["seconde_from_now"].value<int>();
  46.                            std::string alarm_name = properties["alarm_name"].value<std::string>();
  47.                            // 调用 AlarmManager 设置闹钟
  48.                            
  49.                            // 保存闹钟名称
  50.                            alarm_name_ = alarm_name;
  51.                            
  52.                            // 创建或重启定时器
  53.                            if (alarm_timer_ != nullptr) {
  54.                             esp_timer_stop(alarm_timer_);
  55.                             esp_timer_delete(alarm_timer_);
  56.                         }
  57.                         
  58.                         esp_timer_create_args_t timer_args = {};
  59.                         timer_args.callback = &Df_K10Board::AlarmTimerCallback;
  60.                         timer_args.arg = this;
  61.                         timer_args.dispatch_method = ESP_TIMER_TASK;
  62.                         timer_args.name = "alarm_timer";
  63.                         
  64.                         if (esp_timer_create(&timer_args, &alarm_timer_) == ESP_OK) {
  65.                             esp_timer_start_once(alarm_timer_, seconde_from_now * 1000000);
  66.                             ESP_LOGI(TAG, "闹钟设置成功: %d秒后提醒 '%s'", seconde_from_now, alarm_name.c_str());
  67.                            
  68.                             // 更新显示
  69.                             // display_->SetEmotion("neutral");
  70.                             //display_->SetStatus(alarm_name.c_str());
  71.                             //std::string message ="闹钟设置成功,将在" +std::to_string(seconde_from_now) + "秒后提醒: " + alarm_name;
  72.                             //display_->SetChatMessage("system", message.c_str());
  73.                            
  74.                             return ReturnValue("闹钟设置成功");
  75.                         } else {
  76.                             return ReturnValue("闹钟设置失败");
  77.                         }
  78.                     });
  79.     }
复制代码


       4. 修改提示音

       为了使闹钟更加个性化,我们可以修改闹钟的提示音。使用`ogg_converter`工具,可以将音频文件转换为OGG格式,适用于小智AI。

       (1) 创建并激活虚拟环境:
  1. python -m venv venv
  2.    source venv/bin/activate # Mac/Linux
  3.    venv\Scripts\activate # Windows
复制代码

       (2) 安装依赖:
  1. pip install ffmpeg-python
复制代码

       (3) 运行脚本:
  1. python xiaozhi_ogg_converter.py
复制代码
行空板K10和小智AI打造个性化智能闹钟图3

       (4)lang_config.h文件里面添加你的配置

  1. extern const char ogg_wificonfig_start[] asm("_binary_wificonfig_ogg_start");
  2.         extern const char ogg_wificonfig_end[] asm("_binary_wificonfig_ogg_end");
  3.         static const std::string_view OGG_WIFICONFIG {
  4.         static_cast<const char*>(ogg_wificonfig_start),
  5.         static_cast<size_t>(ogg_wificonfig_end - ogg_wificonfig_start)
复制代码
      (5)改一下实际播放的音频

  1. app.PlaySound(Lang::Sounds::OGG_ALARM);
复制代码


       5. 修改表情包图片

       为了让设备的显示更加个性化,我们可以修改表情包图片。使用`LVGL图片转换工具`,可以将图片转换为LVGL格式,适用于行空板K10的显示屏。

       (1) 创建并激活虚拟环境:
  1. python -m venv venv
  2.    source venv/bin/activate # Mac/Linux
  3.    venv\Scripts\activate # Windows
复制代码

       (2) 安装依赖:
  1. pip install -r requirements.txt
复制代码

       (3) 运行转换工具:
  1. python lvgl_tools_gui.py
复制代码
行空板K10和小智AI打造个性化智能闹钟图2

(xiaozhi-esp32-main\managed_components\78__xiaozhi-fonts\src)

行空板K10和小智AI打造个性化智能闹钟图1

行空板K10和小智AI打造个性化智能闹钟图4

【测试与调试】

       完成代码编写和硬件配置后,就可以将代码烧录到行空板K10上进行测试了。在测试过程中,注意检查闹钟是否能按时提醒,提示音是否正确播放,以及表情包图片是否正确显示。
【演示视频】

【总结】
       通过这个项目,我们不仅实现了一个功能丰富的智能闹钟,还学会了如何使用行空板K10和小智AI进行开发,以及如何个性化设备的提示音和表情包图片。这个项目不仅适合初学者学习物联网开发,也适合有一定基础的创客进行进一步的拓展和创新。


【往期相关项目】

       1.基于 ESP-IDF 和行空板 K10 的智能风扇与 LED 灯带控制系统
       2.行空板K10打造智能舵机云台与拍照识别系统






您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2025 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail