亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

用遥控器控制音乐播放:一个简单的 Arduino 项目

组件与材料

组件数量
Arduino UNO1
红外遥控器1
IR 接收模块 (通用)1
蜂鸣器1
Adafruit 标准 LCD - 16x2 白字蓝底1
旋转电位器 (通用)1
电阻 221 欧姆1

应用与在线服务

项目简介

大家好!我是 Simone Adobs,这是我在 Hackster 上发布的第二个项目。

项目逻辑

代码关键点解析

所有旋律均采用类似结构定义,例如:

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

用遥控器控制音乐播放:一个简单的 Arduino 项目

制造工艺

  1. 树莓派无需 LIRC 捕获红外遥控指令:Python UART 方案
  2. Arduino Nano 与 MPU-6050 构建实时陀螺仪游戏
  3. ESP32-CAM 运动检测安防相机,推送照片到 Discord
  4. Arduino 数字骰子:LCD 显示随机点数的电子骰子
  5. 用 Arduino Nano 自制 37 灯珠轮盘赌游戏机
  6. 自制 Arduino 电视遥控器:3D 打印外壳、电池供电、支持三大品牌协议
  7. Arduino Cloud 集成:随时随地监控家中温度
  8. ATtiny85 迷你街机:贪吃蛇 — 打造掌上 OLED 游戏机
  9. 便携测距仪 DIY 套件:Arduino Nano + HC-SR04 + 18650 电池 + 3D 打印外壳
  10. Windows 10 Cortana 蓝牙控制 Arduino LED:UWP 应用开发全流程
  11. 进阶遥控夹爪机器人:精密抓取 DIY 指南
  12. 铜电镀智能系统:基于 Arduino UNO 的可控电解装置