Arduino按键控制蜂鸣器音乐(按一下,音乐停,再按,放)

室友非说不会,我能怎么办,肝它

此次实现的功能是(音乐是我们当时在禹州的时候扒的乐谱,歌唱祖国),按一下音乐播放,再按一下暂停,再按一下从刚才暂停的位置播放,

需要一个按键,一个蜂鸣器

按键接开发板2口,蜂鸣器接开发板1口

程序还是简单的

//音乐歌唱祖国

#define NTF0 -1
#define NTF1 350
#define NTF2 393
#define NTF3 441
#define NTF4 495
#define NTF5 556
#define NTF6 624
#define NTF7 661

#define NTFL1 175
#define NTFL2 196
#define NTFL3 221
#define NTFL4 234
#define NTFL5 262
#define NTFL6 294
#define NTFL7 330

#define NTFH1 700
#define NTFH2 786
#define NTFH3 882
#define NTFH4 935
#define NTFH5 1049
#define NTFH6 1178
#define NTFH7 1322

//列出全部D调的频率
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.125
#define SIXTEENTH 0.0625
//列出所有节拍
int tune1[] =
{
  NTF1, NTF1, NTF1, NTFL5,
  NTF3, NTF1, NTF5, NTF6,
  NTF5, NTF5, NTF5, NTF6, NTF6,
  NTF6, NTF5, NTF4, NTF6, NTF5,
  NTF5, NTF5, NTF5, NTF6, NTF6,
  NTF2, NTF2, NTF2, NTF5, NTF4,
  NTF3, NTFL5, NTFL5, NTF5, NTF5, NTF6,
  NTF5, NTF4, NTF3, NTF2, NTF1,
  NTF1, NTF5, NTF5, NTFH1, NTFH1,
  NTF6, NTF6, NTF5, NTF4, NTF5,
  NTF6, NTF2, NTF2, NTF5, NTF5, NTF6,
  NTF5, NTF4, NTF3, NTF2, NTF1,
  NTF1, NTF0,
  NTF1, NTFL5, NTF3, NTF3, NTF0,
  NTF3, NTF1, NTF6, NTF6, NTF0,
  NTFL6, NTFL6, NTF2, NTF2, NTF3,
  NTF2, NTF1, NTFL7, NTFL6, NTFL5,
  NTF1, NTFL5, NTFL6, NTFL6, NTFL5,
  NTF1, NTF2, NTF3, NTF0,
  NTF2, NTF6, NTF6, NTF5, NTF5, NTF3,
  NTF2, NTF6, NTF5, NTF0, NTFH1,
  NTFH1, NTFH1, NTFH1, NTF5, NTF6, NTF1,
  NTF6, NTF5, NTF4, NTF6, NTF5, NTF0,
  NTFH1, NTFH1, NTFH1, NTFH1, NTF5, NTF5, NTF6,
  NTF5, NTF4, NTF3, NTF2, NTF1, NTFL5, NTFL5,
};
float durt1[] =
{
  0.5 + 0.25, 0.25, 1, 1,
  1, 1, 1 + 0.5, 0.5,
  1, 0.5 + 0.25, 0.25, 1, 1,
  0.5 + 0.25, 0.25, 0.5, 0.5, 1 + 1,
  1, 0.5 + 0.25, 0.25, 1, 1,
  1, 0.5 + 0.25, 0.25, 1 + 0.5, 0.5,
  1, 0.5 + 0.25, 0.25, 1, 0.5, 0.5,
  0.5, 0.5, 0.5, 0.5, 1 + 1,
  1, 0.5 + 0.25, 0.25, 1, 1,
  1, 0.5 + 0.25, 0.25, 1 + 0.5, 0.5,
  1, 0.5 + 0.25, 0.25, 1, 0.5, 0.5,
  0.5, 0.5, 0.5, 0.5, 1 + 1,
  1 + 0.5, 0.5,
  0.5 + 0.25, 0.25, 1, 1 + 0.5, 0.5,
  0.5 + 0.25, 0.25, 1, 1 + 0.5, 0.5,
  1 + 0.5, 0.5, 1, 0.5 + 0.25, 0.25,
  0.5, 0.5, 0.5, 0.5, 1 + 1,
  1, 1, 0.5, 1, 0.5,
  1, 1, 1, 1,
  1, 0.5, 0.5, 0.5, 1, 0.5,
  1, 1, 1, 0.5, 0.5,
  0.5 + 0.25, 0.25, 0.5, 0.5, 1 + 0.5, 0.5,
  0.5 + 0.25, 0.25, 0.5, 0.5, 1, 1,
  0.5 + 0.25, 0.25, 0.5, 0.5, 1, 0.5, 0.5,
  0.5, 0.5, 0.5, 0.5, 1, 0.5 + 0.25, 0.25,
};
int length;
int buttonPin = 2;//按键
boolean ledState = false;
int tonepin = 1; //蜂鸣器
void setup()
{
  pinMode(tonepin, OUTPUT);
  length = sizeof(tune1) / sizeof(tune1[0]); //计算长度
  pinMode(buttonPin, INPUT_PULLUP);
}
 int p;
void loop()
{
  for (int x = 0; x < length; x++)
  {
    if (digitalRead(buttonPin) == LOW) {//如果读取到按键被按压改变ledStart
      ledState = !ledState;
      delay(500);//这个延迟是你按压按键的大概时间
      p = x;//记录当前播放的音乐的位置
    }
    if (ledState == true) {//如果ledState是这个状态就播放
      tone(tonepin, tune1[x]); //音调
      delay(400 * durt1[x]); //节拍进行延时
      delay(100 * durt1[x]); //这里用来根据节拍调节延时,500这个指数可以自己调整,在该音乐中,我发现用500比较合适。
      noTone(tonepin);
    }else{
      x = p;//如果是暂停状态记录此时音乐的位置
    }
  }
}

原创文章 96 获赞 28 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43813140/article/details/103329966