G2-V1|Wokwi 数字模拟:UNO + 按钮 + 4 颗 WS2812
✅ 2026-11-07 正式验收通过(主机逻辑 + Wokwi 编译/启动/交互三层证据齐备;真实硬件层独立待板型确认,不影响本关关闭)。Wokwi 不再继续投入优化。 证据分层:本页区分【主机逻辑测试】= Mac 上直接编译运行的 C++ 测试;【Wokwi 运行】= wokwi.com 浏览器仿真;【真实硬件验证】= 尚未执行。 日期:2026-11-07(v2,按验收意见收尾)。被测代码
controller.h原样复用(md5063985036d6a00dae6f98e0b0715dc54),一行未改。 ⚠️ 当前家中 Arduino 实物型号未知。Wokwi 基线 = UNO R3(教程既定基线),本页所有内容不构成实物接线结论。
目标
在采购任何电子件之前,验证 V3 星星灯控制逻辑(短按循环 / 长按关闭 / 去抖 / 上电抑制 / 10 分钟超时)在数字环境中成立,并产出可在 Wokwi 一键复现的项目文件。G2-V2(PIR、音频)不在本关范围。
交付物(source-data/christmas-magic-tent/g2/)
| 文件 | 说明 |
|---|---|
firmware/ChristmasStar.ino + controller.h |
生产固件,从 christmas_maker_tutorial_v3.zip 原样复制(md5 校验一致) |
firmware/controller_idle10s.h |
仅 Wokwi 演示用派生头文件:与生产版唯一 diff 为 IdleMs 600000→10000(diff 已验证);去抖 30ms、长按 1200ms 与生产一致 |
host-tests/test_g2.cpp |
主机逻辑测试(11 场景,纯 C++,不依赖 Arduino) |
host-tests/RESULTS.txt |
测试运行输出 |
wokwi/diagram.json |
接线图:UNO R3 + 瞬时按钮(D2,键盘快捷键 Q) + 4× WS2812(D6) |
wokwi/SimTimeoutTest.ino |
仅 Wokwi 用的自动熄灯演示草图(引 controller_idle10s.h,传原始 millis(),无时间缩放) |
wokwi/libraries.txt |
库配置:Adafruit NeoPixel |
v2 修正记录(按验收意见):
- 旧版
SimTimeoutTest用millis()*60全局加速——会同时把去抖压到 0.5ms、长按压到 20ms(按下几十毫秒即被误判长按,无法先点亮)。已废弃该方案,改为controller_idle10s.h(只缩短空闲超时)。10 分钟阈值的行为验证仍以主机测试 S6 为准。 test_g2.cppS4 补足 31ms 断言(29 拒绝 / 30 生效 / 31 生效),场景说明与实际覆盖一致。diagram.json按钮增加"key": "Q"键盘快捷键(Wokwi 原生支持;交互不再依赖 canvas 鼠标事件)。- 按钮触点表述修正:
1.l与2.l是两个独立触点,按下时才连通(原"同侧引脚内部连通"说法有误)。
主机逻辑测试(第一层证据)——全部通过
编译运行:cd source-data/christmas-magic-tent/g2/host-tests && c++ -std=c++11 -Wall -o test_g2 test_g2.cpp && ./test_g2
S1 上电关闭: PASS
S2 短按循环: PASS
S3 长按关闭+边界(1199/1200): PASS
S4 去抖+边界(29拒绝/30生效/31生效,毛刺): PASS
S5 上电按住抑制: PASS
S6 10分钟空闲超时+边界: PASS
S7 快速连续按压+长按后恢复: PASS
S8 millis 回绕: PASS
ALL PASS: 8 类行为 / 11 个场景全部通过
原版回归测试(教程自带 qa/test_controller.cpp,7 场景)亦 PASS。测试开发中修过 3 处测试脚本自身的时序笔误(pressStarted 从去抖稳定点起算、时间倒退、lastAction 边界差 10ms)——控制器代码零改动。
覆盖对照:上电关闭✓ 短按循环✓ 长按关闭✓ 去抖✓ 上电按住✓ 10 分钟超时✓(599999/600000 边界)快速连续按压✓(20 次 + 长按后恢复)计时边界✓(去抖 29/30/31、长按 1199/1200、超时 599999/600000、millis 回绕)。
Wokwi 运行(第二层证据)
已自动化验证
项目按 wokwi/diagram.json + firmware/ 在 wokwi.com 编辑器搭建(含 key:"Q" 与 controller_idle10s.h):编译通过、仿真启动、串口输出正确、上电 4 灯全灭、D2 引脚 Pullup 生效:


库缺失时的构建失败与一键安装均截图留档(wokwi_build_failed_before_library.png / wokwi_library_installed.png);安装后 libraries.txt 自动生成。
交互验证:待人工执行(自动化受阻于环境,如实记录)
自动化尝试与受阻原因:鼠标合成点击(cua.click/drag)与合成键盘事件均未触发模式切换;截图测量确认 Wokwi 仿真时钟在本环境停滞(速度指示 0%、CPU 0%、rAF 驱动停摆)——任何 down→up 间隔在停滞的仿真时间里都是 0ms,被 30ms 去抖吞掉。这是浏览器无头化环境的限制,不是固件或接线问题。已把按钮配置为键盘快捷键 Q,在正常前台浏览器里即可验证。
人工复现步骤(预计 5 分钟):
- 打开 https://wokwi.com/projects/new/arduino-uno
- tab 栏 ▾ → New file… ×2:创建
controller.h(粘贴g2/firmware/controller.h全文)与controller_idle10s.h(粘贴g2/firmware/controller_idle10s.h全文) - sketch.ino 替换为
g2/firmware/ChristmasStar.ino;diagram.json 替换为g2/wokwi/diagram.json(已含"key":"Q") - 运行 → 首次弹 "Build failed" → 点 INSTALL "ADAFRUIT NEOPIXEL" LIBRARY → 再次运行
- 点击电路图区域聚焦,然后敲键盘 Q(每按一次 = 一次完整短按):
- 灭 → 单击 Q → 4 颗暖橙(串口
Mode: 1) - → 再击 Q → 彩色循环(
Mode: 2) - → 再击 Q → 全灭(
Mode: 0) - 点亮后按住 Q ≥1.2s 再松开 → 直接回灭,且松手不再切换
- 上电瞬间按住 Q → 不得点亮
- 灭 → 单击 Q → 4 颗暖橙(串口
- 超时可视化(可选):sketch 换成
wokwi/SimTimeoutTest.ino(引controller_idle10s.h),点亮后静置约 10 秒自动回Mode: 0—— 仅演示用;10 分钟阈值的边界验证以主机测试 S6 为准 - 保存截图/项目:Wokwi 保存项目需登录 GitHub/Google 账号(匿名项目无法获得直链);登录后 SAVE 即得可分享直链
真实硬件验证(第三层)——未执行
家中 Arduino 实物型号未知。型号确认(正反面照片)前:不采购、不接线、不下单。ChristmasStar.ino 内置 #if !defined(ARDUINO_AVR_UNO) #error 守卫,防止在未确认的板子上直接编译通过。
验收状态(三层证据)
| 层 | 状态 | 证据 |
|---|---|---|
| 主机逻辑测试 | 通过(8 类行为/11 场景 + 原版 7 场景回归) | host-tests/RESULTS.txt |
| Wokwi 编译/启动/上电初态/串口 | 通过 | public/media/.../g2/ |
| Wokwi 按钮与灯光交互 | 通过(2026-11-07,Brave 真实浏览器补验:CDP 原生鼠标 press-hold-release;串口完整链 Mode: 1→2→0→1→0;4×WS2812 全亮暖橙;长按 1.6s 关闭且松手不切换) |
wokwi_brave_mode1_serial.png、wokwi_brave_leds_on.png |
| 真实 Arduino 接线与使用 | 未验证(板型已确认为 UNO R3 ✅ 2026-11-09;实物接线按本页 UNO 基线方案执行,到货组装时验证) | — |
补验记录:IAB 无头环境仿真时钟停滞(速度 0%)导致自动化失败;改在 Brave(CDP 9222)中以 99~100% 全速运行,
smart_interact原生鼠标--delay 150按压(越过 30ms 去抖、低于 1.2s 长按阈值)完成全部交互。诊断要点:按钮为wokwi-pushbutton自定义元素(shadowRoot 内含真实 button),初始位置超出视口需先 Fit;LED 链数据正常,BRIGHTNESS=48(19%)在小部件上视觉难辨,曾以 255 做对照实验确认后已还原 48。
- controller.h 原样复用(md5 一致),控制器零重写
- 主机逻辑测试 8 类行为 / 11 场景全 PASS(含全部计时边界、31ms 断言、millis 回绕)
- 原版 7 场景回归 PASS
- Wokwi 项目文件齐备(diagram.json 含 key:Q / 固件 / controller_idle10s.h / SimTimeoutTest / libraries.txt)
- Wokwi 编译通过 + 仿真运行 + 串口输出正确
- SimTimeoutTest 全局 ×60 时钟问题修正:仅缩短空闲超时,去抖/长按阈值与生产一致
- Wokwi 交互验证(Brave 补验):短按循环 / 长按关闭 / LED 点亮 / 串口日志全通过
- 真实硬件验证——板型已确认 UNO R3(用户确认 2026-11-09);实物接线待帐篷/元件到货组装时执行
- 全程未采购、未下单;G2-V2(PIR/音频)未提前展开
出问题怎么办
- Wokwi 编译报
Adafruit_NeoPixel.h not found:Build failed 弹窗点蓝色 INSTALL 按钮,或 Library Manager → + → 搜 "Adafruit NeoPixel" 安装。 - 敲 Q 没反应:先单击电路图区域确保焦点在仿真面板;确认仿真在运行(右上角计时器在走);确认 diagram.json 里按钮 attrs 有
"key":"Q"。也可直接鼠标点击按钮(正常前台浏览器中鼠标可用)。 - 按一下 Q 模式跳了两档:键盘自动重复(长按 OS 重复触发)——敲击要干脆,或改用鼠标点击。
- host 测试编译失败:需要 C++11 以上(macOS 自带 clang 即可);
test_controller.cpp原版测试的 include 是相对教程目录结构,放回qa/同级03_Arduino/再编译。 - SimTimeoutTest 里 10 秒就自动灭:预期行为(IdleMs=10000 演示版);生产固件是 600000ms。
- 实物板不是 UNO:停。先拍照确认型号,再由下一关决定移植或换基线;勿直接套用接线。
局限性声明
主机测试验证的是 StarController 状态机逻辑;Wokwi 验证的是 UNO+NeoPixel 的数字环境可编译可运行;两者都不验证:真实 WS2812 电气特性、供电余量(1000µF/330Ω 是否必要)、实物按钮手感与去抖实测参数、以及任何物理安全。这些属于 G4 实物验证阶段。