Stránka 1 z 1

Hlasový modul s DFPlayerem a Arduinem Uno

Napsal: 24 čer 2023, 13:53
od Krecek
Našel jsem si návod, jak si vyrobit z DFPlayeru a Arduina Uno hlasový modul, který při stisku jednoho z tlačítek spustí danou zvukovou stopu z SD karty.

Stránka: https://starthardware-org.translate.goo ... r_pto=wapp


V programování všeobecně jsem naprostý začátečník. Něco jsem si k tomu i nastudoval, ale stejně jsem si s tím moc neporadil.


Hlasový modul z oné stránky má nedostatky, které bych potřeboval odstranit/upravit.

První je, že při spojení jednoho ze vstupů vůči mínusu se daná stopa neustále přehrává od začátku(nenechá ji dohrát, je slyšet dokola se opakující první písmeno stopy). Pokud na vstup přivedu impulz z mínusu, tak se stopa přehraje celá bez problému.

Potřeboval bych upravit kod, aby při trvalém spojení daného vstupu a mínusu se daná stopa přehrávala CELÁ dokola, dokud vstup nerozpojím.

Také bych potřeboval dva vstupy pro nastavení hlasitosti. Zkoušel jsem upravit kod, ale při odpojení napájení musím hlasitost znova nastavovat těmi tlačítky. Potřebuji, aby si Arduino pamatovalo tlačítky nastavenou hlasitost i po odpojení napájení.


Sériový monitor ukazuje zpětnou vazbu při stisku a dohrání stopy.( musel jsem snížit přenosovou rychlost)

Děkuji předem za rady.

Re: Hlasový modul s DFPlayerem a Arduinem Uno

Napsal: 25 čer 2023, 11:11
od kiRRow
V dobách umělé inteligence, by člověk i tak nějak očekával, že největší světový vyhledávač a překladač nebude překládat programové příkazy do češtiny :-D ... pošli to co se snažíš provozovat ty.

Re: Hlasový modul s DFPlayerem a Arduinem Uno

Napsal: 25 čer 2023, 11:53
od Krecek
To jsem si nevšiml. Tady je kod s poznámkami. V příloze je ten samý.

Kód: Vybrat vše

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

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

int buttonPins[16] = {19,18,17,16,15,14,2,3,4,5,6,7,8,9,12,13};   // Pins, an denen die Taster angeschlossen sind

void setup() {
  mySoftwareSerial.begin(9600);           // Start der SoftwareSerial Kommunikation
  Serial.begin(9600);                   // Start der "normalen" seriellen Kommunikation für den Serial Monitor

  if (!myDFPlayer.begin(mySoftwareSerial)) {  // Verbindung der Software Serial Kommunikation mit dem DFPlayer
    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){                          // Programmabbruch -> while(true) ist Endlosschleife
      delay(0);                           // Code für den Watchdog des ESP8266, nicht relevant für Arduino UNO
    }
  }
  

    
  myDFPlayer.volume(20);                      // Lautstärke auf 10 ( Werte von 0 – 30 ist möglich)  Nastavení hlasitosti trvale. Rád bych ji ale reguloval //dvěmi tlačítky, tak aby si nastavenou hodnotu tlačítky trvale pamatoval.
  for (int i=0; i<16; i++){                   // wiederhole 16 Mal (für jeden Taster)
    pinMode(buttonPins[i], INPUT_PULLUP);     // Taster werden mit internen Pullup-Widerständen verwendet  
  }
  
}

void loop() {
  for (int i=0; i<16; i++){                   // wiederhole 16 Mal (für jeden Taster)
    if (digitalRead(buttonPins[i]) == LOW){   // wenn ein Taster gedrückt wird
     Serial.println(i);
     myDFPlayer.playMp3Folder(i+1);                      // spiele das MP3 der Nummer des Tasters nach von der SD-Karte
     delay(200);
    }
  }



  delay(20);      // Pokyn k možnému znovu stisknutí tlačítka. Sem bych potřeboval zadat příkaz, aby byla zpětná vazba z DFPlayeru, když skončí stopa,            //tak teprve potom je možno ji pustit znova. 






  /* Alles ab hier dient dem Debugging und kommt aus den Beispiel-Dateien der Library */
  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); // Print the detail message from DFPlayer to handle different errors and states.
  }
}

void printDetail(uint8_t type, int value){
 
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerUSBInserted:
      Serial.println("USB Inserted!");
      break;
    case DFPlayerUSBRemoved:
      Serial.println("USB Removed!");
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(value);
      Serial.println(F(" Play Finished!"));
      break;
    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (value) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
}
EDIT: tag code dávej okolo celého kódu, ne jen před něj

Re: Hlasový modul s DFPlayerem a Arduinem Uno

Napsal: 25 čer 2023, 12:18
od Krecek
Tady posílám častečně upravený kod

Kód: Vybrat vše

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

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

int buttonPins[14] = {17,16,15,14,2,3,4,5,6,7,8,9,12,13}; // Pins, an denen die Taster angeschlossen sind

void setup() {
pinMode(19,INPUT_PULLUP); pinMode(18,INPUT_PULLUP);
mySoftwareSerial.begin(9600); // Start der SoftwareSerial Kommunikation
Serial.begin(9600); // Start der "normalen" seriellen Kommunikation für den Serial Monitor

if (!myDFPlayer.begin(mySoftwareSerial)) { // Verbindung der Software Serial Kommunikation mit dem DFPlayer
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){ // Programmabbruch -> while(true) ist Endlosschleife
delay(0); // Code für den Watchdog des ESP8266, nicht relevant für Arduino UNO
}
}



myDFPlayer.volume(20); // Lautstärke auf 10 ( Werte von 0 – 30 ist möglich) Nastavení hlasitosti trvale. Rád bych ji ale reguloval //dvěmi tlačítky, tak aby si nastavenou hodnotu tlačítky trvale pamatoval.
for (int i=0; i<16; i++){ // wiederhole 16 Mal (für jeden Taster)
pinMode(buttonPins, INPUT_PULLUP); // Taster werden mit internen Pullup-Widerständen verwendet
}

}

void loop() {
  if(digitalRead(19) == LOW) myDFPlayer.volumeUp();
  if(digitalRead(18) == LOW) myDFPlayer.volumeDown();             // Moje tlačítka k nastavení hlasitosti



for (int i=0; i<16; i++){ // wiederhole 16 Mal (für jeden Taster)
if (digitalRead(buttonPins) == LOW){ // wenn ein Taster gedrückt wird
Serial.println(i);
myDFPlayer.playMp3Folder(i+1); // spiele das MP3 der Nummer des Tasters nach von der SD-Karte
delay(200);
}
}



delay(20); // Pokyn k možnému znovu stisknutí tlačítka. Sem bych potřeboval zadat příkaz, aby byla zpětná vazba z DFPlayeru, když skončí stopa, //tak teprve potom je možno ji pustit znova.
           // 





/* Alles ab hier dient dem Debugging und kommt aus den Beispiel-Dateien der Library */
if (myDFPlayer.available()) {
printDetail(myDFPlayer.readType(), myDFPlayer.read()); // Print the detail message from DFPlayer to handle different errors and states.
}
}

void printDetail(uint8_t type, int value){

switch (type) {
case TimeOut:
Serial.println(F("Time Out!"));
break;
case WrongStack:
Serial.println(F("Stack Wrong!"));
break;
case DFPlayerCardInserted:
Serial.println(F("Card Inserted!"));
break;
case DFPlayerCardRemoved:
Serial.println(F("Card Removed!"));
break;
case DFPlayerCardOnline:
Serial.println(F("Card Online!"));
break;
case DFPlayerUSBInserted:
Serial.println("USB Inserted!");
break;
case DFPlayerUSBRemoved:
Serial.println("USB Removed!");
break;
case DFPlayerPlayFinished:
Serial.print(F("Number:"));
Serial.print(value);
Serial.println(F(" Play Finished!"));
break;
case DFPlayerError:
Serial.print(F("DFPlayerError:"));
switch (value) {
case Busy:
Serial.println(F("Card not found"));
break;
case Sleeping:
Serial.println(F("Sleeping"));
break;
case SerialWrongStack:
Serial.println(F("Get Wrong Stack"));
break;
case CheckSumNotMatch:
Serial.println(F("Check Sum Not Match"));
break;
case FileIndexOut:
Serial.println(F("File Index Out of Bound"));
break;
case FileMismatch:
Serial.println(F("Cannot Find File"));
break;
case Advertise:
Serial.println(F("In Advertise"));
break;
default:
break;
}
break;
default:
break;
}
}
EDIT: kód uzavírej do tagu code