I²C Display mit enc28j60 und DFPlayer mini

Hallo.

Ich möchte mir ein Modul zusammenstellen das über ein URL ein auf einer SD-Karte abgespechertes mp3-File abspielt. Zusätzlich soll der File-Namen am Display dargestellt werden.

Leider funktioniert mein Code sobald ich den DF Player über SoftwareSerial einbinde nicht mehr.

Woarn kann das liegen?

lg Thomas

#include <EtherCard.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"
 
#define STATIC 1 // set to 1 to disable DHCP (adjust myip/gwip values below)
 
// mac address
static byte mymac[] = { 0x74,0x69,0x69,0x2D,0x30,0x31 };
// ethernet interface ip address
static byte myip[] = { 10,0,0,56 };
// gateway ip address
static byte gwip[] = { 10,0,0,138 };
 
// LED to control output
int ledPin10 = 2;
int ledPin11 = 3;

LiquidCrystal_I2C lcd(0x27, 16, 2);
SoftwareSerial mySoftwareSerial(6,7); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

byte Ethernet::buffer[700];
 
char const page[] PROGMEM =
"HTTP/1.0 503 Service Unavailable\r\n"
"Content-Type: text/html\r\n"
"Retry-After: 600\r\n"
"\r\n"
"<html>"
"<head><title>"
"Service Temporarily Unavailable"
"</title></head>"
"<body>"
"<h3>Antwortseite</h3>"
"<p><em>"
"Komando fuer Sound1.<br />"
"The syntax:  ?Sound1"
"</em></p>"
"</body>"
"</html>"
;
 
void setup () {
pinMode(ledPin10, OUTPUT);
pinMode(ledPin11, OUTPUT);
 
mySoftwareSerial.begin(9600);
myDFPlayer.volume(30);  //Lautstärke auf Maximum (30)

lcd.begin();
lcd.backlight();
 

 
if (ether.begin(sizeof Ethernet::buffer,mymac) == 0)
{
lcd.print(F("keine Verbindung"));
}
else
{
lcd.print(F("Verbindung: OK"));
}
;
 
#if STATIC
if (!ether.staticSetup(myip, gwip)){
blinkLed(); // blink forever to indicate a problem
}
#else
 
if (!ether.dhcpSetup()){
blinkLed(); // blink forever to indicate a problem
}
#endif
 


lcd.setCursor(0,1);
lcd.print("IP: ");
for (byte x = 0; x < 4; ++x) {
lcd.print(myip[x]);
if (x < 3)
lcd.print(".");
}
}
 
void loop () {
 
word len = ether.packetReceive();
word pos = ether.packetLoop(len);
 
if(strstr((char *)Ethernet::buffer + pos, "GET /?Sound1") != 0) {
lcd.backlight();
lcd.setCursor(0,0);
lcd.print(F("Sound1 abspielen"));
lcd.setCursor(0,1);
lcd.print("                ");
digitalWrite(ledPin10, HIGH);
myDFPlayer.play(1);
//delay(1000);
digitalWrite(ledPin10, LOW);
lcd.setCursor(0,0);
lcd.print("                ");
lcd.noBacklight();
}
if(strstr((char *)Ethernet::buffer + pos, "GET /?Sound2") != 0) {
lcd.backlight();
lcd.setCursor(0,0);
lcd.print(F("Sound2 abspielen"));
lcd.setCursor(0,1);
lcd.print("                ");
digitalWrite(ledPin11, HIGH);
delay(1000);
digitalWrite(ledPin11, LOW);
lcd.setCursor(0,0);
lcd.print("                ");
lcd.noBacklight();
}


// show some data to the user
memcpy_P(ether.tcpOffset(), page, sizeof page);
ether.httpServerReply(sizeof page - 1);
}
 
void blinkLed(){
while (true){
digitalWrite(ledPin10, HIGH);
delay(500);
digitalWrite(ledPin10, LOW);
delay(500);
}
}

Welcher Arduino? Was sagt der RAM nach dem kompilieren?
Der ENC28J60 ist das ungünstigste Ethernet-Modul, das es gibt. Da muss der Prozessor das meiste selbst machen, was viel RAM kostet.
Evtl. auf einen ESP8266 oder ESP32 umsteigen?

Gruß Tommy

Und schon schlägt der TO zwei "Fliegen mit einer Klappe".
Mehr Speicher und WLan, kann er sich das Lankabel sparen :wink:

Das Boad ist ein Arduino Uno.
Ram sagt 66% Auslastung.
Ich würde gern auf einer fixen Lan-Verbindung bleiben um verbindungsprobleme zu reduzieren.

Ich arbeite schon seit einigen Jahren mit den ESP und habe keine (kaum merklich) Verbindungsprobleme im WLan.
OK, das kann bei dir anders sein.

Auch mit dem DFPlayer ?

Dann nimm lieber ein Modul/Shield mit W5100. Achtung bei Verwendung des Shields unbedingt die USB-Buchse vom UNO oben isolieren, da es sonst Kurzschlüsse geben kann.

Gruß Tommy

Der ENC ist wirklich keine Gute Wahl. Ein W5100/W5500 wäre definitiv besser.

Einen Schritt weiter gedacht, könntest du auch einen ESP mit Ethernet in Betracht ziehen.
Da fällt mir der WT32-ETH01 ein, den ich diese Tage ausprobiert habe:

http://werner.rothschopf.net/microcontroller/202401_esp32_wt32_eth01_en.htm

was passiert wenn du du mal das LCD (und die ganze Wire.h Library) weg lässt? Funktionierts dann noch?

Nur mal so aus Spaß.

SoftwareSerial mySoftwareSerial(0,1); // RX, TX

Und schau mal was dann passiert. :wink:

Gruß

Pucki

Warum sollte jemand die Pins für SoftwareSerial auf die Pins von HardwareSerial legen wollen? Wieder ein typischer Pucki.

Gruß Tommy

Das funktioniert nur mit einen Umweg.

Der DF-Player nimmt nur 4 stellige Zahlen an. Also "0001.mp3".

Ich habe das Problem mit einer 2. SD-Karte umgangen.
Ich lese auf der 2. Karte "lp-0001.txt" Dann Lied-Nr ("0001.mp3"), Album, Titel , Interpret u.s.w.
Dann zeige ich das auf den Display an und rufe den Player auf mit der Lied-Nr.

Ach ja. Gestartet wird das ganze mit einen RFID Chip mit der jeweiligen LP-Nr.

Bei dir wäre (wenn es sich nur um EIN Lied handelt) auch möglich die URL auszuwerten.

Aktuell versuche ich aber von den DF-Player-Mini weg zu kommen.
Bei einen ESP gibt es meist das i2s Protokoll. Das macht mir das Leben viel einfacher.

Gruß

Pucki

Hast ja Recht. Ist ja ein UNO.

SoftwareSerial mySoftwareSerial(3,4); // RX, TX

Weil mein DF-Mini genau mit DER Code-Zeile läuft. ?!?!

Gruß

Pucki

Wenn es (zufällig) auch läuft, muss es nicht eine sinnvolle Lösung sein.

Gruß Tommy

Danke schon mal für die Antworten.
Hab das ganze jetzt mal mit dem Ethernet-Shield aufgebaut. Leider das gleiche Problem. Sobald ich das SoftwarSerial aktiviere hab ich über den URl keinen Zugriff mehr auch die Steuerung.

  • Schaltplan posten
  • Echtbilder posten, die jede Verbindung, jedes Modul zeigen
  • Neuen Code in Code Tags posten.

Das wird nix.
Du bist mindestens 1 Sekunde lang taub und blind.

Hier noch eine Sekunde

Das muss erstmal weg und nicht blockierend programmiert werden.
DATEI - BEISPIELE - 02 DIGITAL - BlinkwithoutDelay

Hallo da bin ich wieder mit dem Code.
Sobald ich die Zeile myDFPlayer.volume(10);
myDFPlayer.play(1); zum Code hinzufüge kann ich nicht mehr zugreifen.

#include <SPI.h>
#include <Ethernet.h>

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

// Gib die 6 (hexadezimalen) Zahlen der Mac-Adresse Deines Ethernet-Shields ein:
byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0x4E, 0xBD };

// Gib die gewünschte IP-Adresse ein, die Dein Webserver haben soll:
IPAddress ip(10,0,0,56);

// Initialisiere Deinen Server und weise ihm einen Port zu:
// (Port 80 ist ueblich fuer HTTP):
EthernetServer server(80);

SoftwareSerial mySoftwareSerial(7, 6); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

int led = 8;

void setup() {
  // Serielle Kommunikation (fuer den Seriellen Monitor)
  Serial.begin(9600);
  mySoftwareSerial.begin(9600);
  while (!Serial) {
    ; // warte
  }
  // starte Ethernet Verbindung pinMode für die LED und den Server:
  Ethernet.begin(mac, ip);
  pinMode(led, OUTPUT);
  server.begin();
  Serial.print("Server an IP: ");
  Serial.println(Ethernet.localIP());
}

//buffer ist ein String, welcher die Clientdaten zwischenspeichert
String buffer = "";

void loop() {
  // listen
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        //WICHTIG: client enthält Daten um die LED's zu steuern.
        char c = client.read(); 
        //WICHTIG: buffer String erweitern mit jedem loop Durchgang.                          
        buffer+=c;                                                                       
        if (c == '\n' && currentLineIsBlank) {          
          // http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connnection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("<body>");
          // meta refresh tag hinzufügen, welcher alle 5 Sekunden den Browser refresht. 
          client.println("<meta http-equiv=\"refresh\" content=\"5\">");
          //entweder LED an (ON und grüne Schrift) oder aus (OFF und rote Schrift).
          if (digitalRead(led)) {
            client.print("LED is <font color = 'green'> ON </font>");
          } else {
            client.print("LED is <font color = 'red'> OFF </font>");
          }
          client.println("<br/>");
          //Senden an server 
          client.print("<FORM action =\"http://10.0.0.56/\">");
          client.print("<P> <INPUT type =\"radio\" name =\"status\" value =\"1\">ON");
          client.print("<P> <INPUT type =\"radio\" name =\"status\" value =\"0\">OFF");
          client.print("<P> <INPUT type =\"submit\" value =\"Submit\"> </FORM>");
          client.println("</body>");
          client.println("</html>");
          break;                         
        }

          if (c == '\n') {
          buffer = "";
          currentLineIsBlank = true;          
          }
          else if (c == '\r') {          

          /* 
           *  WICHTIG: durchsucht den buffer String nach der Char-
           *  folge "GET /?status=1" und falls vorhanden
           *   wird Code ausgeführt.
           */
          if(buffer.indexOf("GET /?status=1")>=0){
              Serial.println("it works with status=1");
              //myDFPlayer.volume(10);  //Lautstärke auf Maximum (30)
             // myDFPlayer.play(1); ;         
              digitalWrite(led,HIGH); 
                         
              }
           /* 
            *  WICHTIG: durchsucht den buffer String nach der 
            *  Charfolge "GET /?status=0" und falls vorhanden
            *  wird Code ausgeführt.
            */
          if(buffer.indexOf("GET /?status=0")>=0){
              Serial.println("it works with status=0");
              digitalWrite(led,LOW);
              }          
          buffer = "";
        }                                                                        
      }
    }
    // Gibt dem Webbrowser Zeit, die Daten zu erhalten.
    delay(1);
    // Schließe Connection:
    client.stop();
    Serial.println("client disonnected");
  }
}

Die Zeile teil mal auf.
EthernetClient client;gehört oben unter die Zeile EthernetServer server(80);
dann sieht die Zeile so aus:

Über den Rest schau ich später ggfls. nochmal.

also eigentlich geht mir eher so etwas ab:

  if (!myDFPlayer.begin(FPSerial, /*isACK = */true, /*doReset = */true)) {  //Use serial to communicate with mp3.
    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){
      delay(0); // Code to compatible with ESP8266 watch dog.
    }
  }
  Serial.println(F("DFPlayer Mini online."));

woher weis sonst in deinem Sketch die Instanz myDFPlayer welche SoftSerial Instanz verwendet werden soll (die bei dir halt anders heißt...)

edit:

// https://forum.arduino.cc/t/i-c-display-mit-enc28j60-und-dfplayer-mini/1210844/15
// myDFPlayer.begin ergänzt

#include <SPI.h>
#include <Ethernet.h>

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

// Gib die 6 (hexadezimalen) Zahlen der Mac-Adresse Deines Ethernet-Shields ein:
byte mac[] = {0x90, 0xA2, 0xDA, 0x0D, 0x4E, 0xBD };

// Gib die gewünschte IP-Adresse ein, die Dein Webserver haben soll:
IPAddress ip(10, 0, 0, 56);
//IPAddress ip(172, 18, 67, 96);

// Initialisiere Deinen Server und weise ihm einen Port zu:
// (Port 80 ist ueblich fuer HTTP):
EthernetServer server(80);

SoftwareSerial mySoftwareSerial(7, 6); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

int led = 8;

void setup() {
  // Serielle Kommunikation (fuer den Seriellen Monitor)
  Serial.begin(9600);
  mySoftwareSerial.begin(9600);
  while (!Serial) {
    ; // warte
  }
  // starte Ethernet Verbindung pinMode für die LED und den Server:
  Ethernet.begin(mac, ip);
  pinMode(led, OUTPUT);
  server.begin();
  Serial.print("Server an IP: ");
  Serial.println(Ethernet.localIP());

  if (!myDFPlayer.begin(mySoftwareSerial, /*isACK = */true, /*doReset = */true)) {  //Use serial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
  }
  else
    Serial.println(F("DFPlayer Mini ready"));
}

//buffer ist ein String, welcher die Clientdaten zwischenspeichert
String buffer = "";

void loop() {
  // listen
  EthernetClient client = server.available();
  if (client) {
    Serial.println("new client");
    boolean currentLineIsBlank = true;
    while (client.connected()) {
      if (client.available()) {
        //WICHTIG: client enthält Daten um die LED's zu steuern.
        char c = client.read();
        //WICHTIG: buffer String erweitern mit jedem loop Durchgang.
        buffer += c;
        if (c == '\n' && currentLineIsBlank) {
          // http response header
          client.println("HTTP/1.1 200 OK");
          client.println("Content-Type: text/html");
          client.println("Connnection: close");
          client.println();
          client.println("<!DOCTYPE HTML>");
          client.println("<html>");
          client.println("<body>");
          // meta refresh tag hinzufügen, welcher alle 5 Sekunden den Browser refresht.
          client.print("<meta http-equiv=\"refresh\" content=\"5; url=http://");
          client.print(Ethernet.localIP());
          client.println("\">"); //
          //entweder LED an (ON und grüne Schrift) oder aus (OFF und rote Schrift).
          if (digitalRead(led)) {
            client.print("LED is <font color = 'green'> ON </font>");
          } else {
            client.print("LED is <font color = 'red'> OFF </font>");
          }
          client.println("<br/>");
          //Senden an server
          //client.print("<FORM action =\"http://10.0.0.56/\">");  // IP nicht wiederholen sondern einfach an home schicken!
          client.print("<FORM action =\"/\">");
          client.print("<P> <INPUT type =\"radio\" name =\"status\" value =\"1\">ON");
          client.print("<P> <INPUT type =\"radio\" name =\"status\" value =\"0\">OFF");
          client.print("<P> <INPUT type =\"submit\" value =\"Submit\"> </FORM>");
          client.println("</body>");
          client.println("</html>");
          break;
        }

        if (c == '\n') {
          buffer = "";
          currentLineIsBlank = true;
        }
        else if (c == '\r') {

          /*
              WICHTIG: durchsucht den buffer String nach der Char-
              folge "GET /?status=1" und falls vorhanden
               wird Code ausgeführt.
          */
          if (buffer.indexOf("GET /?status=1") >= 0) {
            Serial.println("it works with status=1");
            // das Zweifelhafte
            Serial.println(F("D106"));
            myDFPlayer.volume(10);  //Lautstärke stellen. Maximum (30)
            Serial.println(F("D108"));
            myDFPlayer.play(1); ;
            Serial.println(F("D110"));
            digitalWrite(led, HIGH);
          }
          /*
              WICHTIG: durchsucht den buffer String nach der
              Charfolge "GET /?status=0" und falls vorhanden
              wird Code ausgeführt.
          */
          if (buffer.indexOf("GET /?status=0") >= 0) {
            Serial.println("it works with status=0");
            digitalWrite(led, LOW);
          }
          buffer = "";
        }
      }
    }
    // Gibt dem Webbrowser Zeit, die Daten zu erhalten.
    delay(1);
    // Schließe Connection:
    client.stop();
    Serial.println("client disonnected");
  }
}
//

etwas am Refresh und form Ziel gearbeitet,
Es verstirbt der ZWEITE Call mit Status=1 - ich habe aber keinen DFPlayer ... weis nicht was das ding sonst macht...

15:36:41.252 -> client disonnected
15:36:45.359 -> new client
15:36:45.359 -> it works with status=1
15:36:45.359 -> D106
15:36:45.359 -> D108
15:36:45.859 -> D110
15:36:45.913 -> client disonnected
15:36:46.007 -> new client
15:36:46.047 -> client disonnected
15:36:49.499 -> new client
15:36:49.499 -> it works with status=0
15:36:49.499 -> client disonnected
15:36:49.592 -> new client
15:36:49.645 -> client disonnected
15:36:54.680 -> new client
15:36:54.680 -> client disonnected
15:36:54.830 -> new client
15:36:54.830 -> client disonnected
15:36:57.831 -> new client
15:36:57.831 -> it works with status=1
15:36:57.831 -> D106

Danke für die Antworten. Jetzt bin ich wieder dazugekommen an dem Projekt weiter zu arbeiten. Funktioniert dank eurerer Hilfe nun, DANKE!

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.