Hlasový modul s DFPlayerem a Arduinem Uno

Nedaří se vám s projektem a nenašli jste vhodné místo, kde se zeptat? Napište sem.
Pravidla fóra
Tohle subfórum je určeno pro konzultaci ucelených nápadů, popřípadě řešení komplexnějších projektů, které opravdu není možné rozdělit na menší části.
Většinu problémů jde rozdělit na menší a ptát se na ně v konkrétních subfórech.
Odpovědět
Krecek
Příspěvky: 3
Registrován: 24 čer 2023, 13:19
Reputation: 0

Hlasový modul s DFPlayerem a Arduinem Uno

Příspěvek od Krecek » 24 čer 2023, 13:53

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.

Uživatelský avatar
kiRRow
Příspěvky: 1170
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Hlasový modul s DFPlayerem a Arduinem Uno

Příspěvek od kiRRow » 25 čer 2023, 11:11

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.

Krecek
Příspěvky: 3
Registrován: 24 čer 2023, 13:19
Reputation: 0

Re: Hlasový modul s DFPlayerem a Arduinem Uno

Příspěvek od Krecek » 25 čer 2023, 11:53

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
Přílohy
hlasomodul.txt
(3.86 KiB) Staženo 40 x
Naposledy upravil(a) gilhad dne 25 čer 2023, 19:21, celkem upraveno 1 x.
Důvod: code

Krecek
Příspěvky: 3
Registrován: 24 čer 2023, 13:19
Reputation: 0

Re: Hlasový modul s DFPlayerem a Arduinem Uno

Příspěvek od Krecek » 25 čer 2023, 12:18

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
Naposledy upravil(a) gilhad dne 25 čer 2023, 19:22, celkem upraveno 1 x.
Důvod: code

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 58 hostů