岑剑伟 发表于 前天 18:26

K10 小智深度定制功能重磅开源

本帖最后由 岑剑伟 于 2025-8-17 18:26 编辑

K10 小智深度定制功能重磅开源
   行空板 K10作为一款专为信息科技教学打造的开发板,凭借其丰富的功能特性与超高性价比,在编程学习和 AI 项目教学等场景中独领风骚。它的硬件资源高度集成,摄像头、2.8 寸彩色 LCD、、WiFi、蓝牙、RGB 指示灯以及温湿度、环境光、加速度等多种传感器一应俱全。 得益于麦克风及扬声器的集成,用其构建小智成为了通往现代化编程学习路径。 本项目在小智聊天机器人蓬勃发展之时,结合小智mcp机制及乐鑫IDF编程的强大功能与灵活性兼具特性,深度挖掘K10的潜能,完成了目前功能最完善K10- MCP综合体,开源内容极为精妙,值得深入学习。




一、传感器数据获取 (传感器数据采集成功案例)

   完成了k10板载传感器的IDF编程环境的驱动库构建,特别针对小智运行环境及场景的优化提供数据获取回调函数,可以让传感器数据穿越各种层,后台自动更新,对小智主线程无干扰,可以增加数据平稳处理,减少数据波动。
(1)板载温湿度传感器数据采集
(2)光照强度传感器数据采集
(3)加速度传感器数据采集。
file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml11588/wps1.jpg
K10小智项目文件系统
    以AHT20为例,其他两个传感器的实现原理一致。特点在于深度融合小智,通过继承复用I2C通信功能,封装传感器命令与解析逻辑,接口简洁。利用定时器与回调机制解耦,支持灵活设置采集间隔,数据回调实现分层处理,实现AHT20温湿度传感器的周期性数据采集功能。

file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml11588/wps2.jpg

1. Aht20Sensor构造函数
   继承特性:通过初始化列表I2cDevice(i2c_bus, addr)调用父类构造函数,表明Aht20Sensor是I2cDevice的子类,复用 I2C 通信基础功能(如数据收发),减少代码冗余。
2.传感器初始化
用于确保 Aht20 进入可工作状态,步骤如下:(1)发送初始化命令
定义命令数组init_cmd(包含Aht20_CMD_INIT(0xBE)和参数 0x08),通过i2c_master_transmit发送;(2)检查校准状态
读取状态寄存器(ReadReg(Aht20_CMD_STATUS)),通过Aht20_STATUS_CALIB位(0x08)判断是否校准完成,更新calibrated_变量;


3.数据读取核心逻辑

   定时器是周期性采集的 “触发器”,基于硬件时钟实现固定间隔触发。代码中,StartReading通过esp_timer_start_periodic启动定时器,自动执行 “触发测量→等待→解析→传递数据” 全流程。相比轮询,定时器精度更高(微秒级),且仅在触发时占用资源,降低 CPU 空转损耗,实现 “一次配置,持续采集”。数据自动后台更新,用户无后顾之忧。
   数据读取逻辑遵循 “触发 - 等待 - 校验 - 解析” 四步流程,保障可靠性与效率。先通过TriggerMeasurement发送标准命令帧(如0xAC,0x33,0x00),严格匹配传感器协议;等待阶段按手册设置 75ms 延迟,避免过早读取无效数据。读取后先校验状态位(AHT20_STATUS_BUSY),确保数据就绪再解析。采用位运算直接提取 20 位原始值,结合公式快速转换为物理量,兼顾精度与速度。

(1)定时器回调函数(ReadTimerCallback)
   作用:作为定时器与类非静态逻辑的 “桥梁”,因 ESP 定时器要求回调为静态 / 全局函数,需通过此函数中转。 逻辑:接收arg(传感器实例指针)→转换为Aht20Sensor*→调用OnReadTimer执行数据读取。
(2)数据读取执行器(OnReadTimer () 方法)
触发测量:调用TriggerMeasurement发送命令,失败则记录错误并退出。 等待结果:vTaskDelay(pdMS_TO_TICKS(50))延迟 50ms,等待传感器完成测量。 读取解析:调用ReadMeasurement读取 7 字节数据,解析为温度和湿度。 结果回调:若成功且注册了Aht20Sensor_callback_,则通过该回调传递数据给上层。

(3)数据读取与解析(ReadMeasurement 方法)
读取数据:通过ReadRegs获取 7 字节buffer(含状态和原始值)。状态检查:通过buffer的Aht20_STATUS_BUSY位判断传感器是否忙碌。湿度解析:从buffer-buffer提取 20 位原始值→公式湿度 = 原始值 × 100 / 2²⁰。 温度解析:从buffer-buffer提取 20 位原始值→公式温度 = 原始值 × 200 / 2²⁰ - 50。
(4)Aht20 数据解码原理
(1)数据格式约定:7 字节数据中,buffer-3存湿度原始值,buffer-5存温度原始值(均为 20 位)。 (2)位运算提取:通过移位和逻辑运算拼接 20 位原始值(如湿度:(buffer << 12) | (buffer << 4) | ((buffer & 0xF0) >> 4))。 (3)物理量转换:按传感器手册公式将原始值映射为实际温湿度(0-100% 湿度,-40~85℃温度)。
3.回调机制详解

   通过 “静态回调中转” 消除模块依赖:定时器组件要求回调为静态 / 全局函数,而传感器逻辑在非静态方法中。代码中,静态函数ReadTimerCallback接收定时器触发,通过arg参数恢复传感器实例指针,再调用非静态方法OnReadTimer。此举让定时器与传感器逻辑独立维护,定时器无需知晓传感器细节,传感器也不依赖定时器实现,便于模块复用与修改。

(1)两种回调的区别(定时器回调 vs 数据回调)

项目中容易搞混的两个回调函数,值得关注

维度
定时器回调(ReadTimerCallback)
数据回调(Aht20Sensor_callback_)

触发者
系统定时器组件(定时到达时)
Aht20Sensor 类(数据读取成功后)

作用
驱动传感器周期性读取
向上层传递温湿度数据

调用时机
由定时器间隔决定(如 1 秒 / 次)
每次成功读取数据后



(2)回调函数原理与 std::function 使用
回调本质:通过函数指针 / 对象传递函数,在特定事件(如数据就绪)时调用,实现模块解耦(传感器负责采集,上层负责处理)。
std::function 作用:C++11 的通用函数封装器,可存储函数指针、lambda、成员函数(需绑定this)等,比传统函数指针更灵活。
   4.Mcp实现<font face="Times New Roman">mcp_server.AddTool("self.get_temp_humid",
                     "获取板载温湿度传感器数据",
                     PropertyList(), (const PropertyList &properties) -> ReturnValue
                     {
                        auto &board = Board::GetInstance();
                        return board.get_temp_humid_sensor(); });
    mcp_server.AddTool("self.get_als_sensor",
                     "获取板载光照强度传感器数据",
                     PropertyList(), (const PropertyList &properties) -> ReturnValue
                     {
                        auto &board = Board::GetInstance();
                        return board.get_als_sensor(); });</font>

完整学习地址:https://mp.weixin.qq.com/s/PugufTz_SdQluQlTYivc1Q


二、B站粉丝数监控 (B站粉丝查询最佳实现)

   核心功能是通过调用B 站 API获取指定用户粉丝数,支持定时刷新、手动刷新及 Wi-Fi 连接状态变化时自动更新;关键技术包括使用板卡的CreateHttp() 函数创建 HTTP 客户端、解析 JSON 响应数据,以及通过Wi-Fi 事件处理(连接时启动 1 分钟定时器更新、断开时停止)保障稳定性。
深入讲解地址:https://mp.weixin.qq.com/s/bwqat4xvKx4Y6PFedjvcYA
file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml11588/wps3.jpg
file:///C:/Users/ADMINI~1/AppData/Local/Temp/ksohtml11588/wps4.jpg
(1)可设置B站用户UID
注意:目前是设置的博主的B站账号,需要改成自已的,欢迎朋友们来B站交流。
(2)定时获取并更新粉丝数量
(3)提供粉丝数查询和手动刷新功能
(4)通过WiFi连接事件自动管理更新任务

mcp_server.AddTool("self.BilibiliFans.uid",
                     "B站用户ID",
                     PropertyList(), (const PropertyList &properties) -> ReturnValue
                     { return uid_; });
    mcp_server.AddTool("self.BilibiliFans.set_uid",
                     "设置B站用户ID",
                     PropertyList({Property("uid", kPropertyTypeString)}), (const PropertyList &properties) -> ReturnValue
                     {
            uid_ = properties["uid"].value<std::string>();
            ESP_LOGI(TAG, "设置B站用户ID为: %s", uid_.c_str());
            return true; });
    mcp_server.AddTool("self.BilibiliFans.report_fansCount",
                     "汇报粉丝数量",
                     PropertyList(), (const PropertyList &properties) -> ReturnValue
                     { return follower_count_; });

    mcp_server.AddTool("self.BilibiliFans.flash_fansCount",
                     "刷新粉丝数量",
                     PropertyList(), (const PropertyList &properties) -> ReturnValue
                     {
      ESP_LOGI(TAG, "刷新B站粉丝数量");
      UpdateFansCount();
      return true; });
retur
{};

}

三、文本处理功能 (小智MCP制作经验提炼)
(1)TTS复读功能:原样重复用户输入的文本
   基于对小智mcp机制的深入理解,巧妙使用了小智对话功能,网友倾情奉献。

(2)翻译功能:提供中英文互译接口
   金山词霸的每日一句,学习娱乐两不误。基于http定向数据获取及json数解析,必学必会,要考试的。
<font face="Times New Roman">

    mcp_server.AddTool("self.get_hitokoto",
                     "给我开心地随便说一句话,一言",
                     PropertyList(), (const PropertyList &properties) -> ReturnValue
                     {
                        get_hitokoto();
                           return hitokoto_; });
    mcp_server.AddTool("self.hitokoto_source",
                     "刚才随便说的那一句是出自哪里",
                     PropertyList(), (const PropertyList &properties) -> ReturnValue
                     { return from_; });
    mcp_server.AddTool("self.get_note",
                     "获取每日中英对照鸡汤文",
                     PropertyList(), (const PropertyList &properties) -> ReturnValue
                     {
         get_note();
                           returneveryday_soup_; });
}

</font>
四、板载led控制(小智控制Led的典范)   


该功能由df官方完成,它通过LedStripControl类管理一个圆形LED灯带,提供亮度调节、颜色控制和动画效果等功能。 主要功能包括:
(1)亮度控制:支持0-8级亮度调节,使用指数映射算法实现自然的亮度变化
(2) 颜色控制:可单独设置每个LED或所有LED的颜色(RGB模式)
(3) 动画效果:实现闪烁和跑马灯效果
(4) 配置保存:自动保存亮度设置到配置文件中
(5) 远程控制:通过MCP服务器提供API接口,支持外部命令控制

控灯功能完整版,学玩这个你也可以去ZB了。
另外,K10自带摄像头,看图识物也是标配,性能杠杠滴。



五、在线歌曲播放功能(小智高阶功能实现,难度系数?)


   在这在线播放音乐的功能太精妙了,值得深入学习。

感谢功力深厚大佬开源:https://github.com/Maggotxy/xiaozhi-esp32-music
该项目日前升级到了1.8.5版本,1.7.6版本已不能正常播放,升级后需要到他们Q群用小智MAC 码获取授权。

需要进入[小智后台](https://xiaozhi.me/),找到对应设备,修改角色配置,替换音乐播放逻辑,如果想返回原来状态,删除对应内容即可。
- 选择 DeepSeekV3 大语言模型
- 在人物介绍中末尾加入
- 收到音乐相关的需求时,只使用 MPC tool `self.music.play_song` 工具,同时禁止使用 `search_music` 功能。
小智后台角色介绍添加:
- 电台选择:根据用户需求从预设的电台列表中模糊搜索,如果找不到则随机选择一个电台播放。预设电台:80后音悦台(ID: 20207761)、流行音乐(ID: 4938)、清晨音乐(ID: 4915)、长沙城市之声(ID: 4237)、怀旧(ID: 1223)。


在线听歌听电台,太安逸了,是不是还可以做一个每天电台闹醒我呀。



注意事项:
   该项目使用的是小智1.8.5版本,功能已很完善,本项目仅在该版本下进行测试,后续版本机制变化较大,并不完全适用。
   提供学习源码:https://gitee.com/genvex/xiaozhi-esp32-music_185/tree/main/main/boards/df-k10
测试固件:固件也在该文件夹中。

https://www.bilibili.com/video/BV1KzuzzaEhU?buvid=Z343EF33C8185D50402F985852378FFD6AAB&is_story_h5=false&mid=UeMYnHruLfOHHdo8CDiFSQ%3D%3D&plat_id=116&share_from=ugc&share_medium=iphone&share_plat=ios&share_session_id=FC808721-6E42-445D-9982-B89A5C7C5045&share_source=WEIXIN&share_tag=s_i&spmid=united.player-video-detail.0.0×tamp=1755424892&unique_k=sQy0zZ0&up_id=396355825&share_source=weixin


https://www.bilibili.com/video/BV1B5YkzUEPu?buvid=Z343EF33C8185D50402F985852378FFD6AAB&is_story_h5=false&mid=UeMYnHruLfOHHdo8CDiFSQ%3D%3D&plat_id=116&share_from=ugc&share_medium=iphone&share_plat=ios&share_session_id=C70AFB17-39C5-46AA-920E-83371DCA380C&share_source=WEIXIN&share_tag=s_i&spmid=united.player-video-detail.0.0×tamp=1755424006&unique_k=6tjpBj6&up_id=396355825&share_source=weixin
文末提供测试固件,0x00偏移刷入。
有使用问题,欢迎提问。










loria 发表于 昨天 10:00

牛啊,前来学习
页: [1]
查看完整版本: K10 小智深度定制功能重磅开源