数字模拟 / g2-v2建议耗时 15 分钟

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 是理想开关:无预热期、无误触发、无探测死角。事件与"声音"之间无音频链路。冷却/时长默认值为设计建议,未按孩子实际行为标定。本页不构成任何实物接线或电气结论。

本章操作已通过?

完成所有勾选项后可标记本章完成。个人进度只存储在浏览器。

Maker Lab · 用真实动手验证每一步。本站为独立学习记录,与上游项目无官方合作关系。
制作日期 2026-11-06 · 许可与来源 · 新增项目