每年十月,Hackster、Instructables 和 element14 万圣节黑客松上都会重新出现同样那几个作品:一个带舵机下颌的骷髅,有人经过时就会尖叫;一对装在圆形显示屏上、会跟着你转的眼睛;一幅在你靠近时会做出反应的画;一个装满 NeoPixels 的南瓜;以及一个只有你伸出手才会给糖的糖果碗。
我们把其中七个重新制作为 Velxio 画廊中的示例,每个板卡系列一个,使用 Arduino 零件以及我们合作伙伴 Seeed Studio、DFRobot、M5Stack 和 Pimoroni 的模块。每一个都能在编辑器中打开,电路已经接好,草图也已经写好。按下 Run,它就会编译并在浏览器中启动,这样你就能在剪断一根线之前调整时序、颜色和阈值。
| 项目 | 板卡 | 主要零件 | 打开它 |
|---|---|---|---|
| 惊吓骷髅 | Arduino Uno | PIR、舵机、2 个 LED、蜂鸣器 | halloween-uno-jump-scare-skull |
| 糖果分发器 | Arduino Uno | HC-SR04、舵机、SSD1306 OLED、蜂鸣器 | halloween-uno-candy-dispenser |
| 跟随你的眼睛 | Seeed XIAO ESP32-S3 | Seeed 圆形显示屏(GC9A01 + 触摸) | halloween-round-display-eye |
| Grove 南瓜灯 | Seeed XIAO ESP32-S3 | Grove RGB LED 环、光传感器、PIR、无源蜂鸣器 | halloween-grove-pumpkin-ring |
| 闹鬼肖像 | ESP32 DevKit | DFRobot C4001 毫米波雷达、2 个 LED、蜂鸣器 | halloween-c4001-haunted-portrait |
| 幽灵探测器 | M5Stack Core | 内置 LCD、按钮和扬声器 | halloween-m5stack-ghost-detector |
| LED 矩阵南瓜 | Pimoroni Stellar Unicorn | 16x16 RGB 矩阵、按钮 | halloween-stellar-unicorn-pumpkin |
在示例页面搜索 halloween 即可列出全部七个。
其中五个小节顶部的图片是成品道具可能外观的插图,由 AI 生成。本文中其他所有图片都是示例在 Velxio 中运行的截图。
如何打开并运行其中任意一个
- 点击表格中的项目链接。编辑器会打开,板卡、零件、连线和草图都已就位。
- 按下工具栏中的绿色 Run 按钮。草图会在我们的服务器上编译(板卡的首次构建可能需要一分钟),然后在你的浏览器中运行。
- 打开底部的串口监视器。每个草图都会打印它正在做什么,所以即使关闭声音,你也能看到道具做出反应。
- 在仿真运行时点击画布上的传感器以打开其面板。距离、光照和存在感滑块就在那里。
1. 惊吓骷髅(Arduino Uno)

成品道具的插图,由 AI 生成。下面的电路才是 Velxio 中运行的那个。
经典的门廊道具。D2 上的 PIR 运动传感器监视着门口。有人经过时,D5 和 D6 上的两只红色 LED 眼睛会亮到最大亮度,D9 上的舵机会让下颌咔哒作响四次,D8 上的蜂鸣器会发出从 1.8 kHz 滑落到低吼的警报声。在访客之间,眼睛像余烬一样微微发光,四秒的冷却时间可以防止骷髅连续两次吓到同一个人。

要试用它,请点击画布上的 PIR 传感器。输出会保持 HIGH 三秒,这正是真实的 HC-SR501 在延迟电位器调到最小时的行为。
整个惊吓就是一个简短的函数。注意 Uno 上的 tone() 使用 Timer2,而 Servo 库使用 Timer1,所以尖叫声和下颌永远不会争抢同一个定时器:
void scare() {
eyes(255);
for (int i = 0; i < 4; i++) { // the jaw chatters four times
jaw.write(JAW_OPEN);
if (i == 0) scream(); else delay(160);
jaw.write(JAW_CLOSED);
delay(140);
}
eyes(40);
lastScare = millis();
}
2. 不给糖就捣蛋糖果分发器(Arduino Uno)

成品道具的插图,由 AI 生成。下面的电路才是 Velxio 中运行的那个。
一个无需接触的糖果碗。HC-SR04 超声波传感器从滑道下方朝上,寻找距离小于 10 cm 的手。一旦找到,舵机就会打开闸门,掉落一颗糖果然后再次关闭,蜂鸣器播放一段短促的旋律,SSD1306 OLED 会倒计时剩余数量,角落里还画着一个小南瓜灯。当库存耗尽时,屏幕会显示 TRICK,蜂鸣器则会转而嘲笑你。

点击 HC-SR04 并将其距离滑块拖到 10 cm 以下,即可伸出一只手。草图随后会等待手被收回,所以挥一次手就是一颗糖果,没人能通过一直把手放在那里来清空糖果碗。
3. 跟随你的眼睛(用于 XIAO 的 Seeed 圆形显示屏)

一对完成的眼睛的插图,由 AI 生成。Velxio 中的示例运行一个显示屏;一对就是两个这样的显示屏。
圆形 TFT 显示屏上的眼睛在去年的 element14 万圣节黑客松上随处可见,从 3D 打印的骷髅到雷达触发的道具。这个示例使用 用于 XIAO 的 Seeed 圆形显示屏,背面装着一块 XIAO ESP32-S3。1.28 英寸的 GC9A01 显示着一只带橙色虹膜的血丝眼球。

按压玻璃,瞳孔就会追逐你的指针。持续按压,它会收窄成猫一样的竖瞳。松开后,它会恢复自行环顾房间,并每隔几秒眨一次眼。
触摸控制器是扩展板上的 CHSC6X,读取方式与 Seeed 自家驱动相同:D7 上的下降沿表示手指按下,在 0x2E 处进行五字节 I2C 读取会返回位置。每一帧都绘制到离屏 sprite 中,然后一次性推送到玻璃上,因此面板永远不会显示画了一半的眼睛。只有虹膜可能到达的 174 像素方形区域会被重绘;带血管的边缘只绘制一次,并在每次眨眼后重绘:
static void drawEye() {
frame.fillScreen(TFT_BLACK);
drawSclera(frame, BX, BY); // the part of the sclera inside the box
... // iris, streaks, pupil, glint, eyelids
frame.pushSprite(BX, BY);
}
引脚就是扩展板自身的引脚,所以同一份草图可以在真实的硬件组合上运行。
要制作一对眼睛,就做两个:骷髅或雕刻的南瓜在它的眼窝里装两块圆形显示屏,每块都配有自己的 XIAO 运行这份草图。它们会独立地环顾和眨眼,这比两只完全同步的眼睛看起来更有生气。
4. 黄昏时分苏醒的 Grove 南瓜灯(Seeed XIAO ESP32-S3)

完成道具的插画,由 AI 生成。下方电路即为在 Velxio 中运行的电路。
XIAO ESP32-S3 上的四个 Grove 模块组成了一个可放入雕刻南瓜的内胆。 Grove 光敏传感器让 42 颗 LED 的 Ultimate RGB LED 环在白天保持熄灭。 天黑之后,灯环会像蜡烛一样闪烁橙黄色光芒,每颗 LED 都有自己的火焰。 当 Grove PIR 检测到有人靠近时,南瓜就会被”附身”: 绿紫色的漩涡绕着灯环旋转,Grove 无源蜂鸣器 奏响几小节诡异的旋律。

想试一试的话,点击光敏传感器并把滑块拖低来模拟夜晚, 然后点击 PIR 并触发它。

在真实硬件上,请从 XIAO 的 5 V 焊盘为灯环供电(示例就是这样接线的), 并保持低亮度:42 颗 WS2813 LED 全白全亮时的电流远超 USB 端口 能提供的水平。
5. 闹鬼肖像(DFRobot C4001 毫米波雷达)

完成道具的插画,由 AI 生成。下方电路即为在 Velxio 中运行的电路。
眼睛会跟随房间的油画是游乐场的老把戏,而雷达能让它更胜一筹。 DFRobot C4001(SEN0610)是一款 24 GHz 毫米波传感器,可以测量人的距离, 其信号能直接穿透画布和木质画框。藏在画作背后, 完全不会暴露。
示例程序将雷达设为速度模式,此时它会同时报告距离和存在状态。 你站得越近,肖像的两只 LED 眼睛就越亮,蜂鸣器上的心跳声也越快, 从六米处每 1.5 秒一跳,到近处几乎每秒三跳。走进一米之内, 它就会尖叫。

点击雷达并拖动距离滑块,走向画作。
// 6 m away: a dim glow. Right in front: full blaze.
float closeness = constrain((FAR_M - range) / (FAR_M - SHRIEK_M), 0.0f, 1.0f);
eyes(10 + (int)(closeness * 245));
6. 幽灵探测器(M5Stack Core)
与其说是道具,不如说是个游戏,也是唯一一个无需接线的项目。M5Stack Core Basic 绘制一个指针仪表,读取房间的”幽灵场”。 指针会自行游走,时不时猛冲进红色的 HAUNT 区域;这时 一个幽灵就会飘上屏幕,扬声器开始发出噼啪声。

三个正面按钮就是控制键:
- A 加强扫描三秒,幽灵出现得更频繁。
- B 拍照。在幽灵出现在屏幕上时抓住它,角落里的计数器 就会加一。
- C 开关声音。
仪表绘制到 8 位 M5Canvas 精灵中并一次性推送,这样
指针就不会闪烁。全屏 16 位精灵放不下:
Core Basic 没有 PSRAM。
7. LED 矩阵南瓜(Pimoroni Stellar Unicorn)
最后一个纯粹是装饰。Pimoroni Stellar Unicorn 的 16x16 RGB 矩阵变成一个带棱纹的南瓜灯,眼睛、鼻子和锯齿状嘴巴 被内部的烛光照亮。按 A 触发一道闪电,随后滚动显示 HAPPY HALLOWEEN;按 B 让一个幽灵飘过脸庞;LUX + 和 - 调节亮度。

面孔是示例程序中一个 16 乘 16 的字符网格,每颗 LED 对应一个字母, 所以改变表情只需编辑文本。
移植到真实硬件
这些示例程序针对的库和引脚与你在实验台上使用的一致, 因此从模拟器迁移到真实搭建主要涉及 供电和机械结构:
- 舵机的电流尖峰会让 Uno 的 5 V 稳压器吃不消。对于 骷髅头和糖果分配器,请为舵机单独提供 5 V 电源并共地。
- 真实的 PIR 在上电后需要约一分钟稳定,在此期间会 自行触发几次。
- 对于 LED 环,请用 5 V 供电并保持
setBrightness()较低,除非 你有足够功率的电源。 - C4001 能穿透薄木板、纸板和织物,但穿不透金属, 所以要注意画框的悬挂五金件。
局限
- 雷达、光敏传感器和超声波传感器由滑块驱动。它们 为示例程序提供真实传感器会给出的数值,而非物理场景。
- 声音通过浏览器播放。蜂鸣器部分遵循引脚产生的频率; 它们不模拟真实压电蜂鸣器的响度或音色。
打开一个,改一改,构建出能吓到自家门口的版本。 万圣节快乐。