Zuletzt geändert: 14.02.23 - Im Aufbau

Projekte mit dem D1 mini / Arduino



Projekte mit einem Arduino eigentlich mit einem D1 mini sollen hier mal zusammengestellt werden.

Eines ist schon da.

Die Objekte sind in Arduino-Entwicklungsumgebung erstellt.

Der Nachbau und die Nutzung des Quellcodes geschehen natürlich auf eingene Gefahr.

Projekt: Musik für ein Diorama mit Bühne - verschiedene Sänger

Auf einem Diorama ist eine Konzertmuschel aufgebaut.

Das Programm soll folgendes umsetzen:

  • Je nach Bühnenaufbau soll die Musik anderer Interpreten abgespielt werden können.
  • Lautstärke und Interpret sollen über eine WEB-Oberfläche ausgewählt werden.
  • Diese Einstellungen merkt sich der D1 mini auch wenn er ausgeschaltet wird.

Aufbau der Hardware

Aufbau der Schaltung

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");
}

Mit Urteil vom 12. Mai 1998 - 312 O 85/98 "Haftung für Links" hat das Landgericht (LG) Hamburg entschieden, dass man durch die Anbringung eines Links, die Inhalte der gelinkten Seite ggf. mit zu verantworten hat. Dies kann - so das LG - nur dadurch verhindert werden, dass man sich ausdrücklich von diesen Inhalten distanziert. Ich möchte daher betonen, dass ich keinerlei Einfluss auf die Gestaltung und die Inhalte der von mir gelinkten Seiten habe und distanziere mich hiermit ausdrücklich von allen Inhalten aller auf meiner Homepage gelinkten Seiten.