用遥控器控制音乐播放:一个简单的 Arduino 项目
组件与材料
| 组件 | 数量 |
|---|---|
| Arduino UNO | 1 |
| 红外遥控器 | 1 |
| IR 接收模块 (通用) | 1 |
| 蜂鸣器 | 1 |
| Adafruit 标准 LCD - 16x2 白字蓝底 | 1 |
| 旋转电位器 (通用) | 1 |
| 电阻 221 欧姆 | 1 |
应用与在线服务
- Arduino IDE
项目简介
大家好!我是 Simone Adobs,这是我在 Hackster 上发布的第二个项目。
项目逻辑
- 拿起遥控器,选择想要播放的旋律;
- Arduino 配合蜂鸣器播放旋律;
- LCD 屏幕实时显示正在播放的音符名称。
代码关键点解析
所有旋律均采用类似结构定义,例如:
void melody_example() {
lcd.clear();
lcd.setCursor(0,0);
lcd.print("Song title");
delay(1000);
lcd.clear();
nota_mi(duration, pause); // 音符 Mi
nota_do(duration, pause); // 音符 Do
lcd.clear();
delay(100);
Reset_AVR(); // 无需按键即可复位 Arduino
}
使用 Reset_AVR() 需在草图顶部添加:
#include <avr/io.h>
#include <avr/wdt.h>
#define Reset_AVR() wdt_enable(WDTO_30MS); while(1) {}
Arduino 通过遥控器发送的十六进制代码判断播放哪首曲子:
if (result == 12495) { melody_1(); } // 按键 1
else if (result == 6375) { melody_2(); } // 按键 2
else if (result == 31365) { melody_3(); } // 按键 3
else if (result == 4335) { melody_4(); } // 按键 4
单个音符播放函数示例:
void nota_example(int duration, int pause) {
shut(); // 检查是否有停止指令
lcd.setCursor(0, 0);
lcd.print("Example ");
NewTone(11, 262, duration); // 引脚 11,频率 262Hz
delay(pause);
}
想在播放过程中随时停止? 通过 shut() 函数即可实现:
void shut() {
if (irrecv.decode(&results)) {
result = results.value, HEX;
Serial.println(result);
if (result == -23971) { // 我的遥控器上“关机”键的码值
Reset_AVR();
}
}
irrecv.resume(); // 继续接收下一个码值
}
希望大家喜欢这个项目,也欢迎围观我之前的项目。祝愉快!
—— 来自意大利的 Simone <3
完整代码
请在 Arduino IDE 中复制以下代码:
#include <LiquidCrystal.h>
#include <IRremote.h>
#include <NewTone.h>
#include <avr/io.h>
#include <avr/wdt.h>
#define Reset_AVR() wdt_enable(WDTO_30MS); while(1) {}
#define buzzer 11
LiquidCrystal lcd(9, 8, 7, 6, 5, 4);
int result;
int RECV_PIN = 2;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
lcd.setCursor(0, 0);
lcd.print("-----Choose-----");
lcd.setCursor(0, 1);
lcd.print("----A Song!!----");
pinMode(buzzer, OUTPUT);
irrecv.enableIRIn();
}
void loop() {
if (irrecv.decode(&results)) {
result = results.value, HEX;
Serial.println(result);
if (result == 12495) { ode(); }
else if (result == 6375) { london(); }
else if (result == 31365) { fur(); }
else if (result == 4335) { pirate(); }
irrecv.resume();
}
delay(100);
}
// 以下为四首曲子的播放函数:fur() - 致爱丽丝, london() - 伦敦桥, ode() - 欢乐颂, pirate() - 他是个海盗
// 每个函数通过 nota_xx() 系列函数逐个音符播放,并在 LCD 上显示音符名
// 代码较长,此处省略完整列表,请从原项目下载完整代码
void shut() {
if (irrecv.decode(&results)) {
result = results.value, HEX;
Serial.println(result);
if (result == -23971) { Reset_AVR(); }
}
irrecv.resume();
}
// 音符频率定义函数 (Do, Do#, Re, Re#, Mi, Fa, Fa#, Sol, Sol#, La, La#, Si)
void nota_do(int duration, int pause) { shut(); lcd.setCursor(0,0); lcd.print("Do "); NewTone(11,262,duration); delay(pause); }
void nota_doz(int duration, int pause) { shut(); lcd.setCursor(0,0); lcd.print("Do #"); NewTone(11,277,duration); delay(pause); }
void nota_re(int duration, int pause) { shut(); lcd.setCursor(0,0); lcd.print("Re "); NewTone(11,294,duration); delay(pause); }
void nota_rez(int duration, int pause) { shut(); lcd.setCursor(0,0); lcd.print("Re #"); NewTone(11,311,duration); delay(pause); }
void nota_mi(int duration, int pause) { shut(); lcd.setCursor(0,0); lcd.print("Mi "); NewTone(11,330,duration); delay(pause); }
void nota_fa(int duration, int pause) { shut(); lcd.setCursor(0,0); lcd.print("Fa "); NewTone(11,349,duration); delay(pause); }
void nota_faz(int duration, int pause) { shut(); lcd.setCursor(0,0); lcd.print("Fa #"); NewTone(11,370,duration); delay(pause); }
void nota_sol(int duration, int pause) { shut(); lcd.setCursor(0,0); lcd.print("Sol "); NewTone(11,392,duration); delay(pause); }
void nota_solz(int duration, int pause) { shut(); lcd.setCursor(0,0); lcd.print("Sol #"); NewTone(11,415,duration); delay(pause); }
void nota_la(int duration, int pause) { shut(); lcd.setCursor(0,0); lcd.print("La "); NewTone(11,440,duration); delay(pause); }
void nota_laz(int duration, int pause) { shut(); lcd.setCursor(0,0); lcd.print("La #"); NewTone(11,466,duration); delay(pause); }
void nota_si(int duration, int pause) { shut(); lcd.setCursor(0,0); lcd.print("Si "); NewTone(11,494,duration); delay(pause); }
原理图
Fritzing 原理图文件:canzoni_con_tastiera_fQS3978roa.fzz
制造工艺
- 树莓派无需 LIRC 捕获红外遥控指令:Python UART 方案
- Arduino Nano 与 MPU-6050 构建实时陀螺仪游戏
- ESP32-CAM 运动检测安防相机,推送照片到 Discord
- Arduino 数字骰子:LCD 显示随机点数的电子骰子
- 用 Arduino Nano 自制 37 灯珠轮盘赌游戏机
- 自制 Arduino 电视遥控器:3D 打印外壳、电池供电、支持三大品牌协议
- Arduino Cloud 集成:随时随地监控家中温度
- ATtiny85 迷你街机:贪吃蛇 — 打造掌上 OLED 游戏机
- 便携测距仪 DIY 套件:Arduino Nano + HC-SR04 + 18650 电池 + 3D 打印外壳
- Windows 10 Cortana 蓝牙控制 Arduino LED:UWP 应用开发全流程
- 进阶遥控夹爪机器人:精密抓取 DIY 指南
- 铜电镀智能系统:基于 Arduino UNO 的可控电解装置