G2-V2|PIR 迎宾与声音事件纯数字模拟
证据分层:本页全部为【主机逻辑测试】+【Wokwi 数字模拟】;声音是事件模拟(串口打印
[PLAY_WELCOME]等),不宣称 DFPlayer 或任何真实音频器件已验证;不进行实物接线。 日期:2026-11-07。G2-V1 的controller.h作为基线原样保留(本阶段零改动),迎宾逻辑为新增独立模块greeter.h,两者并存不重构。
目标
在 G2-V1 三态灯控之上,验证 PIR 触发欢迎演出的控制逻辑:触发/冷却/防重复/手动按钮优先/上电默认。全部在数字层完成,为 G2-V3(音频器件选型)与 G4(实物)提供可复用逻辑。
交付物(source-data/christmas-magic-tent/g2-v2/)
| 文件 | 说明 |
|---|---|
firmware/greeter.h |
PresenceGreeter 纯逻辑类(Arduino 无关,参数可注入:冷却 15s / Welcome 3s / Story 5s 为生产默认) |
host-tests/test_g2v2.cpp + RESULTS.txt |
6 场景宿主测试(含与 StarController 联演) |
wokwi/diagram.json |
UNO + 按钮 D2(键盘 Q)+ 滑动开关模拟 PIR(D3)+ 4× WS2812(D6) |
wokwi/StarLightGreeter.ino |
集成演示 sketch(两控制器并行运行,声音映射为串口事件) |
逻辑设计(验收口径)
| 行为 | 语义 |
|---|---|
| PIR 上升沿 | 触发演出事件:Welcome/Story 交替(sketch 映射为 PLAY_WELCOME/PLAY_STORY) |
| 冷却 | 距上次触发时刻 < CooldownMs(生产 15s)不重播 |
| 播放中再次触发 | 忽略:不重启、不排队、不打断 |
| 手动按钮优先 | 灯切到 Off 时演出立即挂起;Off 期间 PIR 不触发;重新点亮后需新的上升沿 |
| 上电默认 | Idle 不播放;begin 时 PIR 高电平(HC-SR501 预热)被抑制,需先见下降沿 |
| 声音 | 仅事件:event() 返回 None/Welcome/Story,由 sketch 打印;无音频器件 |
StarController 三态灯控与 PresenceGreeter 完全解耦:sketch 每帧把 controller.mode() 作为 lightMode 传给 greeter.update()。
主机逻辑测试(全部通过)
编译运行:cd source-data/christmas-magic-tent/g2-v2/host-tests && c++ -std=c++11 -Wall -o test_g2v2 test_g2v2.cpp && ./test_g2v2
T1 上电默认(预热抑制): PASS
T2 连续触发防重复+冷却: PASS
T3 播放中再触发忽略: PASS
T4 手动按钮优先级: PASS
T5 冷却边界(59/60): PASS
T6 事件交替: PASS
ALL PASS: 6 类行为 / 6 场景(greeter 纯逻辑 + 控制器联演)
覆盖对照(验收要求四项全覆盖):连续触发✓(T2)播放中再次触发✓(T2/T3)手动按钮优先级✓(T4:播放中关灯立即停、Off 期间不触发、复灯后新上升沿才触发、事件按交替序接续)上电默认状态✓(T1:预热高电平抑制)。附加:冷却边界(T5,59/60ms)、事件交替(T6)。
测试开发中修正 2 处测试脚本自身错误:播放中触发点落在播放结束后(T2 时间轴)、事件交替断言写反(T4 应为 Story)。greeter.h 逻辑零返工。
Wokwi 数字模拟
wokwi/diagram.json:PIR 用滑动开关模拟(D3,HIGH=有人活动)——Wokwi 无原生 PIR 部件,开关即理想化的 PIR 输出;正式 PIR(HC-SR501 的重触发/单稳跳线、预热期)属于 G4 实物验证。
操作(在正常前台浏览器,本页不再投入自动化):重建项目(步骤同 G2-V1,多一个 greeter.h 与滑动开关)→ 运行 → 敲 Q 点亮 → 拨动开关模拟有人进入 → 串口出现 [PIR] motion detected + [PLAY_WELCOME],3 秒后 [AUDIO_DONE];15 秒内再拨不重播;长按 Q 关灯后拨动开关无事件。
验收
- G2-V1 控制器基线零改动(本次未触碰
controller.h;G2-V1 回归 11 场景重跑 PASS) - PIR 触发、冷却(15s 生产值/可注入)、防重复欢迎逻辑实现并有测试
- 声音为 PLAY_WELCOME / PLAY_STORY 事件模拟,文档与代码均未宣称真实 DFPlayer 验证
- 连续触发 / 播放中再触发 / 手动按钮优先级 / 上电默认状态 四项全覆盖(T1–T4)
- 可复现模拟:源文件 + diagram + 集成 sketch 入仓
- 无实物接线、无采购
- Wokwi 交互运行截图——与 G2-V1 同因(无头环境仿真时钟停滞)待人工,不作为本关门槛
- 真实 PIR(HC-SR501 跳线/预热/透镜朝向)——G4 实物阶段
出问题怎么办
- 测试编译找不到头文件:
greeter.h在g2-v2/firmware/,测试的相对 include 以仓库路径为准,勿移动目录。 - Wokwi 里拨开关没事件:灯在 Off(greeter 挂起是设计行为);或刚播完还在 15s 冷却内;或开关接的是 1/3 脚(公共脚是 2)。
- 想改冷却/时长:改
PresenceGreeter构造参数(生产默认在 sketch 的greeter定义处),不要改greeter.h常量语义。 - 真实 DFPlayer 接入:属 G2-V3/G4;本层只保证事件时序正确,接线与供电另行评审。
局限性声明
模拟中的 PIR 是理想开关:无预热期、无误触发、无探测死角。事件与"声音"之间无音频链路。冷却/时长默认值为设计建议,未按孩子实际行为标定。本页不构成任何实物接线或电气结论。