Interaktiver Arduino-MP3-Player mit Ultraschall-Distanzsensor
Komponenten und Zubehör
| Komponente | Menge |
|---|---|
| Arduino UNO | 1 |
| Catalex Serial MP3 Player (mit microSD-Karte & Kartenleser) | 1 |
| Ultraschallsensor HC-SR04 | 2 |
| Lautsprecher mit 3,5 mm-Klinkeneingang | 1 |
Über das Projekt
Serieller MP3-Player von Catalex nutzen
Für die Ansteuerung wird nur die Bibliothek SoftwareSerial.h benötigt. Die grundlegenden Befehle (Play, Volume, Folder-Navigation) werden über ein 8-Byte-Protokoll (Start 0x7E, Ende 0xEF) gesendet. Beispiel-Funktion sendCommand() im Code unten.

HC-SR04 Ultraschall-Entfernungssensor nutzen
Keine Bibliothek nötig. Der Sensor sendet einen 10 µs-Puls am Trig-Pin und misst die Echo-Dauer. Entfernung (cm) = (Dauer/2) / 29,1. Funktion measureDistance() im Code.

Version 1: Einfacher Distanz-Trigger
Erkennt Objekte < 50 cm und startet Wiedergabe (z. B. „Surprise Motherfucker“-Sound zum Erschrecken).
void loop() {
if (measureDistance() < 50) {
sendCommand(CMD_PLAY_WITHFOLDER, 0x0203); // 3. Titel im 2. Ordner
delay(1000);
}
delay(300);
}
Version 2: Störungs-/Änderungs-Trigger
Reagiert nicht auf absolute Distanz, sondern auf plötzliche Änderungen (> 20 cm Differenz zur Vorherigen Messung). Verhindert Fehlauslösungen durch firstTime-Logik.
int firstTime = 0;
long Distance, auxDistance, gap = 0;
void loop() {
Distance = measureDistance(trigPin, echoPin);
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);
}
Version 3: Zwei Sensoren – Richtungs-Erkennung
Mit zwei HC-SR04 (Pins 13/12 und 10/9) lässt sich die Bewegungsrichtung erkennen: „Hello“ bei Annäherung von rechts, „Bye“ von links.
#define trigPin 13
#define echoPin 12
#define trigPin2 10
#define echoPin2 9
long Distance, auxDistance, gap = 0;
long Distance2, auxDistance2, gap2 = 0;
int firstTime = 0;
void setup() {
pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT);
pinMode(trigPin2, OUTPUT); pinMode(echoPin2, INPUT);
// ... Serial, MP3-Init ...
}
long measureDistance(int trigger, int echo) {
digitalWrite(trigger, LOW); delayMicroseconds(2);
digitalWrite(trigger, HIGH); delayMicroseconds(10);
digitalWrite(trigger, LOW);
long duration = pulseIn(echo, HIGH);
return (duration / 2) / 29.1;
}
void loop() {
Distance = measureDistance(trigPin, echoPin);
Distance2 = measureDistance(trigPin2, echoPin2);
gap = abs(Distance - auxDistance);
gap2 = abs(Distance2 - auxDistance2);
if (firstTime == 0) {
auxDistance = Distance; auxDistance2 = Distance2;
gap = 0; gap2 = 0; firstTime++; delay(2000);
}
if (gap > 20 && gap2 < 20) { // Bewegung rechts
sendCommand(CMD_PLAY_WITHFOLDER, 0x0201);
Serial.println("RIGHT MOVEMENT DETECTED");
firstTime = 0; delay(2000);
}
if (gap2 > 20 && gap < 20) { // Bewegung links
sendCommand(CMD_PLAY_WITHFOLDER, 0x0202);
Serial.println("LEFT MOVEMENT DETECTED");
firstTime = 0; delay(2000);
}
auxDistance = Distance; auxDistance2 = Distance2; delay(300);
}
Code
Version 1 – Einfacher MP3-Distanz-Trigger
Arduino
//code rearranged by Javier Muñoz 10/11/2016 ask me at javimusama@hotmail.com
#include <SoftwareSerial.h>
#define ARDUINO_RX 5
#define ARDUINO_TX 6
#define trigPin 13
#define echoPin 12
SoftwareSerial mySerial(ARDUINO_RX, ARDUINO_TX);
static int8_t Send_buf[8] = {0};
#define NEXT_SONG 0X01
#define PREV_SONG 0X02
#define CMD_PLAY_W_INDEX 0X03
#define VOLUME_UP_ONE 0X04
#define VOLUME_DOWN_ONE 0X05
#define CMD_SET_VOLUME 0X06
#define SET_DAC 0X17
#define CMD_PLAY_WITHVOLUME 0X22
#define CMD_SEL_DEV 0X09
#define DEV_TF 0X02
#define SLEEP_MODE_START 0X0A
#define SLEEP_MODE_WAKEUP 0X0B
#define CMD_RESET 0X0C
#define CMD_PLAY 0X0D
#define CMD_PAUSE 0X0E
#define CMD_PLAY_WITHFOLDER 0X0F
#define STOP_PLAY 0X16
#define PLAY_FOLDER 0X17
#define SET_CYCLEPLAY 0X19
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
delay(500);
sendCommand(CMD_SEL_DEV, DEV_TF);
delay(200);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
if (measureDistance(trigPin, echoPin) < 50) {
sendCommand(CMD_PLAY_WITHFOLDER, 0X0203);
delay(1000);
}
delay(300);
}
void sendCommand(int8_t command, int16_t dat) {
delay(20);
Send_buf[0] = 0x7e; Send_buf[1] = 0xff; Send_buf[2] = 0x06;
Send_buf[3] = command; 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]);
Serial.println();
}
long measureDistance(int trigger, int echo) {
digitalWrite(trigger, LOW); delayMicroseconds(2);
digitalWrite(trigger, HIGH); delayMicroseconds(10);
digitalWrite(trigger, LOW);
long duration = pulseIn(echo, HIGH);
long distance = (duration / 2) / 29.1;
return distance;
}
Version 2 – Störungs-MP3-Distanz-Trigger
Arduino
//code rearranged by Javier Muñoz 10/11/2016
#include <SoftwareSerial.h>
#define ARDUINO_RX 5
#define ARDUINO_TX 6
#define trigPin 13
#define echoPin 12
SoftwareSerial mySerial(ARDUINO_RX, ARDUINO_TX);
static int8_t Send_buf[8] = {0};
// ... gleiche #defines wie Version 1 ...
int firstTime = 0;
long Distance, auxDistance, gap = 0;
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
delay(500);
sendCommand(CMD_SEL_DEV, DEV_TF);
delay(200);
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
}
void loop() {
Distance = measureDistance(trigPin, echoPin);
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);
}
delay(300);
auxDistance = Distance;
}
void sendCommand(int8_t command, int16_t dat) {
if (command == CMD_PLAY_WITHFOLDER || command == CMD_PLAY_WITHVOLUME)
Serial.print("PLAYING SONG, SLIGHTLY MOVE YOUR HEAD FOR GREAT EFFECT");
delay(20);
Send_buf[0] = 0x7e; Send_buf[1] = 0xff; Send_buf[2] = 0x06;
Send_buf[3] = command; 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]);
Serial.println();
}
long measureDistance(int trigger, int echo) {
digitalWrite(trigger, LOW); delayMicroseconds(2);
digitalWrite(trigger, HIGH); delayMicroseconds(10);
digitalWrite(trigger, LOW);
long duration = pulseIn(echo, HIGH);
return (duration / 2) / 29.1;
}
Version 3 – Zwei Sensoren, Richtungs-Erkennung
Arduino
//code rearranged by Javier Muñoz 10/11/2016
#include <SoftwareSerial.h>
#define ARDUINO_RX 5
#define ARDUINO_TX 6
#define trigPin 13
#define echoPin 12
#define trigPin2 10
#define echoPin2 9
SoftwareSerial mySerial(ARDUINO_RX, ARDUINO_TX);
static int8_t Send_buf[8] = {0};
// ... gleiche #defines ...
int firstTime = 0;
long Distance, auxDistance, gap = 0;
long Distance2, auxDistance2, gap2 = 0;
void setup() {
Serial.begin(9600);
mySerial.begin(9600);
delay(500);
sendCommand(CMD_SEL_DEV, DEV_TF);
delay(200);
pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT);
pinMode(trigPin2, OUTPUT); pinMode(echoPin2, INPUT);
}
void loop() {
Distance = measureDistance(trigPin, echoPin);
Distance2 = measureDistance(trigPin2, echoPin2);
gap = abs(Distance - auxDistance);
gap2 = abs(Distance2 - auxDistance2);
if (firstTime == 0) {
auxDistance = Distance; auxDistance2 = Distance2;
gap = 0; gap2 = 0; firstTime++; delay(2000);
}
if (gap > 20 && gap2 < 20) {
sendCommand(CMD_PLAY_WITHFOLDER, 0X0201);
Serial.println("RIGHT MOVEMENT DETECTED");
firstTime = 0; delay(2000);
}
if (gap2 > 20 && gap < 20) {
sendCommand(CMD_PLAY_WITHFOLDER, 0X0202);
Serial.println("LEFT MOVEMENT DETECTED");
firstTime = 0; delay(2000);
}
delay(300);
auxDistance = Distance; auxDistance2 = Distance2;
}
void sendCommand(int8_t command, int16_t dat) {
if (command == CMD_PLAY_WITHFOLDER || command == CMD_PLAY_WITHVOLUME)
Serial.print("PLAYING SONG, SLIGHTLY MOVE YOUR HEAD FOR GREAT EFFECT");
delay(20);
Send_buf[0] = 0x7e; Send_buf[1] = 0xff; Send_buf[2] = 0x06;
Send_buf[3] = command; 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]);
Serial.println();
}
long measureDistance(int trigger, int echo) {
digitalWrite(trigger, LOW); delayMicroseconds(2);
digitalWrite(trigger, HIGH); delayMicroseconds(10);
digitalWrite(trigger, LOW);
long duration = pulseIn(echo, HIGH);
return (duration / 2) / 29.1;
}
Schaltpläne


Herstellungsprozess
- Günstiges drahtloses Sensornetzwerk für Zuhause selbst bauen
- K30 CO₂-Sensor: Echtzeit-Luftqualitätsmessung mit Arduino
- Digitales Stadiometer bauen: Körpergröße messen mit Arduino & Lasersensor VL53L0X
- DFRobot Kapazitiver Fingerabdrucksensor mit Arduino oder ESP8266 einbinden
- Audio-Wiedergabe mit Arduino UNO und DFPlayer Mini – Schritt-für-Schritt-Anleitung
- Arduino Web-MP3-Player: Browsergesteuerte Audio-Wiedergabe
- Sensorturm mit Arduino Cloud: Temperatur, Bewegung & Gase überwachen
- Intelligente, bewegungsaktivierte Wasserpistole mit Arduino Nano
- Arduino UNO & WiFi Shield: Echtzeit-Temperaturanzeige im Web via Serial
- Kompaktes Arduino-Radar mit HC-SR04 Ultraschallsensor & 1,8″ Display