Lautstärke per Poti

#1

Weil meine Holzbox schon ein Poti hatte … habe ich das auch jetzt in der DEV firmware eingepatcht. Poti 10kOhm : Schleifer(Mitte) geht an pin A3,eine Seite GND, andere Seite 3.3V.

defines:
#define volumePoti A3
uint8_t lastvolume = 99;

funktion definiert:

void CheckVolume() {
  volume = map( analogRead(volumePoti), 0, 1023, 3, 30);
  if( abs(volume-lastvolume) >1){
    mp3.setVolume( volume );
    lastvolume= volume;
    Serial.println(F(" = Volume"));
    Serial.println( volume );
  }
}

in setup() geändert:
pinMode(volumePoti, INPUT);

//volume = mySettings.initVolume;
//mp3.setVolume(volume);
CheckVolume();

in loop() geändert

readButtons();
//hinzugefügt: volume auslesen und aktualisieren falls nötig
CheckVolume();

in voiceMenu() geändert (wegen dem Adminmenü)

readButtons();
//hinzugefügt: volume auslesen und aktualisieren falls nötig
CheckVolume();
mp3.loop();

funktionen auskommentiert:
volumeUpButton()
volumeDownButton()

Weiterhin habe ich die Lautstärketasten im admin-Menü umdefiniert als Track+/- für den kurzen Druck.

Tobi.

0 Likes

#2

Hi Tobi. Danke für deinen Quellcode. Ich habe an meiner neuen Musikbox auch wieder einen Poti verbaut und die Lautstärkesteuerung wie folgt angepasst:

1.) Initial-Lautstärke von Poti-Stellung abhängig überschreiben (immer ausgehend von der Max-Volume):

  void loadInitialPotiVolume(){
  Serial.println(F("=== loadInitialVolumeFromPoti"));
  int potiValue = analogRead(A3); //read the input on analog pin 3
  Serial.print(F("Poti Value: "));
  Serial.println(potiValue);
  mySettings.initVolume = (potiValue/(1023/mySettings.maxVolume));
  Serial.print(F("New Initial Volume: "));
  Serial.println(mySettings.initVolume);
}

wird aufgerufen bei:

  // load Settings from EEPROM
  loadSettingsFromFlash();
  loadInitialPotiVolume();

2.) Funktion um Poti auszulesen:

void readPoti(){
int myPotiValue = analogRead(A3); //read the input on analog pin 3
int myPotiVolume = (myPotiValue/(1023/mySettings.maxVolume));
if (myPotiVolume != volume){
  mp3.setVolume(myPotiVolume);
  volume = myPotiVolume;
}
Serial.print("New Volume: ");
Serial.println(volume);
}

3.) Potentiometer auslesen wenn Musik gespielt wird

    if (isPlaying()){
     readPoti();
   }

4.) Wenn bei Pause wieder Play gedrückt wird Poti erneut auslesen (vielleicht hat jemand an der Lautstärke gedreht während der Pause)

if (pauseButton.wasReleased()) {
  if (ignorePauseButton == false)
    if (isPlaying()) {
      mp3.pause();
      setstandbyTimer();
    }
    else if (knownCard) {
      readPoti();
      mp3.start();          
      disablestandbyTimer();
    }
  ignorePauseButton = false;

}

Funktioniert soweit ganz gut und ich wollte die Lautstärke nur setzen, wenn sich die “volume”-Variable geändert hat und die Musik spielt, um den DFPlayer nicht dauerhaft zu belasten.

Viele Grüße.

0 Likes

#3
volume = map( analogRead(volumePoti), 0, 1023, mySettings.minVolume, mySettings.maxVolume);

map() konvertiert den analogen bereich 0…1023 in den bereich min-max ohne daß man selbst rechnen muß.

if( abs(volume-lastvolume) >1){

sorgt dafür, daß mp3.setVolume() nur an den DFplayer geschickt wird, wenn sich Volume mehr als 1 geändert hat.

ich habe die Abfrage von A3 nur in im setup() loop() und voiceMenu() damit kann ich immer die Lautstärke ändern, egal in welchem Modus die Box ist. Ich wollte nur an möglichst wenigen stellen Code ändern, damit ich meine Änderungen schnell in eine neue DEV version patchen kann.

0 Likes