| 本帖最后由 云天 于 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打造智能舵机云台与拍照识别系统
 
 
 
 
 
 
 
 |