云天 发表于 2025-9-6 16:20:04

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

本帖最后由 云天 于 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. 硬件初始化

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

#include <esp_timer.h>

       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)}),
                     (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) 运行转换工具:
python lvgl_tools_gui.py
(xiaozhi-esp32-main\managed_components\78__xiaozhi-fonts\src)


【测试与调试】

       完成代码编写和硬件配置后,就可以将代码烧录到行空板K10上进行测试了。在测试过程中,注意检查闹钟是否能按时提醒,提示音是否正确播放,以及表情包图片是否正确显示。
【演示视频】
https://www.bilibili.com/video/BV1JYaqzME96/?share_source=copy_web
【总结】
       通过这个项目,我们不仅实现了一个功能丰富的智能闹钟,还学会了如何使用行空板K10和小智AI进行开发,以及如何个性化设备的提示音和表情包图片。这个项目不仅适合初学者学习物联网开发,也适合有一定基础的创客进行进一步的拓展和创新。


【往期相关项目】

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






页: [1]
查看完整版本: 行空板K10和小智AI打造个性化智能闹钟