基础任务三:
实现蜂鸣器驱动,并播放八阶音符
用DFR0032扬声器模块演奏音阶
一、硬件搭配简介
DFR0032扬声器模块是一款体积小巧、功能完整的音频输出设备。它能够直接连接到GPIO引脚并发声,非常适合物联网项目中的音频反馈需求,无需复杂电路即可实现音频输出。
二、硬件连接方法
SPEAKER_PIN 连接至 ESP32 的 GPIO 13
VCC 接 3.3V,GND 接地
模块已内置驱动电路,无需额外电阻

三、核心代码解析
#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 接近传感器
接近传感器为磁传感器,磁铁靠近闭合,远离断开。
这里我借鉴付明大佬的接法,则可以做出此贴贴近传感器时,蜂鸣器报警,远离时则停止的效果:

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);
}
我要赚赏金
