🛠 硬件清单
| 序号 |
模块 |
型号 |
接口 |
功能 |
| 1 |
主控 |
STM32F103CBTx |
— |
ARM Cortex-M3, 128KB Flash, 20KB RAM |
| 2 |
AI 模组 |
AiPi-PalChatV1 |
UART2 @ 115200 |
AI 语音交互 + MCP 协议通信 |
| 3 |
OLED 屏 |
SSD1306 128×64 |
SPI1 |
9 页信息显示 + 猫咪动画 |
| 4 |
字库芯片 |
GT20L16S |
SPI1 (共享) |
GB2312 中文字库 ROM |
| 5 |
温湿度 |
SHT30-DIS |
I²C (软) |
±0.2°C 温度, ±2%RH 湿度 |
| 6 |
PD 受电 |
CH224K |
I²C (软) |
USB PD/PPS 快充, 5-28V |
| 7 |
灯带 |
WS2812B ×60 |
TIM1 CH4 PWM+DMA |
可寻址 RGB LED |
| 8 |
红外模块 |
HXD039B2-MML |
UART3 @ 57600 |
红外学习 + 空调控制 |
| 9 |
毫米波雷达 |
Rd-03L_V2 |
GPIO PA8 |
24GHz 人体存在检测 |
| 10 |
继电器 |
SRD-05VDC |
GPIO PB5 |
开关量输出 |
| 11 |
按键 |
轻触开关 ×2 |
GPIO PB4, PB8 |
OLED 翻页控制 |
| 12 |
调试器 |
ST-Link V2 |
SWD |
烧录 + 调试 |
🔌 引脚连接
STM32F103CBTx
SPI1 ──────┬── MOSI (PA7) ─── SSD1306 OLED (DIN)
├── SCK (PA5) ─── SSD1306 OLED (CLK)
├── CS1 (PA4) ─── SSD1306 OLED (CS)
└── CS2 (PA3) ─── GT20L16S 字库 (CS)
USART1 ─── TX (PA9) / RX (PA10) ─── 调试串口 (115200)
USART2 ─── TX (PA2) / RX (PA3) ─── AI 模组 UART-MCP
USART3 ─── TX (PB10)/ RX (PB11)── HXD039B2 红外模块 (57600)
I²C (软) ── SDA (PB6) / SCL (PB7) ─── SHT3x + CH224
PWM+DMA ── TIM1 CH4 (PA11) ──── WS2812B 灯带 DIN
GPIO ────┬── PA8 ─── Rd-03L_V2 雷达 OT1 (人体存在)
├── PB5 ─── 继电器控制
├── PB4 ─── 按键 UP (上翻页)
├── PB8 ─── 按键 DOWN (下翻页)
└── PB1 ─── HXD039B2 BUSY (红外忙检测)
SWD ─────── SWDIO / SWCLK ─── ST-Link V2 调试器
🏗 软件架构

🎮 OLED 界面
9 页信息显示,双按键 (UP/DOWN) 翻页:
| 页码 |
标题 |
内容 |
| 1/9 |
🖥 系统 |
项目名 / 作者 / 公司 / SHT3x 状态 |
| 2/9 |
🌡 温度 |
实时温度数值 (精度 0.1°C) |
| 3/9 |
💧 湿度 |
实时湿度数值 (精度 0.1%) |
| 4/9 |
📊 任务监控 |
FreeRTOS 任务名 / 状态 / 优先级 / 栈余量 (自动轮播) |
| 5/9 |
📡 UART 数据 |
AI 模组串口原始数据实时滚动显示 |
| 6/9 |
🤖 AI 模块 |
AI 事件状态 / WiFi 连接状态 / MCP 文本滚动 |
| 7/9 |
🐱 猫咪动画 |
28 帧像素猫咪动画 (可选启用,~28KB Flash) |
| 8/9 |
🔧 MCP 工具 |
已注册工具列表 + 描述 (自动轮播) |
| 9/9 |
📡 红外学习 |
学习状态 / 码组显示 / 按键触发学习 |
💡 交互提示:进入第 9 页自动开始红外学习;进入第 8 页自动触发红外学习复位。
📸 OLED 实拍
| 屏幕 1 — 系统信息 |
屏幕 2 — 温度 |
屏幕 3 — 湿度 |
 |
 |
 |
|
| 屏幕 4 — 任务监控 |
屏幕 5 — UART 数据 |
屏幕 6 — AI 模块 |
 |
 |
 |
|
| 屏幕 7 — 猫咪动画 |
屏幕 8 — MCP 工具 |
屏幕 9 — 红外学习 |
 |
 |
 |
📸 MCP 交互流程

🤖 MCP 工具
项目向 AI 模组注册了 4 个 MCP 工具,每个工具都有完整的 JSON Schema 定义:
1. ACSwitch — 空调开关
{
"name": "ACSwitch",
"description": "空调开关控制工具,用于查询和设置空调的开关状态",
"inputSchema": {
"properties": {
"enabled": {
"description": "用于控制空调打开和关闭",
"type": "boolean"
}
}
}
}
支持操作:set (开关) / check (查询状态)
2. temperature — 温度调节
{
"name": "temperature",
"description": "温度调节工具,用于设置空调目标温度",
"inputSchema": {
"properties": {
"value": {
"description": "温度值,范围16到31度",
"type": "number"
}
}
}
}
3. acmode — 模式调节
{
"name": "acmode",
"description": "模式调节工具,用于切换空调运行模式",
"inputSchema": {
"properties": {
"value": {
"description": "运行模式:auto自动 cool制冷 dry除湿 fan送风 heat制热",
"type": "string"
}
}
}
}
4. ledstrip — 灯带控制
{
"name": "ledstrip",
"description": "WS2812灯带开关、颜色和亮度控制",
"inputSchema": {
"properties": {
"mode": { "type": "string", "description": "on打开/off关闭/set设置/query查询状态" },
"r": { "type": "number", "description": "红色分量 0-255" },
"g": { "type": "number", "description": "绿色分量 0-255" },
"b": { "type": "number", "description": "蓝色分量 0-255" },
"brightness": { "type": "number", "description": "亮度 0-100" }
}
}
}
对话示例
用户: "把空调打开,调到 26 度制冷模式"
AI: → ACSwitch.set({enabled: true})
→ temperature.set({value: 26})
→ acmode.set({value: "cool"})
MCU: → 红外发射: 开机 + 26°C + 制冷
→ OLED 更新显示
用户: "把灯带调成暖黄色,亮度 50%"
AI: → ledstrip.set({mode: "set", r: 255, g: 180, b: 50, brightness: 50})
MCU: → WS2812 全灯变色
用户: "我离开房间了"
AI: → 不操作 (雷达自动关灯,无需 AI 干预)
MCU: → Rd-03L 检测无人 → 5 秒后自动熄灯
📂 项目结构
XEMOWO_TEST12_MX/
├── Core/
│ ├── Inc/ # 头文件 (HAL 配置、FreeRTOS 配置)
│ │ ├── main.h # 主程序头文件
│ │ ├── gpio.h / dma.h / spi.h # 外设初始化声明
│ │ ├── tim.h / usart.h # 定时器/串口声明
│ │ ├── FreeRTOSConfig.h # FreeRTOS 配置
│ │ └── stm32f1xx_hal_conf.h # HAL 模块裁剪
│ └── Src/ # 源文件
│ ├── main.c # 入口: 时钟配置 + 外设初始化
│ ├── freertos.c # ★ 核心: 任务 + MCP 工具 + UI
│ ├── gpio.c / dma.c / spi.c # 外设 HAL 初始化
│ ├── tim.c / usart.c # 定时器/串口 HAL 初始化
│ ├── stm32f1xx_it.c # 中断服务函数
│ └── stm32f1xx_hal_msp.c # HAL MSP 层
├── components/ # ★ 外设驱动组件库
│ ├── SHT3x/ # SHT3x 温湿度传感器驱动
│ ├── SSD1306/ # SSD1306 OLED 显示驱动
│ │ └── gt20l16s/ # GT20L16S 中文字库芯片驱动
│ ├── ws2812/ # WS2812B 灯带驱动 + 色彩数学库
│ ├── ch224/ # CH224 USB PD 控制器驱动
│ ├── hxd039b2/ # HXD039B2 红外串口模块驱动
│ ├── radar/ # Rd-03L_V2 毫米波雷达驱动
│ ├── relay/ # 继电器 GPIO 驱动
│ ├── log/ # 彩色日志系统
│ ├── emMCP_config.h # emMCP 框架配置文件
│ ├── salary_cat_frames.h # 猫咪像素动画数据 (28 帧)
│ └── CMakeLists.txt # 组件库构建
├── Bsp/ # 板级支持包
│ ├── spi/ # SPI 硬件驱动 (含 DMA)
│ ├── i2c/ # I²C 软件模拟驱动
│ ├── delay/ # 微秒/毫秒延时
│ └── pwm_dma/ # WS2812 PWM+DMA 底层驱动
├── Drivers/ # STM32 官方驱动
│ ├── CMSIS/ # Core + Device (ST)
│ └── STM32F1xx_HAL_Driver/ # HAL 库
├── Middlewares/ # 第三方中间件
│ └── Third_Party/FreeRTOS/ # FreeRTOS 内核
├── cmake/ # CMake 构建配置
│ ├── gcc-arm-none-eabi.cmake # ARM GCC 工具链
│ ├── starm-clang.cmake # ST ARM Clang 工具链
│ └── stm32cubemx/ # CubeMX 生成代码的 CMake
├── 9Mod_MCPBorad.ioc # STM32CubeMX 项目文件
├── CMakeLists.txt # 顶层 CMake 构建
├── CMakePresets.json # CMake 预设 (Debug/Release)
├── STM32F103XX_FLASH.ld # 链接脚本
├── openocd.cfg # OpenOCD 调试配置
└── README.md # 本文件
🚀 快速开始
前置要求
| 工具 |
版本 |
说明 |
| ARM GNU GCC |
10.3+ |
arm-none-eabi-gcc 交叉编译器 |
| CMake |
3.22+ |
构建系统 |
| Ninja |
1.10+ |
快速构建工具 |
| STM32CubeMX |
6.x |
(可选) .ioc 配置文件修改 |
| OpenOCD |
0.12+ |
(可选) 烧录调试 |
| ST-Link |
V2 |
调试器硬件 |
编译
# 1. 克隆仓库 (如果还没有)
git clone https://github.com/Ai-Thinker-Open/emMCP.git
cd emMCP/example/XEMOWO_TEST12_MX
# 2. CMake 配置 (Debug)
cmake --preset Debug
# 3. 编译
cmake --build build/Debug
# 输出文件:
# build/Debug/XEMOWO_TEST8.bin ← 烧录文件
# build/Debug/XEMOWO_TEST8.hex ← 备用格式
# build/Debug/XEMOWO_TEST8.elf ← 调试文件
烧录
# 使用 OpenOCD + ST-Link
openocd -f openocd.cfg -c "program build/Debug/XEMOWO_TEST8.bin 0x08000000 verify reset exit"
调试
# 启动 OpenOCD 服务
openocd -f openocd.cfg
# 另开终端,GDB 连接
arm-none-eabi-gdb build/Debug/XEMOWO_TEST8.elf \
-ex "target extended-remote :3333" \
-ex "monitor reset halt" \
-ex "load"
🙏 致谢
本项目基于以下开源项目构建:
| 项目 |
作者/组织 |
许可 |
说明 |
| emMCP |
安信可科技 (Ai-Thinker) |
MIT |
嵌入式 MCP 框架 |
| STM32CubeMX |
STMicroelectronics |
— |
HAL 代码生成 |
| FreeRTOS |
Amazon Web Services |
MIT |
实时操作系统 |
| CMSIS |
ARM Limited |
Apache 2.0 |
Cortex-M 软件接口 |
| cJSON |
Dave Gamble |
MIT |
轻量 JSON 解析库 |
特别感谢
- 🐱 猫咪像素动画素材来源于网络,仅供学习参考
- 🤖 AI 模组由 安信可 AiPi-PalChatV1 提供 MCP 通信能力
- 🔧 本项目作者:XEMOWO
|