找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 449|回复: 2
打印 上一主题 下一主题
收起左侧

想做一个Arduino蜂鸣器按键唱歌的,但是出现了问题,求各位大佬解答

[复制链接]
跳转到指定楼层
楼主
ID:1081419 发表于 2023-6-7 22:11 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
想做一个arduino连接蜂鸣器,总共四个按键,前面三个按键按下发do,re,mi,后面一个按键按下放一首歌,但是现在写完实现不了前面三个按键的功能了,希望得到解答
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
#define NOTE_D0 -1
#define NOTE_D1 294
#define NOTE_D2 330
#define NOTE_D3 350
#define NOTE_D4 393
#define NOTE_D5 441
#define NOTE_D6 495
#define NOTE_D7 556

#define NOTE_DL1 147
#define NOTE_DL2 165
#define NOTE_DL3 175
#define NOTE_DL4 196
#define NOTE_DL5 221
#define NOTE_DL6 248
#define NOTE_DL7 278

#define NOTE_DH1 589
#define NOTE_DH2 661
#define NOTE_DH3 700
#define NOTE_DH4 786
#define NOTE_DH5 882
#define NOTE_DH6 990
#define NOTE_DH7 112/* 以上部分是定义是把每个音符和频率值对应起来 */
/********** 这部分是用英文对应了拍子 **********/
#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.25
#define SIXTEENTH 0.625
/* 这部分就是整首曲子的音符部分,用了一个序列定义为tune,整数 */
int tune[] = {  
NOTE_D0,NOTE_D0,NOTE_D0,NOTE_D6,NOTE_D7,NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D3,NOTE_D3,
NOTE_D6,NOTE_D5,NOTE_D6,NOTE_DH1,NOTE_D5,NOTE_D5,NOTE_D5,NOTE_D3,NOTE_D4,NOTE_D3,NOTE_D4,NOTE_DH1,
NOTE_D3,NOTE_D3,NOTE_D0,NOTE_DH1,NOTE_DH1,NOTE_DH1,NOTE_D7,NOTE_D4,NOTE_D4,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D0,NOTE_D6,NOTE_D7,
NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D3,NOTE_D3,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_DH1,
NOTE_D5,NOTE_D5,NOTE_D5,NOTE_D2,NOTE_D3,NOTE_D4,NOTE_DH1,NOTE_D7,NOTE_D7,NOTE_DH1,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_DH3,NOTE_DH1,NOTE_DH1,NOTE_DH1,
NOTE_DH1,NOTE_D7,NOTE_D6,NOTE_D6,NOTE_D7,NOTE_D5,NOTE_D6,NOTE_D6,NOTE_D6,NOTE_DH1,NOTE_DH2,NOTE_DH3,NOTE_DH2,NOTE_DH3,NOTE_DH5,
NOTE_DH2,NOTE_DH2,NOTE_DH2,NOTE_D5,NOTE_D5,NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,
NOTE_D6,NOTE_D7,NOTE_DH1,NOTE_D7,NOTE_DH2,NOTE_DH2,NOTE_DH1,NOTE_D5,NOTE_D5,NOTE_D5,NOTE_DH4,NOTE_DH3,NOTE_DH2,NOTE_DH1,
NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH6,NOTE_DH6,NOTE_DH5,NOTE_DH5,NOTE_DH3,NOTE_DH2,NOTE_DH1,NOTE_DH1,NOTE_D0,NOTE_DH1,
NOTE_DH2,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_DH5,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH6,NOTE_DH6,NOTE_DH5,NOTE_DH5,
NOTE_DH3,NOTE_DH2,NOTE_DH1,NOTE_DH1,NOTE_D0,……



/* 这部分是整首曲子的接拍部分,也定义个序列duration,浮点(数组的个数和前面音符的个数是一样的) */
float durt[]= {  
  1,1,1,0.5,0.5,     1+0.5,0.5,1,1,     1,1,1,0.5,0.5,
  1+0.5,0.5,1,1,     1,1,1,1,          1+0.5,0.5,1,1,
  1,1,0.5,0.5,0.5,0.5,    1+0.5,0.5,1,1,     1,1,1,0.5,0.5,
  1+0.5,0.5,1,1,    1,1,1,0.5,0.5,     1+0.5,0.5,1,1,
  1,1,1,0.5,0.5,    1,0.5,0.25,0.25,0.25,0.5,    0.5,0.5,0.5,0.25,0.5,1,
  0.5,0.5,0.5,0.5,1,1,    1,1,1,0.5,0.5,    1+0.5,0.5,1,1,
  1,1,1,0.5,0.5,    1.5,0.5,1,1,    1,1,1,1,
  0.5,0.5,1,1,0.5,0.5,    1.5,0.25,0.5,1,    1,1,1,1,
  1,1,1,1,    1,1,1,1,    0.5,0.5,1,1,0.5,0.5,
  1,0.5,0.5,1,1,    1,1,1,1,    1,1,1,1,
  0.5,0.5,1,1,0.5,0.5,    1,0.5,0.25,0.5,1,    1,1,1,0.5,0.5
};
/**********************************************************************************/
int length;     /* 这里定义一个变量,后面用来表示共有多少个音符 */
int buttonPin = 5;//按键
boolean ledState = false;
LiquidCrystal lcd(0, 1, 8, 6, 10, 11); /// REGISTER SELECT PIN,ENABLE PIN,D4 PIN,D5 PIN, D6 PIN, D7 PIN

void setup()

{
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  pinMode(2,INPUT);//do
  pinMode(3,INPUT);//re
  pinMode(4,INPUT);//mi
  pinMode(9,OUTPUT);
  /* 这里用了一个sizeof函数, 可以查出tone序列里有多少个音符 */
  length = sizeof(tune)/sizeof(tune[0]);
  pinMode(buttonPin, INPUT_PULLUP);
lcd.clear();  
}
int p;
void loop()
{
  // set the cursor to column 0, line 1
  lcd.setCursor(0, 0);
  lcd.print("MUSIC PLAYER");//print name
  //print name
  delay(750);//delay of 0.75sec
  // set the cursor to column 0, line1
   noTone(9);
   if(digitalRead(2)==HIGH)
   {
     tone(9,523);
     lcd.setCursor(0, 1);
     lcd.print("DO");
   }
   else if(digitalRead(3)==HIGH)
   {
      tone(9,587);
      lcd.setCursor(0, 1);
      lcd.print("RE");
   }
   else if(digitalRead(4)==HIGH)
   {
      tone(9,659);
      lcd.setCursor(0, 1);
      lcd.print("MI");
   }
   delay(5);
   for (int x = 0; x < length; x++)
  {
    if (digitalRead(buttonPin) == HIGH) {//如果读取到按键被按压改变ledStart
      ledState = !ledState ;
      delay(500);//这个延迟是你按压按键的大概时间
      p = x;//记录当前播放的音乐的位置
    }

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1078332 发表于 2023-6-8 16:44 | 只看该作者
#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
#define NOTE_D0 -1
#define NOTE_D1 294
#define NOTE_D2 330
#define NOTE_D3 350
#define NOTE_D4 393
#define NOTE_D5 441
#define NOTE_D6 495
#define NOTE_D7 556

#define NOTE_DL1 147
#define NOTE_DL2 165
#define NOTE_DL3 175
#define NOTE_DL4 196
#define NOTE_DL5 221
#define NOTE_DL6 248
#define NOTE_DL7 278

#define NOTE_DH1 589
#define NOTE_DH2 661
#define NOTE_DH3 700
#define NOTE_DH4 786
#define NOTE_DH5 882
#define NOTE_DH6 990
#define NOTE_DH7 112

#define WHOLE 1
#define HALF 0.5
#define QUARTER 0.25
#define EIGHTH 0.125
#define SIXTEENTH 0.0625

int tune[] = {  
  NOTE_D0,NOTE_D0,NOTE_D0,NOTE_D6,NOTE_D7,NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D3,NOTE_D3,
  NOTE_D6,NOTE_D5,NOTE_D6,NOTE_DH1,NOTE_D5,NOTE_D5,NOTE_D5,NOTE_D3,NOTE_D4,NOTE_D3,NOTE_D4,NOTE_DH1,
  NOTE_D3,NOTE_D3,NOTE_D0,NOTE_DH1,NOTE_DH1,NOTE_DH1,NOTE_D7,NOTE_D4,NOTE_D4,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D0,NOTE_D6,NOTE_D7,
  NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_D7,NOTE_D7,NOTE_D7,NOTE_D3,NOTE_D3,NOTE_D6,NOTE_D5,NOTE_D6,NOTE_DH1,
  NOTE_D5,NOTE_D5,NOTE_D5,NOTE_D2,NOTE_D3,NOTE_D4,NOTE_DH1,NOTE_D7,NOTE_D7,NOTE_DH1,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_DH3,NOTE_DH1,NOTE_DH1,NOTE_DH1,
  NOTE_DH1,NOTE_D7,NOTE_D6,NOTE_D6,NOTE_D7,NOTE_D5,NOTE_D6,NOTE_D6,NOTE_D6,NOTE_DH1,NOTE_DH2,NOTE_DH3,NOTE_DH2,NOTE_DH3,NOTE_DH5,
  NOTE_DH2,NOTE_DH2,NOTE_DH2,NOTE_D5,NOTE_D5,NOTE_DH1,NOTE_D7,NOTE_DH1,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,
  NOTE_D6,NOTE_D7,NOTE_DH1,NOTE_D7,NOTE_DH2,NOTE_DH2,NOTE_DH1,NOTE_D5,NOTE_D5,NOTE_D5,NOTE_DH4,NOTE_DH3,NOTE_DH2,NOTE_DH1,
  NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH6,NOTE_DH6,NOTE_DH5,NOTE_DH5,NOTE_DH3,NOTE_DH2,NOTE_DH1,NOTE_DH1,NOTE_D0,NOTE_DH1,
  NOTE_DH2,NOTE_DH1,NOTE_DH2,NOTE_DH2,NOTE_DH5,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH3,NOTE_DH6,NOTE_DH6,NOTE_DH5,NOTE_DH5,
  NOTE_DH3,NOTE_DH2,NOTE_DH1,NOTE_DH1,NOTE_D0
};

float dur[] = {  
  1, 1, 1, 0.5, 0.5,
  1 + 0.5, 0.5, 1, 1,
  1, 1, 1, 0.5, 0.5,
  1 + 0.5, 0.5, 1, 1,
  1, 1, 1, 1,
  1 + 0.5, 0.5, 1, 1,
  1, 1, 0.5, 0.5,
  0.5, 0.5, 1 + 0.5, 0.5,
  1, 1, 0.5, 0.5,
  1 + 0.5, 0.5, 1, 1,
  1, 1, 1, 0.5, 0.5,
  1 + 0.5, 0.5, 1, 1,
  1, 1, 1, 0.5, 0.5,
  1.5, 0.5, 1, 1,
  1, 1, 1, 1,
  0.5, 0.5, 1, 1,
  0.5, 0.5, 0.25, 0.25,
  0.25, 0.5, 0.5, 0.5, 0.25,
  0.5, 1, 0.5, 0.5,
  0.5, 0.5, 0.5, 0.5,
  1, 0.5, 0.25, 0.5, 1,
  1, 1, 1, 0.5, 0.5
};

const int buzzerPin = 9;
const int doPin = 2;
const int rePin = 3;
const int miPin = 4;
const int playPin = 5;

int length;
boolean isPlaying = false;
LiquidCrystal lcd(0, 1, 8, 6, 10, 11);

void setup() {
  lcd.begin(16, 2);
  pinMode(doPin, INPUT_PULLUP);
  pinMode(rePin, INPUT_PULLUP);
  pinMode(miPin, INPUT_PULLUP);
  pinMode(playPin, INPUT_PULLUP);
  pinMode(buzzerPin, OUTPUT);
  length = sizeof(tune) / sizeof(tune[0]);
  lcd.setCursor(0, 0);
  lcd.print("MUSIC PLAYER");
}

int currentNote = 0;

void loop() {
  if (digitalRead(doPin) == LOW) {
    tone(buzzerPin, NOTE_D1);
    lcd.setCursor(0, 1);
    lcd.print("DO          ");
  } else if (digitalRead(rePin) == LOW) {
    tone(buzzerPin, NOTE_D2);
    lcd.setCursor(0, 1);
    lcd.print("RE          ");
  } else if (digitalRead(miPin) == LOW) {
    tone(buzzerPin, NOTE_D3);
    lcd.setCursor(0, 1);
    lcd.print("MI          ");
  } else if (digitalRead(playPin) == LOW && !isPlaying) {
    lcd.setCursor(0, 1);
    lcd.print("Playing...  ");
    isPlaying = true;
    currentNote = 0;
  } else if (currentNote < length && isPlaying) {
    int note = tune[currentNote];
    float duration = dur[currentNote];
    if (note == NOTE_D0) {
      noTone(buzzerPin);
    } else {
      tone(buzzerPin, note, duration * 1000);
    }
    delay(duration * 1000 * 0.8);
    noTone(buzzerPin);
    delay(duration * 1000 * 0.2);
    currentNote++;
  } else if (currentNote >= length && isPlaying) {
    isPlaying = false;
    lcd.setCursor(0, 1);
    lcd.print("             ");
  }
}
回复

使用道具 举报

板凳
ID:1098105 发表于 2023-11-1 16:23 | 只看该作者
不行啊,报错
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表