DFRobot Player: Lautstärke während Wiedergabe ändern

Hallo zusammen,
ich habe folgendes Problem. Ich bau aktuell ein Radio für meinen Sohn. Verwendet wird ein Arduino Nano in Verbindung mit einem DFRobotPlayer Mini. Der Player soll auf Tastendruck einen bestimmten Titel abspielen. Das funktioniert soweit tadellos. Allerdings würde ich gerne während der Wiedergabe mittels Poti die Lautstärke einstellen können. Hat da vielleicht jemand eine Idee wie das umzusetzen wäre? So wie in meinem Sketch funktioniert das leider nicht. Habe
es auch schon mit der millis()-Funktion probiert, aber irgendwo hab ich da noch einen Knoten im Kopf.





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

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);


int Button1 = 3;
int Button2 = 4;
int Button3 = 5;
int Button4 = 6;
int Button5 = 14;
int Button6 = 7;
int Button7 = 8;
int Button8 = 9;
int Button9 = 12;
int Button10 = 17;

int LED1 = 15;
int LED2 = 16;

int volumeControl = A7;

int volume;

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);

pinMode(Button1, INPUT_PULLUP);
pinMode(Button2, INPUT_PULLUP);
pinMode(Button3, INPUT_PULLUP);
pinMode(Button4, INPUT_PULLUP);
pinMode(Button5, INPUT_PULLUP);
pinMode(Button6, INPUT_PULLUP);
pinMode(Button7, INPUT_PULLUP);
pinMode(Button8, INPUT_PULLUP);
pinMode(Button9, INPUT_PULLUP);
pinMode(Button10, INPUT_PULLUP);

pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
  
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
  
  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial 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!"));

  }
  Serial.println(F("DFPlayer Mini online."));
  
  myDFPlayer.volume(10);
  //Set volume value. From 0 to 30
  
}

void loop()
{


 volume = map(analogRead(volumeControl),0,1023,0,30);
 myDFPlayer.volume(volume);

if (digitalRead(Button1) == LOW){
myDFPlayer.play(1);  
}

if (digitalRead(Button2) == LOW){
myDFPlayer.play(2);  
}

if (digitalRead(Button3) == LOW){
myDFPlayer.play(3);  
}

if (digitalRead(Button4) == LOW){
myDFPlayer.play(4);  
}

if (digitalRead(Button5) == LOW){
myDFPlayer.play(5);  
}

if (digitalRead(Button6) == LOW){
myDFPlayer.play(6);  
}

if (digitalRead(Button7) == LOW){
myDFPlayer.play(7);  
}

if (digitalRead(Button8) == LOW){
myDFPlayer.play(8);  
}

if (digitalRead(Button9) == LOW){
myDFPlayer.play(9);  
}

if (digitalRead(Button10) == LOW){
myDFPlayer.play(10);  
}


Serial_Monitor();


}

Was funktioniert nicht?

Was für einen Controller benutzt Du?

Ich verwende einen Arduino Nano.

Ich denke hier liegt das Problem. Sobald ich versuche im Loop die Lautstärke über den Poti zu ändern stottert es nur noch.

Versuch mal den:
// EDIT: Siehe #5 - nachgeholt

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

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int value);

constexpr byte btn[] {3, 4, 5, 6, 14, 7, 8, 9, 12, 17};

constexpr byte LED1 {15};
constexpr byte LED2 {16};

constexpr byte volumeControl {A7};

uint16_t volume;
uint16_t lastVolume;

void setup()
{
  Serial.begin(115200);
  Serial.println(F("Start..."));
  mySoftwareSerial.begin(9600);
  for (byte b = 0; b < sizeof(btn); b++)
  { pinMode(btn[b], INPUT_PULLUP); }
  pinMode(LED1, OUTPUT);
  pinMode(LED2, OUTPUT);
  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));
  if (!myDFPlayer.begin(mySoftwareSerial))    //Use softwareSerial 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!"));
  }
  Serial.println(F("DFPlayer Mini online."));
  myDFPlayer.volume(10);
  //Set volume value. From 0 to 30
}

void loop()
{
  volume = analogRead(volumeControl);
  if (volume != lastVolume)
  {
    lastVolume = volume; // erst merken! volume wird ab jetzt verändert
    volume = map(volume), 0, 1023, 0, 30);
    myDFPlayer.volume(volume);
  }
  for (byte b = 0; b < sizeof(btn); b++)
  {
    if (!digitalRead(btn[b]))
    { myDFPlayer.play(b + 1); }
  }
}

Wenn Du auf if (volume != lastVolume) abfragst, wäre es dann nicht sinnvoll, in der IF-Anweisung auch lastVolume = volume zu setzen ?

Ja.

Perfekt, vielen Dank - klappt prima!

Mach nen Haken dran.
erledigt.

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