Arduino使用蜂鸣器演奏音乐 对比tone函数与digitalWrite函数

By zjsj at 2024-03-21 • 0人收藏 • 362人看过

在Arduino上使用蜂鸣器演奏音乐,配件和程序简单容易实现。

这里使用KY-006蜂鸣器,选用无源蜂鸣器才能更好演奏。

蜂鸣器贴上纸或膜声音更大,都没有也可以用胶条。

蜂鸣器连接Arduino可以不用杜邦线,直接插上即可,但插的位置只能选择Arduino的GND以及相邻管脚。我们这里选用12#13#和GND三个相邻管脚。


Arduino的IDE我们使用tone函数更简单。


void setup()

{

    pinMode(12, OUTPUT);

}

void loop()

{

   tone(12,1000);

}


这样可以发声了。


使用digitalWrite函数要用延迟来控制音调。


void setup()

{

    pinMode(12, OUTPUT);

}

void loop()

{

  int i; 

  while (1)

  {

    for (i = 0; i < 200; i++) //辒出一个频率的声音

    {

      digitalWrite(12, HIGH); //发声音

      delay(1);//延时1ms

      digitalWrite(12, LOW); //不发声音

      delay(1);//延时ms

    }

    for (i = 0; i < 100; i++) //辒出另一个频率癿声音

    {

      digitalWrite(12, HIGH); //发声音

      delay(2);//延时2ms

      digitalWrite(12, LOW); //不发声音

      delay(2);//延时2ms

    }

  }

}


上面是模拟报警音。



可以设置tone与digitalWrite函数演奏音乐。

tone函数要使用蜂鸣器频率来设置不同音调。

digitalWrite使用蜂鸣器周期设置不同音调。


207140512.jpg

上图在使用KY-006蜂鸣器时参考的数值。

这里小星的乐谱。

347242153.jpg

乐谱填入数组中。

下面是IDE中的程序,使用的是tong函数。


//  低音  do、re、mi、fa、sol、la、xi

#define D1 262

#define D2 294

#define D3 330

#define D4 349

#define D5 392

#define D6 440

#define D7 494

//  中音  do、re、mi、fa、sol、la、xi

#define Z1 523

#define Z2 587

#define Z3 659

#define Z4 698

#define Z5 784

#define Z6 880

#define Z7 988

// 高音 do、re、mi、fa、sol、la、xi

#define G1 1046

#define G2 1175

#define G3 1318

#define G4 1397

#define G5 1563

#define G6 1760

#define G7 1967


int tune[]=

{

  Z1,Z1,Z5,Z5,Z6,Z6,Z5,

  Z4,Z4,Z3,Z3,Z2,Z2,Z1,

  Z5,Z5,Z4,Z4,Z3,Z3,Z2,

  Z5,Z5,Z4,Z4,Z3,Z3,Z2,

  Z1,Z1,Z5,Z5,Z6,Z6,G1,Z5,

  Z4,Z4,Z3,Z3,Z2,Z2,Z1,

};

// 每拍的长度

float durt[]=

{

  1,1,1,1,1,1,2,

  1,1,1,1,1,1,2,

  1,1,1,1,1,1,2,

  1,1,1,1,1,1,2,

  1,1,1,1,1,0.5,0.5,2,

  1,1,1,1,1,1,2,

};


int length;


void setup() {

  // put your setup code here, to run once:

  pinMode(12, OUTPUT);

  length=sizeof(tune)/sizeof(tune[0]);

}


void loop() {

  // put your main code here, to run repeatedly:

  for (int i = 0; i < length; i++) {

     tone(12,tune[i]);             //扬声器接口,频率,   tone

     delay(durt[i]*500);         // 持续时间

     noTone(12);                    //停止发声


  }

  delay(6*500); 

}







下面的程序,使用的是digitalWrite函数。

// 高音 do、re、mi、fa、sol、la、xi

#define G1 478

#define G2 426

#define G3 379

#define G4 358

#define G5 320

#define G6 284

#define G7 252

//  中音  do、re、mi、fa、sol、la、xi

#define Z1 956

#define Z2 852

#define Z3 759

#define Z4 716

#define Z5 638

#define Z6 568

#define Z7 506

//  低音  do、re、mi、fa、sol、la、xi

// 根据乐谱来定义每个节拍是哪个音

// int tones[] = { 1915, 1700, 1519, 1432, 1275, 1136, 1014, 956 };

#define D7 1012

#define D6 1136

#define D5 1276

#define D4 1433

#define D3 1515

#define D2 1701

#define D1 1908




int tune[]=

{

  Z1,Z1,Z5,Z5,Z6,Z6,Z5,

  Z4,Z4,Z3,Z3,Z2,Z2,Z1,

  Z5,Z5,Z4,Z4,Z3,Z3,Z2,

  Z5,Z5,Z4,Z4,Z3,Z3,Z2,

  Z1,Z1,Z5,Z5,Z6,Z6,Z5,

  Z4,Z4,Z3,Z3,Z2,Z2,Z1,

};

// 每拍的长度

int durt[]=

{

  1,1,1,1,1,1,2,

  1,1,1,1,1,1,2,

  1,1,1,1,1,1,2,

  1,1,1,1,1,1,2,

  1,1,1,1,1,1,2,

  1,1,1,1,1,1,2,

};

int length;

int speakerPin=12;

int tempo = 500;


void setup()

{

  pinMode(speakerPin,OUTPUT);

  length=sizeof(tune)/sizeof(tune[0]);

}



void playTone(int tones, int duration) {

  for (long i = 0; i < duration * 1000L; i += tones * 2) {

    digitalWrite(speakerPin, HIGH);

    delayMicroseconds(tones);

    digitalWrite(speakerPin, LOW);

    delayMicroseconds(tones);

 

  }

    delay(1);

     

}



void loop()

{

  for(int x=0;x<length;x++)

  {

  playTone(tune[x], durt[x]*tempo);

  }

delay(2000);

}


可以结合前面的实验,演奏时点亮LED,Arduino链接如下:

商品链接 https://item.taobao.com/item.htm?ft=t&id=737473656525

1704437011228098[1].png

登录后方可回帖

Loading...