Lautstärke per Poti

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.print(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.
PS: editiert um code zeilen richtig anzuzeigen

3 „Gefällt mir“

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.

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.

Moin,
also ich arbeite gerade daran, das Poti, was hier noch rumfliegt in die Software zu integrieren. Jetzt bin ich soweit, dass ich die Volume-Buttons auskommentiert hab. bei den Änderungen im loop() hast du die readButtons(); oberhalb von mp3.loop() oder hast du das über volumePoti.read(); gemacht?

außerdem meckert er ganz zu Beginn, dass volume nicht deklariert wurde… sorry, aber ich bin absoluter Anfänger in Sachen Programmierung würde mich aber über die Lautstärkeregelung über Poti für mein nächstes Projekt freuen.

Danke schonmal.

PS: wo bekommst du die 3.3V her? über die Platine von @thorsten sind die Möglichkeiten ja eher begrenzt…

Also die Deklaration als Globale Variable machst Du einfach am Anfang vom Code hinter den #include

uint8_t volume;

Für das Poti kannst du auch 5V verwenden, aber nicht mehr. analogRead setzt es dann in 0 … 1023 um.

Hoffe das hilft erstmal weiter.

hey Ingo,
ja erstmal schon… so kann ich das erstmal auf den Arduino laden und kucken, was passiert…

und es hat funktioniert… auch, wenn die Lautstärke in der geringsten Einstellung schon recht… laut ist… :smiley:

DANKE!!!

Serial.println(volume);
gibt dir in der Konsole den aktuellen Wert aus, einfach im Loop() oben einfügen.

Wenn du alles am laufen hast einfach die Zeile wieder löschen.
sollte nur von 0- max 30 gehen. Wobei max ja auch durch eine Variable begrenzt werden kann.

So, nachdem jetzt alles läuft, hab ich mal folgendes noch für den seriellen Monitor angepasst:
Serial.print(F("Volume = ));
Serial.println( volume);
dann steht das auf einer Zeile… ja, Kosmetik, aber hey…

Der Arduino analog Eingang erlaubt 0…5V, also eine Seite des Poti an GND, den Schleifer (Mittel pin) an A3 und die andere Seite an 5V.

Wenn “Serial.println( volume);” 0 anzeigt, sollte auch nichts mehr zu hören sein. Ansonsten ist etwas nicht richtig (GND oder Berechnung).

Kann jemand mal einen vollständigen Code dazu zur Verfügung stellen.
Dann schleichen sich beim ändern nicht so viele Fehler ein, Danke!

Hallo @Norbert, ich habe mich an dem Code von Theobert1000 (Vorstellung TheoBert 1000) orientiert. Ich habe es mit einem #define POTI in meinen Code rein, denn du musst es bei mehreren Stellen berücksichtigen:

  • beim Setup() soll die Lautstärke ausgelesen werden
  • Lautstärke soll nicht mehr über die Tasten regelbar sein
  • ggf. deaktivieren des Potis beim auflegen von Modifier Karten (toddler mode)

Ich habe es für meinen nächsten TonUINO schon in meinem Code drin, und auch getestet:

Die entsprechenden Stellen findest du am besten wenn du nach “POTI” bzw. potiVolume() suchst.

Erst mal Danke für den Code.
Nur noch mal für Dumme:
Der Poti wird an A7 und 5V angschlossen?
Kann man die maximale Lautstärke über einen Zahlenwert ändern?
Wenn ja wo im Code?

Sendet der RFID dauerhaft wenn Strom dran ist?

Genau, GND, A7 und 5V

Entweder im Admin Menü die maximale Lautstärke festlegen, oder in der Funktion potiVolume(), bei der Stelle PotiValue=map(…)

Moin, hat schon mal jmd n Drehimpulsgeber mit eingebaut, mit den Potis und grobmotorischen Kleinkindhänden gibt es Kompatibilitätsprobleme,…

:wink:

Ich muss auch nochmal ganz doof Fragen, wenn der poti mit seinen drei Anschlüssen an A7, GND und 5V angeschlossenen wird, Woher kommt dann das Audiosignal zu den Boxen? Oder is der poti nur separat zum lautstärke auslesen, quasi als tastenersatz und wir gar nicht zwischen DFplayer und Boxen geschaltet…?

Genau so ist es, richtig erkannt.

Such doch mal nach „Drehimpulsgeber“ oder „rotary encoder“ :wink:

Coolio, dann reicht ein stinknormaler 10 kOhm poti aus?

Das beantwortet glaub ich der erste Beitrag hier schon.