基于已完整落地的真实项目代码(K210 边缘人脸识别 + STM32F407 下位机 + DX-BT24 BLE 微信小程序 + PySide6 考勤上位机,共 114 项已实现功能)开展的三天 AIoT 全栈实训。
学员:23级大三电子信息(已有 C 下位机 + PySide6 + OpenCV 基础),重点在四端集成联调与 Vibe Coding。
三串口架构讲解、Keil 编译烧录、串口指令控制 LED/蜂鸣器、K210 人脸注册与 USART3 联调、pyserial 解析帧
小程序 BLE 控制(Vibe Coding)、温湿度折线图、HMI 仪表盘扫描动画与 10 秒在场打卡机制
上班/下班场景模式、陌生人报警全链路、考勤规则与 CSV 导出、打包部署、完整演示颁证
AIoT 四端全栈思维、AI 辅助开发体验、串口/BLE 联调方法论、防误触发的工程化思维
| 功能模块 | 功能细节 |
|---|---|
| 人脸检测/识别 | 摄像头实时帧分析,与已注册人员比对,输出 face_index + 置信度 |
| 人脸注册 | 按 BOOT 键现场注册,按 person0/person1… 序号递增建库,支持多人 |
| 陌生人识别 | 未注册人员输出 FACE:unknown:0.0 |
| 识别结果帧 | FACE:person<N>:<score>\r\n 经 UART 发给 F407 |
| 注册成功帧 | REG:person<N>\r\n,F407 本地打印不透传,HMI 据此更新注册状态 |
| 功能模块 | 功能细节 |
|---|---|
| USART1(调试/考勤口) | PA9/PA10,115200,所有模块日志 printf 回显([SYS]/[BLE]/[K210]/[DHT11]/[KEY]),HMI 从此口取 FACE/REG 帧 |
| USART2(BLE 口) | PA2/PA3,9600,连 DX-BT24 透传;256B 环形缓冲 + BLE_Poll() 主循环以 \n 组帧 |
| USART3(K210 口) | PB10/PB11,115200,接收 FACE/REG 帧 |
| DHT11 温湿度 | PG9 单总线 + 4.7kΩ 上拉,40bit 读取期间 __disable_irq() 防 TIM4 干扰,校验和验证,每 5s 上报 + 上电立即上报 |
| LED 6 模式驱动 | TIM4 1kHz LED_Tick():全灭/呼吸(默认)/跑马/流水/爆闪/常亮 |
| 蜂鸣器 | CMD:BEEP 短鸣 200ms;陌生人报警长鸣 3s |
| K210 事件响应 | 识别成功→LED 常亮 3s;陌生人→爆闪+蜂鸣 3s;超时基于 g_sys_ms 恢复呼吸灯 |
| BLE 指令解析 | 7 条 CMD:* 指令,收到任意 CMD 清除 K210 效果锁(s_k210_active=0) |
| 按键本地调试 | KEY1 流水 / KEY2 跑马 / KEY3 蜂鸣+爆闪 / KEY4 恢复呼吸灯 |
| 功能模块 | 功能细节 |
|---|---|
| 系统基础 | 暗色主题桌面应用(1200×740),左侧导航 4 页,QThread 串口线程不阻塞 UI,SerialWorker 信号驱动解析 FACE/REG 帧 |
| 仪表盘 | QPainter 扫描线动画(30ms 刷新)、在场计时黄色进度条(0~10s)、识别成功绿色/陌生人红色状态淡出、今日统计卡片、打卡记录表、部门出勤率、连接状态指示 |
| 核心打卡逻辑 ⭐ | 10 秒连续在场才打卡(防误触发);离开超 4s 重新计时(PRESENCE_GAP=4);60 秒防重复打卡;正常/迟到/早退状态判定;陌生人自动写考勤记录 |
| 人员管理 | 工号/姓名/部门/face_index 列表,新增自动分配 face_index,编辑/删除(二次确认),照片上传,REG 帧到来后更新注册状态 |
| 考勤记录 | 日历按日查看、状态颜色区分(绿/黄/橙/红)、今日汇总、导出 CSV |
| 设置 | 串口扫描+连接/断开、实时日志滚动、上下班/迟到/早退时间规则配置 |
| 页面 | 功能细节 |
|---|---|
| 全局 | 暗色主题、自定义 TabBar(emoji 图标)、globalData 状态、wx.setStorageSync 本地持久化、启动恢复历史 |
| 首页 | 实时温度/湿度/舒适度三色卡片、Canvas 2D 温湿度折线图(最近 20 点)、超标 Toast 报警、最近 5 条门禁事件预览、陌生人震动提醒 |
| 控制页 | 上班模式(全亮)/下班模式(呼吸灯)、4 种灯光模式按钮(2×2)、全亮/全灭快捷键、蜂鸣器短鸣(含手机振动)、三组按钮激活互斥、未连接跳转设置页 |
| 考勤页 | 统计条(成功/陌生人/总数)、过滤 Tab、事件列表(最多 50 条)、彩色竖线状态标识、清空记录(二次确认)、实时刷新 |
| 设置页 | BLE 扫描(15s 自动停止)、设备名称搜索过滤、一键连接/断开、温湿度上限 Slider、Service/Char UUID 可配置(默认 FFE0/FFE1)、清除历史 |
| BLE 通信层 | UUID 自动发现(子串匹配,大小写不敏感)、Notify 被动接收、_rxBuf + \n 分帧粘包处理、writeNoResponse 自动降级、意外断开检测 |
CMD:<操作>\r\n
DATA:TEMP:26.0:HUM:58.0\r\n
FACE:<name>:<score>\r\n
| 帧示例 | 含义 | 方向 |
|---|---|---|
CMD:LED_ALL_ON | LED 全部常亮(LED_MODE_ON) | 小程序 → F407 |
CMD:LED_ALL_OFF | LED 全部关灭(LED_MODE_OFF) | 小程序 → F407 |
CMD:MODE_BREATH | 呼吸灯模式(上电默认 / 下班模式) | 小程序 → F407 |
CMD:MODE_FLOW | 流水灯模式 | 小程序 → F407 |
CMD:MODE_RUNNING | 跑马灯模式 | 小程序 → F407 |
CMD:MODE_FLASH | 爆闪模式 | 小程序 → F407 |
CMD:BEEP | 蜂鸣器短鸣 200ms | 小程序 → F407 |
DATA:TEMP:26.0:HUM:58.0 | 温湿度上报,上电立即一次 + 每 5s 一次 | F407 → 小程序 |
FACE:person0:96.8 | 已注册人脸识别成功(face_index=0),LED 常亮 3s | K210 → F407 → HMI/小程序 |
FACE:unknown:0.0 | 陌生人,爆闪 + 蜂鸣 3s,HMI/小程序标红报警 | K210 → F407 → HMI/小程序 |
REG:person0 | K210 注册成功帧,F407 本地打印(不透传 BLE),HMI 更新注册状态 | K210 → F407 → HMI |
\r\n 结束、接收端以 \n 为分帧符。F407 端用 256B 环形缓冲(ISR 写、BLE_Poll() 主循环组帧)防丢帧;小程序端用 _rxBuf 拼接处理 BLE 粘包;收到任意 CMD:* 会清除 K210 触发的 LED 效果锁。这三处是联调时最常见的坑,课上重点讲。| 串口 | 引脚 | 波特率 | 对端 / 职责 |
|---|---|---|---|
| USART1 | PA9/PA10 | 115200 | PC(CH340):日志回显 + HMI 考勤帧来源 |
| USART2 | PA2/PA3 | 9600 | DX-BT24 BLE:小程序双向透传(FFE0/FFE1) |
| USART3 | PB10/PB11 | 115200 | K210:接收 FACE / REG 帧 |
| 外设 | 用途 | 关键参数 |
|---|---|---|
| TIM4 | g_sys_ms 时间戳 + LED_Tick() 动效 | 1kHz(1ms 中断) |
| PG9 | DHT11 单总线 | 4.7kΩ 上拉,读取时关中断 |
| 板载 LED | 6 模式动效 | 呼吸/跑马/流水/爆闪/常亮/全灭 |
| 蜂鸣器 | 短鸣 / 陌生人报警 | 200ms / 3000ms |
| KEY1~4 | 本地调试 | 流水/跑马/爆闪+蜂鸣/恢复默认 |
[BLE]/[K210]/[DHT11] 日志验证执行结果。Day1 上午先用这两条路径建立"指令→现象→日志"的闭环直觉。| 时间 | 内容 | 分工 |
|---|---|---|
| 9:00 | 项目总体介绍:四端架构图讲解,老师演示最终效果(刷脸打卡 + 小程序控灯 + HMI 仪表盘扫描动画) | 📖 老师讲 |
| 9:30 | K210 边缘 AI 介绍:KPU 是什么,为什么本地推理不联网;BOOT 键注册机制与 face_index 设计 | 📖 老师讲 |
| 10:00 | F407 固件 v2.0 代码讲解:USART1/2/3 分工、BLE 环形缓冲 + BLE_Poll() 组帧、TIM4 1kHz LED 驱动、主循环时序 |
📖 老师讲 |
| 10:30 | 学员环境搭建:Keil 工程打开、编译(0 error 0 warning)、ST-Link 烧录,USART1 看到 [SYS] 启动广播 |
✍️ 学员动手 |
| 11:00 | 指令控制实验:手机 BLE 调试 App 连 DX-BT24 发 CMD:MODE_FLOW/CMD:BEEP 等 7 条指令,观察 LED/蜂鸣器响应 + USART1 日志;按 KEY1~4 体验本地调试 |
✍️ 学员动手 |
| 11:30 | 协议详解:\r\n 帧定界、CMD/DATA/FACE/REG 四类帧、环形缓冲为什么能防丢帧、BLE 粘包成因 |
📖 老师讲 |
| 时间 | 内容 | 分工 |
|---|---|---|
| 14:00 | K210 演示:现场按 BOOT 键注册人脸,串口助手看 REG:person0 和 FACE:person0:96.8 输出 |
📖 老师演示 |
| 14:30 | K210 × F407 USART3 联调:识别成功 → LED 常亮 3s;陌生人 → 爆闪 + 蜂鸣 3s 后自动恢复呼吸灯 | 🔗 全员联调 |
| 15:00 | Python 串口通信:pyserial 打开 USART1、按行读取、解析 FACE:name:score 与 DATA:TEMP 帧并打印 |
✍️ 学员写 |
| 15:30 | HMI 框架讲解:PySide6 暗色主窗口 + 左侧导航、QThread SerialWorker、信号槽把帧送进 UI | 📖 老师讲 |
| 16:00 | 学员填写框架:设置页串口扫描/连接/断开 + 实时日志滚动面板(填空式骨架代码) | ✍️ 学员动手 |
| 17:00 | 联调验证:摄像头前刷脸,HMI 日志面板实时显示 FACE 帧;DHT11 温湿度日志每 5s 滚动 | 🔗 全员联调 |
| 17:30 | Day 1 总结 + 布置预习:微信小程序 BLE API(wx.createBLEConnection / Notify / 粘包) | 📖 老师讲 |
CMD:MODE_FLOW / CMD:BEEP → LED/蜂鸣器响应,USART1 有对应日志 ✓| 时间 | 内容 | 分工 |
|---|---|---|
| 9:00 | 小程序开发环境:微信开发者工具、wxml/wxss/js 结构、自定义 TabBar 与暗色主题方案 | 📖 老师讲 |
| 9:20 | BLE 速览:Service/Characteristic/Notify 概念,DX-BT24 的 FFE0/FFE1,UUID 子串匹配自动发现 | 📖 老师讲 |
| 9:30 | Vibe Coding 启动:基于封装好的 ble.js 生成设置页(扫描 15s 自动停止 + 名称过滤 + 一键连接) |
🤖 Vibe Coding |
| 10:00 | 老师带学员 Review:Notify 注册流程、_rxBuf 粘包分帧、writeNoResponse 降级逻辑 |
📖 老师讲 |
| 10:30 | Vibe Coding:生成控制页(上班/下班模式 + 2×2 灯光模式按钮 + 全亮/全灭 + 蜂鸣,三组按钮激活互斥) | 🤖 Vibe Coding |
| 11:00 | 小程序 → DX-BT24 → USART2 完整链路联调:点按钮 → LED 模式切换 + 手机振动 + USART1 日志 | 🔗 全员联调 |
| 11:30 | 验证闭环:首页接收 DATA:TEMP:HUM 帧,温湿度三色卡片实时更新 |
✍️ 学员验证 |
ble.js(适配器初始化/扫描/连接/UUID 发现/Notify/分帧全封装),学员专注业务页面而非 BLE 细节;测试号 AppID 备好
| 时间 | 内容 | 分工 |
|---|---|---|
| 14:00 | Vibe Coding:小程序首页温湿度折线图(Canvas 2D 最近 20 点)+ 考勤页事件列表(过滤 Tab + 彩色竖线) | 🤖 Vibe Coding |
| 14:40 | HMI 仪表盘:QPainter 扫描线动画原理讲解,学员接入 FACE 帧驱动绿色成功/红色陌生人状态显示 | 📖 老师讲思路 ✍️ 学员写 |
| 15:30 | 核心业务 ⭐ 10 秒在场打卡机制:连续在场 10s 才打卡、离开超 4s 重新计时、60s 防重复——学员亲手实现这套防误触发状态机(本日最重要的代码) | ✍️ 学员写 |
| 16:30 | 人员管理页:新增人员自动分配 face_index,与 K210 BOOT 键注册顺序对应;REG 帧到来更新注册状态 | 📖 老师讲 ✍️ 学员写 |
| 17:15 | 全链路验证:刷脸 → 仪表盘黄色进度条走满 10s → 写入考勤记录 → 小程序考勤页同步出现该事件 | 🔗 全员联调 |
| 17:45 | Day 2 总结 + 课后任务:每人注册自己的人脸并在人员管理里建档,明早直接刷脸打卡 | ✍️ 课后任务 |
| 时间 | 内容 | 分工 |
|---|---|---|
| 9:00 | 晨间真实打卡:全员用昨晚注册的人脸刷脸上班打卡,验证迟到/正常状态判定与 60s 防重复 | 🔗 全员联调 |
| 9:30 | Vibe Coding:小程序上班/下班场景模式打磨(一键全亮/呼吸灯 + 激活态动画)—— 学员自己写 Prompt | 🤖 Vibe Coding |
| 10:00 | 陌生人报警全链路:未注册人脸 → F407 爆闪+蜂鸣 → HMI 红色警告+陌生人考勤记录 → 小程序震动+Toast | 🔗 全员联调 |
| 10:30 | 考勤收尾功能:时间规则配置(上下班/迟到/早退阈值)、按日历查记录、导出 CSV、部门出勤率 | ✍️ 学员写 |
| 11:00 | 效果锁专项调试:K210 触发 LED 效果期间小程序下发 CMD 应立即接管(s_k210_active=0),验证两路控制不打架 |
🔗 全员联调 |
| 11:30 | 分组排查 Bug,老师巡场(重点:BLE 断线重连、粘包丢帧、打卡重复计时、DHT11 读取超时) | ✍️ 学员自查 |
| 时间 | 内容 | 分工 |
|---|---|---|
| 14:00 | 各组完整演示:刷脸打卡 + 陌生人报警 + 小程序控灯 + HMI 全程可见(按验收清单逐项演示) | ✍️ 分组演示 |
| 14:45 | Vibe Coding 专题:现场用 AI 给系统加一个学员自定义功能(现场提需求 → 生成 → Review → 演示) | 🤖 Vibe Coding |
| 15:30 | 打包 + 部署:小程序体验版发布扫码可用 | 📖 老师演示 |
| 16:00 | 项目复盘:114 项功能盘点、技术亮点总结、AIoT 全栈简历怎么写、职业路径展望 | 📖 老师讲 |
| 16:30 | 自由时间:互相体验对方系统,录制演示视频留档(B站/简历用) | ✍️ 自由 |
| 17:00 | 🎉 颁发结业证书 + 合影留念 | 🎓 |
| 模块 | 内容 | 完成度 |
|---|---|---|
| F407 固件 v2.0 | 三串口 + BLE 环形缓冲 + DHT11 + LED 6 模式 + 蜂鸣器 + 按键 + K210 事件响应(34 项功能全实现) | ●●●●● 100% |
| K210 程序 | 人脸检测/识别/BOOT 键注册 + FACE/REG 串口帧输出(开箱即用) | ●●●●● 100% |
| HMI 骨架 | 暗色主窗口 + 4 页导航 + SerialWorker 线程 + 帧解析(仪表盘动画与打卡状态机留空给学员) | ●●●○○ 60% |
| 小程序 BLE 底层 | ble.js:适配器/扫描/连接/UUID 自动发现/Notify/分帧粘包全封装 | ●●●●● 100% |
| 小程序参考实现 | 完整 4 页参考版(学员卡住时对照,不直接发放) | ●●●●● 100% |
| 协议/接口文档 | 21-下位机数据接口文件 + 26-完整功能清单(即本文档配套资料) | ●●●●● 100% |
| 内容 | 难度 | 课时 |
|---|---|---|
BLE App 发 7 条 CMD:* 指令控制 LED/蜂鸣器,对照 USART1 日志 |
★★★ | Day1 上午 |
pyserial 读 USART1 + 解析 FACE/DATA 帧 + 实时打印 |
★★★ | Day1 下午 |
| HMI 设置页:串口扫描/连接/断开 + 实时日志滚动 | ★★★ | Day1 下午 |
| HMI 仪表盘:FACE 帧驱动成功/陌生人状态显示 + 淡出动画 | ★★★ | Day2 下午 |
| ⭐ 10 秒在场打卡状态机(连续在场 / 4s 离开重置 / 60s 防重复) | ★★★ | Day2 下午 |
| 人员管理:face_index 自动分配 + REG 帧更新注册状态 | ★★★ | Day2 下午 |
| 考勤规则配置 + 日历查询 + CSV 导出 | ★★★ | Day3 上午 |
| 生成内容 | 推荐工具 | 课时 |
|---|---|---|
| 小程序设置页(BLE 扫描 15s + 名称过滤 + 一键连接/断开) | Cursor | Day2 上午 |
| 小程序控制页(上班/下班模式 + 2×2 灯光按钮 + 互斥激活态) | Cursor | Day2 上午 |
| 小程序首页温湿度折线图(Canvas 2D 最近 20 点) | Cursor / Claude | Day2 下午 |
| 小程序考勤页(统计条 + 过滤 Tab + 事件列表) | Cursor | Day2 下午 |
| 小程序场景模式打磨(激活态动画)—— 学员自己写 Prompt | Cursor | Day3 上午 |
| HMI 界面美化(统计卡片 / 部门出勤率进度条) | Cursor / Claude | Day3 上午 |
| 学员自定义功能(自由发挥,现场 Demo) | 任意 AI | Day3 下午 |
pip install pyside6
pip install pyserial
微信开发者工具(最新稳定版)
测试号 AppID(提前备好)
Cursor 编辑器(Vibe Coding 主力)
Claude(辅助 Review 与修复)
MaixPy 固件(已刷好)
人脸识别程序(开箱即用)
BOOT 键注册,无需 IDE
MobaXterm / SSCOM(串口观察)
Keil MDK 5(已配置 F4 Pack)
STM32F4xx 标准库 V1.8.0
ST-Link 驱动(已安装)
XCOM 串口调试助手