Lautstärke langsamer ansteigen lassen

Hallo zusammen,

Ich hätte eine Frage bezüglich der Lautstärke.
Ist es möglich irgendwo im Code die Geschwindigkeit zu ändern mit der bei einem langen Tastendruck
die Lautstärke lauter bzw. leiser wird.
Mein Kleiner und auch die Eltern auch haben da ein bisschen unsere Probleme.
Wenn es langsamer gehen würde wäre es viel einfacher zum einstellen.

Gruß Hansjörg

in der DEV Version kannst du die Funktion von Lauter/Leiser und Vor/Zurück tauschen.
Ansonsten stimmt… da könnte man ein kleines Delay einbauen. Mal gucken.

HI,
ich hatte dieselben Probleme bei meinen Benutzern. Man bekommt nicht sofort mit, wenn nach dem langen Druck die Lautstärke lauter wird, und wenn man es dann merkt, dann war es zu spät. Da das ein wenig “Userabhängig” war hab ich ein wenig rumgefummelt an den delays und die deshalb in Konstanten rausgezogen. Auch hab ich die Begrenzung eingebaut der Lautstärke. Da das den Originalcode ein wenig verändert hat, hier die Lösungsidee für alle, die ein wenig Programmieren können. @Thorsten Das kann gerne in den Master. Bei Rückfragen gerne direkt melden.
Dann hab ich noch eingebaut, dass man im Hörbuch Modus dann wieder an das erste Stück springt, wenn das Hörbuch auf “Pause” steht und man die “down” Taste lange drückt. Hier die Definitionen, an denen man dann “rumspielen” kann.

#define LONG_PRESS 450 
#define LONG_RESETPRESS 5000
#define VOLUME_DELAY 150
#define MAX_VOLUME  26
#define MIN_VOLUME 8
#define START_VOLUME 13
bool SystemPaused = false;
bool ignoreUpButton = false;
bool ignoreDownButton = false;

Hier der Code. Einfach nach den “Button” Funktionen suchen. Im Endeffekt ist die reine Anforderung “langsamer lauter werden” einfach zu erfüllen: Die Funktion “delay(100)” wartet einfach 100ms, was man nur an der richtigen Stellen reinpappen müsste. (Für alle, die den Originalcode nicht zu sehr ändern wollen).

if (pauseButton.wasReleased()) {
  if (ignorePauseButton == false)
    if (isPlaying()) {
      mp3.pause();
      SystemPaused = true;
    }
    else {
      mp3.start();
      SystemPaused = false;    
    }
  ignorePauseButton = false;
} else if (pauseButton.pressedFor(LONG_RESETPRESS) &&
           ignorePauseButton == false) {
  if (isPlaying())
    mp3.playAdvertisement(currentTrack);
  else {
    knownCard = false;
    mp3.playMp3FolderTrack(800);
    Serial.println(F("Karte resetten..."));
    resetCard();
    mfrc522.PICC_HaltA();
    mfrc522.PCD_StopCrypto1();
  }
  ignorePauseButton = true;
}

if (upButton.pressedFor(LONG_PRESS)) {
  if (mp3.getVolume() < MAX_VOLUME) {
    Serial.println(F("Volume Up"));
    mp3.increaseVolume();
    delay(VOLUME_DELAY);
    ignoreUpButton = true;
  }
} else if (upButton.wasReleased()) {
  if (!ignoreUpButton) {
//        nextTrack(random(65536));
//        currentTrack += 1;
    nextTrack(currentTrack);
    ignorePauseButton = true;
  }
  else
    ignoreUpButton = false;
}



if (downButton.pressedFor(LONG_PRESS) && (SystemPaused)) { 
   currentTrack = 0;
   _lastTrackFinished = 0;
   nextTrack(currentTrack);
   Serial.println(F("reset Current Track to 1"));
   ignoreDownButton = true;
   } else if (downButton.pressedFor(LONG_PRESS) && (!SystemPaused)) {
        
        if (mp3.getVolume() > MIN_VOLUME) {
          Serial.println(F("Volume Down"));
          mp3.decreaseVolume();
          delay(VOLUME_DELAY);
          ignoreDownButton = true;
        }
    }
    
if (downButton.wasReleased()) {
  if (!ignoreDownButton)
    previousTrack();
  else {
    ignoreDownButton = false;   
    SystemPaused = false;
  }
}

Viel Erfolg mit dem Code. Ich hoffe es hilft.

Also am besten du tauscht die Funktion der Knöpfe. Kurz drücken Lautstärke, lang drücken Lied wechseln. Und beim lange drücken nur beim ersten mal den Titelwechsel ausführen und weiteres Drücken ignorieren. So ist es am elegantesten. Falls du Probleme hast, das selber zu kodieren, sag Bescheid. Ich tippe dir schnell die Lösung.

Genau. Diese ganze Delay Sache ist sonst später irgendwann eventuell suboptimal.

Ich überlege gerade den Standard umzudrehen (weiterhin über das Adminmenü änderbar).

1 „Gefällt mir“

Ja, zuerst die Lautstärke fände ich gut

1 „Gefällt mir“

Hallo zusammen,

Endlich zurück aus dem Weihnachtsstress werde ich die Tipps ausprobieren.
Vielen dank schon mal und ich werde berichten was bei meinem Sohn funktioniert hat.

Gruß Hansjörg

Mit der Delay Funktion hat es wunderbar geklappt.
Danke für die Hilfe

Würde ich befürworten. Hast du schon eine Idee wann du das umsetzen kannst?

Kannst du mir behilflich sein, ich versuche es umzudrehen.
Habe bisher folgendes.

if (upButton.wasReleased()) {
  Serial.println(F("Volume Up"));
  mp3.increaseVolume();
  ignoreUpButton = true;
} else if (upButton.pressedFor(LONG_PRESS)) {
  if (!ignoreUpButton)
    nextTrack(random(65536));
  else
    ignoreUpButton = false;
}

if (downButton.wasReleased()) {
  Serial.println(F("Volume Down"));
  mp3.decreaseVolume();
  ignoreDownButton = true;
} else if (downButton.pressedFor(LONG_PRESS)) {
  if (!ignoreDownButton)
    previousTrack();
  else
    ignoreDownButton = false;
}

Nach dem Lonpress kommt nun allerdings noch ein Volume Up bzw. Down.

Hey @blane,

das mit dem Volume Up und Down nach LongPress ist klar, da er das ja macht, wenn der Knopf losgelassen wird. Was du brauchst ist folgendes:

Definiere irgendwo am Anfang zusätzlich folgende beiden Variablen:

bool upButtonLongPressed = false;     
bool downButtonLongPressed = false;

Und dann änderst du die Knöpfe folgendermaßen:

if (upButton.pressedFor(LONG_PRESS)) {  
  if (!upButtonLongPressed)  {
    nextTrack(random(65536));    
  }      
  upButtonLongPressed = true;
  ignoreUpButton = true;
} else if (upButton.wasReleased()) {
  upButtonLongPressed = false;
  if (!ignoreUpButton)  {
    Serial.println(F("Volume Up"));
	mp3.increaseVolume();                 
  } else  {
    ignoreUpButton = false;
  }
}
		
if (downButton.pressedFor(LONG_PRESS)) {  
  if (!downButtonLongPressed)  {
    previousTrack();  
  }      
  downButtonLongPressed = true;
  ignoreDownButton = true;
} else if (downButton.wasReleased()) {
  downButtonLongPressed = false;
  if (!ignoreDownButton)  {
    Serial.println(F("Volume Down"));
	mp3.decreaseVolume();              
  } else  {
    ignoreDownButton = false;
  }
}

Der Code macht folgendes:

Wenn LongPress gedrückt wird, wird jeweils nur 1 Lied vor oder zurück geschaltet. Sonst spult er ja ewig vor und zurück. Wenn du danach loslässt, passiert nix. Wird nur kurz gedrückt, dann wird die Lautstärke hoch oder runter gedreht.

Probiere es mal aus. Viel Erfolg!

2 „Gefällt mir“

Sehr gut, dass klappt. Danke dir.

Hallo fft2911,

Volumebegrenzung nach oben und unten habe ich so umgesetzt, ebenso die Lösung für das Delay. Das Delay (150 wie von dir vorgeschlagen) vereinfacht die Handhabung deutlich und die Volumebegrenzung verhindert die Beschallung des gesamten Hauses.

Danke für den Code.

Ist geplant die alternative Lautstärke-/Tastenbelegung in der DEV Version zu integrieren?

Was meinst du genau? In der aktuellen DEV ist es schon lange per default so, daß long press nächster/vorheriger Titel und short press lauter/leiser ist. Zudem kann man das im Adminmenü wieder umdrehen.

Danke für die Info! Habe aktuell die Standard-/Einsteigerversion verbaut und nur diesen Threat gelesen gehabt bzgl. der Lautstärke.

Was im Code müsste ich ändern, damit es beim kurzen drücken direkt 2-3 Lautstärkestufen lauter oder leiser wird?
Ich habe einen kleinen Lautsprecher verbaut, da muss man sonst zu oft drücken bis man ein Ergebnis hat.
Ich würde nur ungern umstellen auf langen druck um die Lautstärke zu ändern

Ich hab es zwar nicht getestet, aber wenn du die Funktionen volumeUpButton() und volumeDownButtion() editierst, indem du mp3.increaseVolume(); 2-3 mal hintereinander aufrufst, müsste es klappen. Also z.b. so:

void volumeUpButton() {
if (activeModifier != NULL)
if (activeModifier->handleVolumeUp() == true)
return;

Serial.println(F("=== volumeUp()"));
if (volume < mySettings.maxVolume) {
mp3.increaseVolume();
volume++;
mp3.increaseVolume();
volume++;
}
Serial.println(volume);
}

void volumeDownButton() {
if (activeModifier != NULL)
if (activeModifier->handleVolumeDown() == true)
return;

Serial.println(F("=== volumeDown()"));
if (volume > mySettings.minVolume) {
mp3.decreaseVolume();
volume–;
mp3.decreaseVolume();
volume–;
}
Serial.println(volume);
}

So kommst du aber ggf. unter mySettings.minVolume bzw. über mySettings.maxVolume (wenn auch nur einen tick, bei 2 steps, sonst eben mehr). Daher würde ich das eher so machen (ungetestet, ggf. muss hier mit ner temp Variable gearbeitet werden, aber das Prinzip sollte klar sein):

volume = min(volume += 2, mySettings.maxVolume);
mp3.setVolume(volume);

bzw.

volume = max(volume -= 2, mySettings.minVolume);
mp3.setVolume(volume);

Es gibt noch einen Modifier (Feedback) der ebenfalls angepasst werden müsste, damit die Ansage stimmt. Bin aber grad nicht 100% sicher ob der überhaupt konfigurierbar ist. Im code ist er jedenfalls drin.