DIY 节日影子剧场:Arduino 与可寻址 LED 灯条打造光影秀
零部件与材料
- Arduino 101 × 1
- SparkFun 可寻址 RGB LED 灯条 × 1(其他同类灯条亦可,微调代码即可)
- SparkFun 公头 DC 插座转接板 × 1
- SparkFun 母头 DC 插座转接板 × 1
- SparkFun 3×AA 电池盒(带开关) × 1
- AA 电池 × 3
- Pololu 12V 升压模块 × 1(用同一组电池同时供电 Arduino 101 和灯条)
- A4 打印纸 4 张
- 100lb 卡纸 4 张(8.5×11 英寸)
- 白色 3/16" KT 板(泡沫芯板),足够裁剪四张 8.5×11 英寸
所需工具
- 热熔胶枪
- 电烙铁
- 美工刀 + 备用刀片 (#11)
- 剥线钳 (12-20 AWG)
- 可打印卡纸的打印机
- 小螺丝刀(拧紧 DC 插座端子)
软件与服务
- Arduino IDE
- Blynk App(手机端快速原型控制)
- Adafruit NeoPixel 库
项目概览

利用 Arduino 101 内置蓝牙,通过 Blynk App 远程控制地址可寻址 LED 灯条,配合 KT 板和卡纸剪影,制作手机可控的动画影子剧场。电子元件无破坏性使用,可拆解复用。
工作原理

一条 LED 灯条缠绕在剧场中央的 KT 板上。底部 LED 依次点亮,透过针孔投射动态阴影(如飘雪);中部 LED 导光进顶部建筑剪影;末端最后一颗 LED 照亮全场,投射主阴影。

Blynk App 可控制建筑灯光颜色、开启闪烁壁炉火光、调节主阴影亮度。
第一部分:电子组装
- 剥离灯条末端引线:从灯条末端剪下约 1cm,剥线。
- 焊接信号线排针:将升压模块附带的弯脚排针掰直,焊接到绿/黄信号线末端,方便插入 Arduino 101 引脚。
- 接线升压模块:红线接升压模块 VIN,GND 和 VOUT 焊直排针。
- 连接 DC 插座:
- 电池盒引线接公头 DC 插座:红接 +,黑接 -。
- 灯条输入端引线接母头 DC 插座:黄接 -,红接 +。
- 连接 Arduino 101:
- 绿线(数据)接 Pin 6
- 黄线(地)接 13 号脚旁 GND
- 升压模块 GND 接 GND,VOUT 接 Vin (切勿反接,会冒烟损坏!)


第二部分:KT 板舞台组装
- 打印 KT 板剪纸模板(4 张 A4 纸)和卡纸模板(4 张卡纸)。
- 按模板裁剪 KT 板部件。可将模板贴在 KT 板上,用美工刀轻划转印轮廓。
- 组装灯条支架:首颗 LED 粘在底部,按图缠绕 3 圈,尾部自由,顶部固定。
- 编号 LED:可寻址 LED 需知晓索引。缝隙下方 LED 用于动画(如示例 0,1,2,20,21,22,40,41,42),两颗 LED 照亮建筑(23 号照后屋,25 号模拟前屋火光),末端 LED (59) 为主阴影光源。按你的缠绕方式数清编号并记录,代码中需修改对应数值。
- 将支架热熔胶固定在底板中央,长条灯带大致居中。
- 粘贴弧形侧板。
- 安装遮光挡板和顶板:大挡板靠近支架折痕,小挡板在上方,中间至少留 1 颗 LED。顶板对齐底板粘牢。
- 将灯条尾端最后一颗 LED 粘在前顶边,作为主阴影光源。

第三部分:Arduino 101 编程与 Blynk 配置
- USB 连接 Arduino 101,接好灯条、电池盒、Arduino(电池盒开关先关)。
- 安装 Arduino IDE、Intel Curie 核心、Adafruit NeoPixel 库、Blynk 库。新手先跑基础例程验证硬件。
- 打开示例代码,按你记录的 LED 编号修改数组:
// 雪花动画 LED 编号
int pos[] = {0, 1, 2, 20, 21, 22, 40, 41, 42};
// 动画像素数量
int numLeds = 9;
// 末端主阴影 LED(60 灯条为 59)
int shadowPixel = 59;
// 后屋照明 LED(在两挡板之间)
int lightHousePixel = 23;
// 前屋火光 LED(小挡板前)
int firePixel = 24;
编译上传。拔 USB,打开电池开关,应见主阴影亮起、动画 LED 依序闪烁,建筑/火光 LED 待 Blynk 控制。
- 配置 Blynk App:
- 手机安装 Blynk,点击右上角扫码,扫描项目二维码自动加载界面。
- 或手动建立:BLE 组件 + 3 个滑块(输出 0-100 到 V0、V1、V2)。
- 点击 BLE 组件连接 "ShadowTheatre",右上角播放箭头即可控制。手机息屏后可能需重连。

第四部分:卡纸剪影、建筑与收尾
- 用美工刀剪背景剪影(勤换刀片,我换了 3 次)。
- 剪建筑件,背面粘贴(印面朝后),热熔胶组装。
- 将建筑固定于舞台,封堵缝隙防漏光。
- 折叠剪影两侧,底部粘贴舞台后缘(印面朝外)。
- 剪刻雪景投影片(针孔/牙签孔/精细镂空),粘贴弧形边缘形成投影面。
- 粘贴左侧和前侧板。右侧板用胶带松贴,方便开关电池盒。

大功告成! 找暗处靠墙测试。开机即见场景阴影与飘雪。用 Blynk 控制主光、建筑灯光、火光。
代码
/* Copyright (c) 2016 Intel Corporation. All rights reserved. See license notice at end of file. */
/////////////////////// 请修改以下变量以匹配你的影子剧场 //////////////////////////////////
// 雪花动画 LED 编号
int pos[] = {0, 1, 2, 20, 21, 22, 40, 41, 42};
int numLeds = 9;
int shadowPixel = 59;
int lightHousePixel = 23;
int firePixel = 24;
////////////////////////////////////////////////////////////////////////////////////////////
#include <Adafruit_NeoPixel.h>
#include <BlynkSimpleCurieBLE.h>
#include <CurieBLE.h>
#define PIN 6
int v0 = 0, v1 = 0, v2 = 0;
int fadeup = 0, fadedown = 0;
int firetimer = 0, fireinterval = 50, flicker = 0;
unsigned long lightcounter = 0;
int stp = 0, stpOld = 0;
unsigned long timer = 0;
int interval = 0;
char auth[] = "YourAuthToken";
BLEPeripheral blePeripheral;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);
void setup() {
delay(1000);
timer = millis();
strip.begin();
strip.show();
blePeripheral.setLocalName("ShadowTheatre");
blePeripheral.setDeviceName("ShadowTheatre");
blePeripheral.setAppearance(384);
Blynk.begin(auth, blePeripheral);
blePeripheral.begin();
interval = 350;
}
void loop() {
Blynk.run();
blePeripheral.poll();
// 主阴影光,受 V2 控制
strip.setPixelColor(shadowPixel, 200 - v2, 160 - v2, 160 - v2);
// 火光闪烁
if ((millis() - firetimer) > fireinterval) {
firetimer = millis();
flicker = random(0, 40);
}
if (v0 > 1) {
strip.setPixelColor(firePixel, 80 + v0 + flicker, v0 + flicker, 0);
} else {
strip.setPixelColor(firePixel, 0, 0, 0);
}
// 后屋灯光
if (v1 > 1) {
strip.setPixelColor(lightHousePixel, 200 - v1, v1, 0);
} else {
strip.setPixelColor(lightHousePixel, 0, 0, 0);
}
// 雪花动画
if ((millis() - timer) > interval) {
stpOld = stp;
timer = millis();
lightcounter++;
stp = (lightcounter % numLeds);
fadeup = 0;
fadedown = 170;
}
fadeup += 2; fadeup = constrain(fadeup, 0, 170);
fadedown -= 2; fadedown = constrain(fadedown, 0, 170);
for (int i = 0; i < numLeds; i++) strip.setPixelColor(pos[i], 0, 0, 0);
strip.setPixelColor(pos[stp], fadeup, fadeup, fadeup);
strip.setPixelColor(pos[stpOld], fadedown, fadedown, fadedown);
strip.show();
}
BLYNK_WRITE(V0) { v0 = param.asInt(); } // 壁炉滑块
BLYNK_WRITE(V1) { v1 = param.asInt(); } // 后屋灯光滑块
BLYNK_WRITE(V2) { v2 = param.asInt(); } // 主阴影滑块
原理图与模板
- KT 板裁剪模板:A4 打印纸打印,贴合划线。
- 卡纸剪影/建筑模板:卡纸打印(4 张)。
- 矢量文件:
30bn6Le68V1Lpp2spRMw.svg(激光切割/刀具切割用)。
制造工艺
- 节日灯饰的演变与工艺:从古老传统到现代工程
- 发光二极管:从诞生到百年寿命
- Arduino复刻“棺材舞”旋律:蜂鸣器+三色LED灯光秀完整教程
- DIY Arduino USB 游戏手柄 — 自制高性能游戏手柄
- DIY 云朵发光服装 — LED 灯带 + Arduino Nano + SparkFun 元件
- 用 Arduino Mega 制作惊艳的 5×5×5 LED 光立方
- Arduino + HC-05 蓝牙控制 LED:MIT App Inventor 手机 App 开发全攻略
- 智能 Arduino 水杯:实时监测饮水量与智能提醒
- 声控 8 路 LED 灯光秀:Arduino 入门项目
- 从零构建智能 Arduino 四足机器人:完整指南
- Arduino RGB LED调色器:三电位器混色入门项目
- 智能手语手套:柔性传感器 + 加速度计 + 蓝牙将手势转文字/语音