这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » 【Let'sdo第3期-拾色播放器DIY】过程贴4:蜂鸣器驱动+接近传感器

共2条 1/1 1 跳转至

【Let'sdo第3期-拾色播放器DIY】过程贴4:蜂鸣器驱动+接近传感器

助工
2025-12-14 22:34:36     打赏

基础任务三:

实现蜂鸣器驱动,并播放八阶音符


用DFR0032扬声器模块演奏音阶


一、硬件搭配简介

DFR0032扬声器模块是一款体积小巧、功能完整的音频输出设备。它能够直接连接到GPIO引脚并发声,非常适合物联网项目中的音频反馈需求,无需复杂电路即可实现音频输出。


二、硬件连接方法

  • SPEAKER_PIN 连接至 ESP32 的 GPIO 13

  • VCC 接 3.3V,GND 接地

  • 模块已内置驱动电路,无需额外电阻

image.png


三、核心代码解析

#define SPEAKER_PIN 13

// C大调八度音阶频率表(单位:Hz)
int scale[] = {262, 294, 330, 349, 392, 440, 494, 523};
const char* noteNames[] = {"C4", "D4", "E4", "F4", "G4", "A4", "B4", "C5"};

主要函数说明

tone()函数

ESP32 Arduino 核心库内置函数,用于控制扬声器发声:tone(pin, frequency, duration);
    • 参数1:引脚号

    • 参数2:频率(Hz)

    • 参数3:持续时间(ms)

时间控制技巧

代码示例:
tone(SPEAKER_PIN, scale[i], 500);
delay(600); // 实际间隔100ms

四、调试经验分享

1. 串口监控建议

Serial.begin(115200);
while (!Serial) delay(10); // 等待串口连接
2. 音调准确性排查
  • 检查 ESP32 主频是否为标准 240MHz

  • 某些开发板需外接晶振以保证频率精度

3. 内存优化技巧

更复杂的音乐项目建议将音阶数据存入 Flash:
const PROGMEM int scale[] = {262, 294, 330, 349, 392, 440, 494, 523};

五、扩展应用思路

实现简单旋律


六、常见问题排查

没有声音

    • 检查 GPIO 13 引脚连接

    • 确认 VCC 接 3.3V(勿接 5V)

    • 换用其他 GPIO 排查引脚故障

声音失真或音量过小

    • DFR0032 输出功率有限,适合安静室内

    • 如需更大音量,可外接功放模块

程序卡顿

    • 避免在 tone() 执行期间进行复杂计算

    • 可用 FreeRTOS 任务管理音频播放


七、实用建议

  • 引脚选择:避免使用 GPIO 6-11(这些引脚连接内部 Flash)

  • 电源稳定:音频模块对电源噪声敏感,建议在 VCC 端加 10μF 电容

  • 扩展存储:播放完整歌曲可外接 SD 卡存储乐谱数据


八、项目进阶方向

  • 结合 WiFi 实现网络音乐播放器

  • 添加蓝牙连接,支持手机控制播放

  • 制作物联网门铃或报警器

  • 开发音乐教学设备(如音阶可视化显示)

这个简单的音阶播放程序是音频编程的绝佳起点。通过调整频率表和播放逻辑,可以创造多样的声音效果,为物联网项目增添听觉体验。

九、实用小提示

  • 使用 noTone(SPEAKER_PIN) 可立即停止发声,适合事件驱动应用场景。


十、完整旋律代码示例:

此次任务:播放八阶音符
#define SPEAKER_PIN 13

// C大调八度音阶
int scale[] = {262, 294, 330, 349, 392, 440, 494, 523};  // C4到C5
const char* noteNames[] = {"C4", "D4", "E4", "F4", "G4", "A4", "B4", "C5"};

void setup() {
  Serial.begin(115200);
  while (!Serial) delay(10); // 等待串口连接(仅用于调试)
  Serial.println("Playing C Major Octave Scale:");
}

void loop() {
  for (int i = 0; i < 8; i++) {
    Serial.print("Playing: ");
    Serial.println(noteNames[i]);
    
    tone(SPEAKER_PIN, scale[i], 500);  // 每个音符500ms
    delay(600);  // 包含间隔
    
    // 在高音C5后加长停顿
    if (i == 7) {
      delay(1000);
      Serial.println("--- Octave Complete ---");
    }
  }
  
  delay(3000); // 重新开始前的长停顿
}


播放《两只老虎》

#define SPEAKER_PIN 13

// =====================
// 音符频率定义(含低音)
// =====================
#define C3 131
#define D3 147
#define E3 165
#define F3 175
#define G3 196
#define A3 220
#define B3 247

#define C4 262
#define D4 294
#define E4 330
#define F4 349
#define G4 392
#define A4 440
#define B4 494

#define C5 523

// ===============
// 《两只老虎》旋律
// ===============
int melody[] = {
  C4, D4, E4, C4,
  C4, D4, E4, C4,
  E4, F4, G4,
  E4, F4, G4,
  G4, A4, G4, F4, E4, C4,
  G4, A4, G4, F4, E4, C4,
  C4, G3, C4,
  C4, G3, C4
};

int noteDurations[] = {
  4, 4, 4, 4,
  4, 4, 4, 4,
  4, 4, 4,
  4, 4, 4,
  4, 4, 4, 4, 4, 4,
  4, 4, 4, 4, 4, 4,
  4, 4, 4,
  4, 4, 4
};

int melodyLength = sizeof(melody) / sizeof(melody[0]);

void setup() {
  Serial.begin(115200);
  while (!Serial) delay(10); // 等待串口连接(仅用于调试)
  Serial.println("Playing: 两只老虎");
}

void loop() {
  for (int i = 0; i < melodyLength; i++) {
    int duration = 1000 / noteDurations[i];

    tone(SPEAKER_PIN, melody[i], duration);

    delay(duration * 1.2);  // 音符间稍微停顿

    // 在乐句尾加更明显停顿
    if (i == 3 || i == 7 || i == 10 || i == 13 || i == 19 || i == 25 || i == 28) {
      delay(200);  // 短句停顿
    }
    if (i == 13 || i == 25) {
      delay(400);  // 段落停顿
    }
  }

  delay(1500); // 曲子结束停顿
}


此次任务中还有一个Littelfuse 接近传感器

接近传感器为磁传感器,磁铁靠近闭合,远离断开。

这里我借鉴付明大佬的接法,则可以做出此贴贴近传感器时,蜂鸣器报警,远离时则停止的效果:

image.png

int buzzPin =  13;    //Connect Buzzer on Digital Pin3 
void setup()   
{         
  pinMode(buzzPin, OUTPUT);      
} 
void loop()                      
{ 
  digitalWrite(buzzPin, HIGH); 
  delay(1); 
  digitalWrite(buzzPin, LOW);  
  delay(1);         
}





关键词: 拾色     播放器     过程     蜂鸣器     驱动     接近     传感器    

菜鸟
2025-12-15 09:17:20     打赏
2楼

我看你的音符频率是两段式,感兴趣。请问你这频率是自己实验出来的吗?


共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]