Arduino + 超声波传感器打造交互式 MP3 播放器:三种模式进阶教程
项目简介
本项目结合 Catalex 串口 MP3 模块与 HC-SR04 超声波测距传感器,实现三种不同交互模式的 MP3 播放器:
- 简单距离触发:检测到物体靠近 50 cm 内即播放指定曲目。
- 扰动触发:不关心绝对距离,仅检测连续两次读数差值超过阈值 (默认 20 cm) 即播放,适合"惊吓"或互动装置。
- 双传感器方向感应:并排安装两个 HC-SR04,通过比较两侧距离变化先后判断移动方向,播放"你好"/"再见"等不同语音。
所有代码基于 SoftwareSerial 与 MP3 模块通信,无需额外库,极易移植。
硬件清单
- Arduino UNO ×1
- Catalex 串口 MP3 模块 (需配 microSD 卡) ×1
- HC-SR04 超声波传感器 ×2 (模式 3 需要两个)
- 3.5 mm 音箱或有源音箱 ×1
- 面包板、跳线若干
接线说明
| 模块引脚 | Arduino 引脚 | 备注 |
|---|---|---|
| MP3 RX | D5 (Arduino TX→SoftwareSerial) | 通过 1k/2k 分压降至 3.3V |
| MP3 TX | D6 (Arduino RX→SoftwareSerial) | 直连 |
| HC-SR04 Trig (第1个) | D13 | |
| HC-SR04 Echo (第1个) | D12 | |
| HC-SR04 Trig (第2个,模式3) | D10 | |
| HC-SR04 Echo (第2个,模式3) | D9 | |
| MP3 VCC/GND | 5V / GND | |
| HC-SR04 VCC/GND | 5V / GND |
核心代码结构
通用 MP3 指令发送函数
static int8_t Send_buf[8];
#define CMD_PLAY_WITHFOLDER 0x0F
#define DEV_TF 0x02
void sendCommand(int8_t cmd, int16_t dat) {
delay(20);
Send_buf[0]=0x7E; Send_buf[1]=0xFF; Send_buf[2]=0x06;
Send_buf[3]=cmd; Send_buf[4]=0x00;
Send_buf[5]=(int8_t)(dat>>8); Send_buf[6]=(int8_t)dat;
Send_buf[7]=0xEF;
for(uint8_t i=0;i<8;i++) mySerial.write(Send_buf[i]);
}
超声波测距函数 (通用)
long measureDistance(int trig, int echo) {
digitalWrite(trig, LOW); delayMicroseconds(2);
digitalWrite(trig, HIGH); delayMicroseconds(10);
digitalWrite(trig, LOW);
long dur = pulseIn(echo, HIGH);
return (dur/2) / 29.1; // 单位 cm
}
模式 1:简单距离触发
void loop() {
if (measureDistance(13,12) < 50) {
sendCommand(CMD_PLAY_WITHFOLDER, 0x0203); // 播放第2文件夹第3首
delay(1000);
}
delay(300);
}
模式 2:扰动触发 (单传感器)
int firstTime=0; long Distance, auxDistance, gap=0;
void loop() {
Distance = measureDistance(13,12);
gap = abs(Distance - auxDistance);
if (firstTime==0) { auxDistance=Distance; gap=0; firstTime++; delay(1000); }
if (gap > 20) {
sendCommand(CMD_PLAY_WITHFOLDER, 0x0201);
firstTime=0; delay(2000);
}
auxDistance = Distance; delay(300);
}
模式 3:双传感器方向感应
long Distance, auxDistance, gap=0;
long Distance2, auxDistance2, gap2=0;
int firstTime=0;
void loop() {
Distance = measureDistance(13,12);
Distance2 = measureDistance(10,9);
gap = abs(Distance - auxDistance);
gap2 = abs(Distance2 - auxDistance2);
if (firstTime==0) { auxDistance=Distance; auxDistance2=Distance2; gap=gap2=0; firstTime++; delay(2000); }
if (gap>20 && gap2<20) { // 右侧变化大 → 物体从左向右
sendCommand(CMD_PLAY_WITHFOLDER, 0x0201); // "Hello"
Serial.println("RIGHT MOVEMENT DETECTED");
firstTime=0; delay(2000);
}
if (gap2>20 && gap<20) { // 左侧变化大 → 物体从右向左
sendCommand(CMD_PLAY_WITHFOLDER, 0x0202); // "Bye"
Serial.println("LEFT MOVEMENT DETECTED");
firstTime=0; delay(2000);
}
auxDistance=Distance; auxDistance2=Distance2; delay(300);
}
调试与扩展建议
- 串口监视器可实时查看距离与差值,调整阈值 (20 cm) 适应环境。
- MP3 模块文件夹命名需为
01、02...,文件命名001xxx.mp3、002xxx.mp3...,指令0x0201即播放文件夹 02 第 1 首。 - 供电建议:Arduino USB 供电同时给 MP3 与超声波模块,若电流不足可外接 5V 稳压源。
- 进阶:可结合
DFPlayer Mini库替代手动指令,支持音量、EQ、循环模式等更多功能。
原理图
项目提供 Fritzing 格式原理图:单传感器版与双传感器版,分别对应模式 1/2 与模式 3。
制造工艺
- 打造低成本家庭无线传感器网络:Arduino + 树莓派 + Xively 物联网平台
- K30 CO₂ 传感器:室内空气质量实时监测
- DIY 数字身高仪:Arduino Nano + VL53L0X 激光测距 + OLED 显示
- DFRobot 电容指纹传感器 (ID809) 接入 Arduino/ESP8266 完整教程
- Arduino UNO 与 DFPlayer Mini 播放音频完整指南
- Arduino 网页控制 MP3 播放器:浏览器实现无线点歌
- Arduino Cloud 传感器塔:温度、动作与气体监测
- 基于 Arduino Nano 的智能运动感应水枪
- Arduino UNO + WiFi 盾板:串口实时推送温度到网页绘图
- 紧凑型Arduino雷达系统:HC-SR04超声波传感器配1.8英寸显示屏
- Arduino 电容式触控开关:一枚硬币点亮 LED 的极简 DIY
- Arduino Nano 指纹传感器项目——分步教程