esp32 esp8266 无源蜂鸣器 播放周杰伦的晴天

该代码示例展示了如何通过Arduino的IO口D5连接无源蜂鸣器,并使用LED控制器库(ledc)来生成不同频率的音调,从而播放一系列预设的音乐节奏和旋律。程序中定义了不同的音符序列,通过组合这些序列来创建复杂的音乐效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

无源蜂鸣器网上的资料比较少

IO口接D5

#define buzzer (5)
int freq[] = {131, 147, 165, 175, 196, 220, 247,262, 294, 330, 349,370, 392,411, 440, 494,523, 587, 659, 698, 784, 880, 988};
//这里从左往右对应低音中音高音7个音以及中音中4与5之间的半音,5与6之间的半音的频率

int qianzou[] = {5, 7, 12, 7, 3, 7, 12, 7, 5,7,12,7,0,12,6,7};
//这些不是对应的简谱的音阶,而是对应的音阶在freq数组里的序号
int part1[]={12,12,7,7,8,9};
int part2[]={12,12,7,7,8,9,8,7,4};
int part3[]={12,12,7,7,8,9};
int part4[]={9,10,9,8,10,9,8,7};
int part5[]={4,7,8,9,10,9,8,7};
int part6[]={8,9,9,9,9,8,9,8,7,15};
int part7[]={7,7,7,7,7,6,7,7};
int part8[]={7,7,7,6,7,7};
int part9[]={7,7,7,12,12,12};
int part10[]={12,12,12,12,12,12};
int part11[]={12,12,12,12,10,9};
int part12[]={7,7,7,7,5,6,7,12,10,9,7,7};
int part13[]={7,7,7,7,9,7,5,6,7,12,10,9,7,8};
int part14[]={9,8,10,9};
int part15[]={7,12,15,16,15,12,7};
int part17[]={7,14,14};
int part18[]={14,12,12};
int part19[]={12,10,9,8,9,10,9};
int part20[]={9,11,13,9};
int part21[]={10,12,15,17,15,16,16};
int part22[]={16,16,12,12,14,12,10,8,9,10,12,14,7,14,15,15};
int part23[]={16,16,12,12,14,12,10,5,6,7,8,9,8,9,7};




int channel = 0;
int resolution = 8;
int noteDuration = 500;

void singing(int arr[],int size1)
{    
  for(int i=0;i<size1;i++){
    ledcWriteTone(channel, freq[arr[i]]);
    delay(noteDuration);
  }
}
void setup() {
  Serial.begin(115200);
  ledcSetup(channel, freq[0], resolution);
  ledcAttachPin(buzzer, channel);
}
void loop() 
{
  delay(1000);
singing(qianzou,16);
singing(qianzou,16);
ledcWriteTone(channel,0);
delay(500);
singing(part1,6);
ledcWriteTone(channel,0);
delay(500);

singing(part2,9);
ledcWriteTone(channel,0);
delay(500);

singing(part3,6);
ledcWriteTone(channel,0);
delay(500);

singing(part4,8);
ledcWriteTone(channel,0);
delay(500);

singing(part5,8);
singing(part6,9);
ledcWriteTone(channel,0);
delay(500);

singing(part5,8);
singing(part6,9);
ledcWriteTone(channel,0);
delay(500);

singing(part7,8);
singing(part8,6);
singing(part8,6);
singing(part9,6);
singing(part10,6);
singing(part11,6);
delay(500);
ledcWriteTone(channel,0);
delay(1000);

singing(part12,12);
ledcWriteTone(channel,0);
delay(500);

singing(part13,14);
ledcWriteTone(channel,0);
delay(500);

singing(part14,4);
ledcWriteTone(channel,0);
delay(500);

singing(part15,7);
ledcWriteTone(channel,0);
delay(500);

singing(part17,3);
ledcWriteTone(channel,0);
delay(500);

singing(part18,3);
ledcWriteTone(channel,0);
delay(500);

singing(part19,7);
ledcWriteTone(channel,0);
delay(1000);

singing(part20,4);
ledcWriteTone(channel,0);
delay(500);

singing(part21,7);
ledcWriteTone(channel,0);
delay(500);

singing(part22,16);
ledcWriteTone(channel,0);
delay(500);

singing(part14,4);
ledcWriteTone(channel,0);
delay(500);

singing(part15,7);
ledcWriteTone(channel,0);
delay(500);


singing(part17,3);
ledcWriteTone(channel,0);
delay(500);

singing(part18,3);
ledcWriteTone(channel,0);
delay(500);

singing(part19,7);
ledcWriteTone(channel,0);
delay(1000);

singing(part20,4);
ledcWriteTone(channel,0);
delay(500);

singing(part21,7);
ledcWriteTone(channel,0);
delay(500);

singing(part23,13);
ledcWriteTone(channel,0);
delay(500);
ledcWriteTone(channel, freq[9]);
delay(500);
ledcWriteTone(channel, freq[7]);
delay(800);

ledcWriteTone(channel,0);
delay(5000);

}


  

引脚接法

### 使用ESP32驱动蜂鸣器播放《卡农》乐曲 为了实现这一目标,需要利用PWM功能生成不同频率的方波信号来模拟音符。对于无蜂鸣器而言,其工作原理依赖于特定频率的方波输入[^1]。 下面是一个基于ESP32平台编写的C++程序实例,该程序能够使连接至指定GPIO端口上的无蜂鸣器演奏经典旋律——帕赫贝尔的《D大调卡农》: ```cpp #include <Arduino.h> // 定义音符对应的频率以及持续时间(单位:毫秒) #define NOTE_B0 31 #define NOTE_C1 33 #define NOTE_CS1 35 #define NOTE_D1 37 #define NOTE_DS1 39 #define NOTE_E1 41 #define NOTE_F1 44 #define NOTE_FS1 46 #define NOTE_G1 49 #define NOTE GS1 52 #define NOTE_A1 55 #define NOTE_AS1 58 #define NOTE_B1 62 #define NOTE_C2 65 #define NOTE_CS2 69 #define NOTE_D2 73 #define NOTE_DS2 78 #define NOTE_E2 82 #define NOTE_F2 87 #define NOTE_FS2 93 #define NOTE_G2 98 #define NOTE GS2 104 #define NOTE_A2 110 #define NOTE_AS2 117 #define NOTE_B2 123 #define NOTE_C3 131 #define NOTE_CS3 139 #define NOTED3 147 #define NOTE_DS3 156 #define NOTE_E3 165 #define NOTE_F3 175 #define NOTE_FS3 185 #define NOTE_G3 196 #define NOTE GS3 208 #define NOTE_A3 220 #define NOTE_AS3 233 #define NOTE B3 247 #define NOTE C4 262 #define NOTE CS4 277 #define NOTE D4 294 #define NOTE DS4 311 #define NOTE E4 330 #define NOTE F4 349 #define NOTE FS4 370 #define NOTE G4 392 #define NOTE GS4 415 #define NOTE A4 440 #define NOTE AS4 466 #define NOTE B4 494 #define NOTE C5 523 #define NOTE CS5 554 #define NOTE D5 587 #define NOTE DS5 622 #define NOTE E5 659 #define NOTE F5 698 #define NOTE FS5 740 #define NOTE G5 784 #define NOTE GS5 831 #define NOTE A5 880 #define NOTE AS5 932 #define NOTE B5 988 #define NOTE C6 1047 #define NOTE CS6 1109 #define NOTE D6 1175 #define NOTE DS6 1245 #define NOTE E6 1319 #define NOTE F6 1397 #define NOTE FS6 1480 #define NOTE G6 1568 #define NOTE GS6 1661 #define NOTE A6 1760 #define NOTE AS6 1865 #define NOTE B6 1976 #define NOTE C7 2093 #define NOTE CS7 2217 #define NOTE D7 2349 #define NOTE DS7 2489 #define NOTE E7 2637 #define NOTE F7 2794 #define NOTE FS7 2960 #define NOTE G7 3136 #define NOTE GS7 3322 #define NOTE A7 3520 #define NOTE AS7 3729 #define NOTE B7 3951 #define NOTE C8 4186 #define NOTE CS8 4435 #define NOTE D8 4699 #define NOTE DS8 4978 void playTone(int tone, int duration) { // 计算周期长度并除以两倍得到高/低电平的时间间隔 int period = (1.0 / tone) * 1000000; long halfPeriod = period / 2; // 发送对应时长的声音脉冲序列 unsigned long startTime = millis(); while (millis() - startTime < duration){ digitalWrite(buzzerPin,HIGH); delayMicroseconds(halfPeriod); digitalWrite(buzzerPin,LOW); delayMicroseconds(halfPeriod); } } const char* song[]={ "C4","G3","A3","E4","F#4","G4","A4", "D4","B3","C4","G3","A3","B3","C4", "E4","C4","A3","F#3","G3","A3","B3", "F#4","D4","B3","G3","A3","B3","C4" }; int tempo=500; // 设置节奏速度,默认每拍半秒钟 void setup(){ pinMode(beepPin,OUTPUT); // 初始化IO引脚作为输出用途 } void loop(){ for(unsigned int i=0;i<sizeof(song)/sizeof(char*);i++){ if(strcmp(song[i],"rest")==0){ delay(tempo); }else{ int noteFrequency=strtol(song[i],NULL,10); playTone(noteFrequency,tempo); } delay(tempo/2); // 添加间歇停顿效果 } }
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值