Arduino Nano 三路复音演奏《生日快乐》—— 灯光同步的无限循环演示
元件清单
| 元件 | 数量 |
|---|---|
| Arduino Nano R3 | 1 |
其余元件(3 个蜂鸣器、3 个 LED、6 个 100Ω 电阻、迷你面包板、跳线)均为通用元件,原文未列入清单,实际制作时请自行准备。
项目演示
将装置插入任意 USB 电源(不限电脑),即可无限循环播放《生日快乐》三声部复音,直到你听腻为止。三个声部对应的 LED 会随音符变化闪烁,视听同步效果极佳。
原理图与布局
核心技巧:Arduino Nano 正好嵌入迷你面包板,两侧引脚刚好露出,可直接插接蜂鸣器与 LED,无需焊接。面包板内部连接方式见附图。
- 三个蜂鸣器分别接 D6、D12、D0(信号脚),接地脚分别接 D2、D9、A4(通过置 LOW 模拟地)
- 三个 LED 阳极接 A1、A3、A5,阴极共用 A0、A2、A4(同样置 LOW)
- 电阻均为 100Ω(常规建议 220Ω,但 100Ω 亮度更高且短期安全)
- 中间蜂鸣器体积稍大,仅为视觉区分,实际声学特性无差别
软件实现
必须安装 Tone 库(GitHub / 直链),它利用硬件定时器与中断在单核 AVR 上实现多音轨并发生成。安装方式:IDE 菜单 Sketch → Include Library → Add .ZIP Library...。
代码结构:
- 三个
Tone对象分别控制低音、节奏、高音三声部 - 每个声部配备专用 LED 闪烁函数
switchXxxLed() wait(Tone)阻塞等待当前音符播放完毕loop()中按乐谱顺序依次触发三声部音符,通过wait(rythm)同步节拍
完整代码
#include <Tone.h>
Tone solo, bass, rythm;
const int t = 600; // 四分音符时长 ms
const int tt = t*2; // 二分音符
const int t14 = round(t*1/4);
const int t24 = round(t*2/4);
const int t34 = round(t*3/4);
const int bassLedPin = 15; // A1
const int rythmLedPin = 17; // A3
const int soloLedPin = 19; // A5
void wait(Tone &t) { while (t.isPlaying()); }
int bassLedState = LOW, rythmLedState = LOW, soloLedState = LOW;
void switchBassLed() { bassLedState = !bassLedState; digitalWrite(bassLedPin, bassLedState); }
void switchRythmLed() { rythmLedState = !rythmLedState; digitalWrite(rythmLedPin, rythmLedState); }
void switchSoloLed() { soloLedState = !soloLedState; digitalWrite(soloLedPin, soloLedState); }
void setup() {
pinMode(14, OUTPUT); pinMode(16, OUTPUT); pinMode(18, OUTPUT); // LED 地脚 A0,A2,A4
pinMode(bassLedPin, OUTPUT); pinMode(rythmLedPin, OUTPUT); pinMode(soloLedPin, OUTPUT);
pinMode(2, OUTPUT); pinMode(9, OUTPUT); // 蜂鸣器地脚
solo.begin(6); bass.begin(12); rythm.begin(0); // 信号脚
// 前奏两个 D4
solo.play(NOTE_D4, t34); switchSoloLed(); wait(solo);
solo.play(NOTE_D4, t14); switchSoloLed(); wait(solo);
}
void loop() {
// 以下按乐谱逐小节编写,每行对应一个和弦/音符组合
// 结构:bass.play + switchBassLed; rythm.play + switchRythmLed; solo.play + switchSoloLed; wait(rythm);
// 为节省篇幅此处省略完整 200+ 行乐谱代码,完整版请见原项目附件或下方 GitHub 链接
// 关键点:通过 wait(rythm) 以节奏声部为基准同步三声部
}
完整乐谱代码 请访问项目主页下载,或直接复制原文中的 Happy_birthday 完整列表。
进阶建议
- 代码目前将三声部硬编码在
loop()中,可重构为数据驱动(音符数组 + 统一播放引擎),便于演奏任意 MIDI 导出的多轨乐谱 - 若需更多声部,可考虑使用 ESP32 等多核 MCU,或外接专用音频芯片(VS1053 等)
制造工艺
- K30 CO₂ 传感器:室内空气质量实时监测
- 基于 1Sheeld 与 Arduino 的盲聋人士沟通辅助系统
- 智能存钱罐:Arduino Nano 控制硬币识别器实现余额显示
- Arduino Nano 智能礼服:心率感应 LED 装饰,融合 CrazyCircuits 与 DFRobot 传感器
- Arduino + HC-05 蓝牙控制 LED:MIT App Inventor 手机 App 开发全攻略
- DFRobot 电容指纹传感器 (ID809) 接入 Arduino/ESP8266 完整教程
- 基于 Arduino Mega 与 Nextion 显示屏的交互式气象站
- Arduino Mega 驱动 Wii Nunchuk 控制 6 自由度机械臂
- Arduino Nano + 摇杆控制双步进电机:Visuino 图形化教程
- Arduino Nano 手持盖革计数器:DIY 核辐射检测仪
- Arduino UNO + 以太网盾板实现低成本太阳辐射测量仪(热电堆原理)
- 紧凑型Arduino雷达系统:HC-SR04超声波传感器配1.8英寸显示屏