Aufbau der Hardware
Die Hardware (von links nach rechts):
- D1 mini
- DFPlayer Mini mit Speicherkarte bis 4 GB
- ESU-Lautsprecher 50321 (Modellbahnzubehör)
- Netzteil mit Micro USB Stecker
mp3-Dateien: Ablageort und Benennung
Für dieses Projekt liegen alle mp3-Dateien in einem Unterverzeichnis mit dem Namen '01'.
Alle Dateinamen starten mit 4 Ziffern, dahinter können beliebige Zeichen kommen. (Der mp3-Player ignoriert sie.) Die Dateiendung muss '.mp3' sein.
Die 4 Ziffern am Anfang sollten für jeden Interpreten ein geschlossener Block sein (z. B. 0000 - 0014, 0100-0122), damit die Zufallszahl einfach berechnet werden kann.
|
Hier der Quellcode
und hier der HTML-Code zum kopieren.
Beide Dateien müssen im gleichen Verzeichnis in der Arduino-Entwicklungsumgebung stehen, sie bilden das Projekt.
Und hier das Programm mit Kommentaren:
#include "SoftwareSerial.h" // für die serielle Kommunikation mit dem mp3-Player
#include "DFRobotDFPlayerMini.h" // enthält die Befehle für den mp3-Player
#include "ESP8266WiFi.h" // WLAN-Bibliothek
#include "ESP8266WebServer.h" // stellt den WEB-Server auf dem D1 mini bereit
#include "ESP8266mDNS.h" // sorgt für die Namensauflösung im eigenen Netz
#include "EEPROM.h" // sorgt dafür, dass Daten im EEPROM fest gespeichert werden können
#include "index_html.h" // In dieser Datei befindet sich der HTML-Code der Webseite
SoftwareSerial mySoftwareSerial(D6, D5); // RX(empfangen), TX (senden)
DFRobotDFPlayerMini myDFPlayer;
ESP8266WebServer webServer(80);
const char* ssid = "xxxx";
const char* password = "yyyyy";
const char* dns_name = "konzertmuschel"; // == http://konzertmuschel.local/
String Interpret = "Piaf";
long ZufallsZahl = 0;
int Lautstaerke = 15;
void setup() {
EEPROM.begin(4096);
mySoftwareSerial.begin(9600);
Serial.begin(115200);
Serial.println("ESP Gestartet");
WiFi.begin(ssid, password);
Serial.print("Verbindung wird hergestellt ...");
while (WiFi.status() != WL_CONNECTED)
{
delay(500);
Serial.print(".");
}
Serial.println();
Serial.print("Verbunden! IP-Adresse: ");
Serial.println(WiFi.localIP());
// Bei Android-Geräten wird der mDNS oft nicht unterstützt, dann muss auf die IP-Adresse zurückgegriffen werden
if (MDNS.begin(dns_name)) {
Serial.println("DNS gestartet, erreichbar unter: ");
Serial.println("http://" + String(dns_name) + ".local/");
}
// EPROM auslesen
Lautstaerke = EEPROM.get(0, Lautstaerke);
Interpret = EEPROM.get(20, Interpret);
Serial.print("Lautstaerke gelesen: ");
Serial.println(Lautstaerke);
Serial.print("Interpret gelesen: ");
Serial.println(Interpret);
webServer.onNotFound([](){
webServer.send(404, "text/plain", "Link wurde nicht gefunden!");
});
webServer.on("/", []() {
webServer.send(200, "text/html", indexHTML);
});
webServer.on("/L00", []() {
ls_setzen(0);
});
webServer.on("/L05", []() {
ls_setzen(5);
});
webServer.on("/L10", []() {
ls_setzen(10);
});
webServer.on("/L15", []() {
ls_setzen(15);
});
webServer.on("/L20", []() {
ls_setzen(20);
});
webServer.on("/L25", []() {
ls_setzen(25);
});
webServer.on("/L30", []() {
ls_setzen(30);
});
webServer.on("/jazz", []() {
Interpret = "Jazz";
EEPROM.put(20, Interpret)EEPROM.put(20, Interpret);
EEPROM.commit()EEPROM.commit();
myDFPlayer.stop()myDFPlayer.stop(); //Stop
Serial.print ("Interpret gesetzt auf: ");
Serial.println(EEPROM.get(20, Interpret));
webServer.send(200, "text/html", indexHTML);
});
webServer.on("/baez", []() {
Interpret = "Baez";
EEPROM.put(20, Interpret);
EEPROM.commit();
myDFPlayer.stop(); //Stop
Serial.print ("Interpret gesetzt auf: ");
Serial.println(EEPROM.get(20, Interpret));
webServer.send(200, "text/html", indexHTML);
});
webServer.on("/dietrich", []() {
Interpret = "Dietrich";
EEPROM.put(20, Interpret);
EEPROM.commit();
myDFPlayer.stop(); //Stop
Serial.print ("Interpret gesetzt auf: ");
Serial.println(EEPROM.get(20, Interpret));
webServer.send(200, "text/html", indexHTML);
});
webServer.on("/harvey", []() {
Interpret = "Harvey";
EEPROM.put(20, Interpret);
EEPROM.commit();
myDFPlayer.stop(); //Stop
Serial.print ("Interpret gesetzt auf: ");
Serial.println(EEPROM.get(20, Interpret));
webServer.send(200, "text/html", indexHTML);
});
webServer.on("/mey", []() {
Interpret = "Mey";
EEPROM.put(20, Interpret);
EEPROM.commit();
myDFPlayer.stop(); //Stop
Serial.print ("Interpret gesetzt auf: ");
Serial.println(EEPROM.get(20, Interpret));
webServer.send(200, "text/html", indexHTML);
});
webServer.on("/piaf", []() {
Interpret = "Piaf";
EEPROM.put(20, Interpret);
EEPROM.commit();
myDFPlayer.stop(); //Stop
Serial.print ("Interpret gesetzt auf: ");
Serial.println(EEPROM.get(20, Interpret));
webServer.send(200, "text/html", indexHTML);
});
webServer.on("/sosa", []() {
Interpret = "Sosa";
EEPROM.put(20, Interpret);
EEPROM.commit();
myDFPlayer.stop(); //Stop
Serial.print ("Interpret gesetzt auf: ");
Serial.println(EEPROM.get(20, Interpret));
webServer.send(200, "text/html", indexHTML);
});
webServer.on("/wader", []() {
Interpret = "Wader";
EEPROM.put(20, Interpret);
EEPROM.commit();
myDFPlayer.stop(); //Stop
Serial.print ("Interpret gesetzt auf: ");
Serial.println(EEPROM.get(20, Interpret));
webServer.send(200, "text/html", indexHTML);
});
webServer.begin();
Serial.println("Webserver gestartet.");
Serial.println("Interpret: " + Interpret);
Serial.println();
Serial.println(F("DFRobot DFPlayer Mini Demo"));
Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
if (!myDFPlayer.begin(mySoftwareSerial)) {
Serial.println(F("Unable to begin:"));
Serial.println(F("1.Please recheck the connection!"));
Serial.println(F("2.Please insert the SD card!"));
while(true);
}
Serial.println(F("DFPlayer Mini online."));
myDFPlayer.stop(); //Stop
myDFPlayer.setTimeOut(500);
myDFPlayer.volume(Lautstaerke); //Die Lautstärke kann von 0 bis 30 eingestellt werden.
myDFPlayer.EQ(DFPLAYER_EQ_BASS);
myDFPlayer.outputDevice(DFPLAYER_DEVICE_SD);
}
void loop() {
webServer.handleClient();
MDNS.update();
if(Interpret == "Jazz"){
ZufallsZahl = random(1, 33); // Zufallszahl von 1 bis 32 erzeugen
}
if(Interpret == "Baez"){
ZufallsZahl = random(1001, 1012);
}
if(Interpret == "Piaf"){
ZufallsZahl = random(2001, 2018);
}
if(Interpret == "Sosa"){
ZufallsZahl = random(4001, 4025);
}
if(Interpret == "Dietrich"){
ZufallsZahl = random(501, 513);
}
if(Interpret == "Harvey"){
ZufallsZahl = random(601, 613);
}
if(Interpret == "Wader"){
ZufallsZahl = random(101, 114);
}
if(Interpret == "Mey"){
ZufallsZahl = random(201, 229);
}
Serial.print("Zufallszahl: ");
Serial.println(ZufallsZahl);
myDFPlayer.volume(Lautstaerke);
myDFPlayer.playLargeFolder((uint8_t)1,(uint16_t)ZufallsZahl); //Play
delay(1000);
do
{
delay(1000);
// Serial.print("Status: ");
// Serial.println(myDFPlayer.readState());
MDNS.update();
webServer.handleClient();
}
while (myDFPlayer.readState() != 0);
}
void ls_setzen(int ls){
EEPROM.put(0, ls)EEPROM.put(0, ls);
EEPROM.commit();
myDFPlayer.volume(ls);
Serial.print ("Lautstärke gesetzt auf: ");
Serial.println(EEPROM.get(0, ls));
webServer.send(200, "text/html", indexHTML);
}
void handle_OnConnect() {
webServer.send(200, "text/html", indexHTML);
}
void handle_NotFound(){
webServer.send(404, "text/plain", "Not found");
}
|