an erster Stelle möchte ich mich für das tolle Projekt bedanken, dass auch mich nun seit einiger Zeit begleitet und vor allem auch meine Kinder erfreut. Inzwischen habe ich es sogar geschafft eine eigene Platine (PCB) für die Version Classic und ESP32 mit Kopfhöreranschluss zu erstellen und zu bestellen. Vielleicht - wenn Interesse besteht und nichts dagegen spricht - könnte ich diese vielleicht sogar mal allgemein zur Verfügung stellen. Interesse darf angemeldet werden.
Jetzt habe ich aber eine Frage, und zwar genau genommen ein Problem beim Kompilieren. Bis Version V3.3.0_2025.07.09 kann ich in constants.hpp die Option #defineHPJACKDETECT aktivieren.
Ab der Version V3.3.0_2025.07.26 erhalte ich nunmehr leider folgende Fehlermeldung (bspw. in der Version V3.3.1_2025.11.11):
/home/xy/Arduino/TonUINO-TNG-3.3.1/src/mp3.cpp: In member function ‚void Mp3::hpjackdetect()‘:
/home/xy/Arduino/TonUINO-TNG-3.3.1/src/mp3.cpp:353:18: error: ‚ampEnablePin‘ was not declared in this scope
digitalWrite(ampEnablePin, getLevel(ampEnablePinType, noHeadphoneJackDetect));
^\~\~\~\~\~\~\~\~\~\~\~
/home/xy/Arduino/TonUINO-TNG-3.3.1/src/mp3.cpp:353:41: error: ‚ampEnablePinType‘ was not declared in this scope
digitalWrite(ampEnablePin, getLevel(ampEnablePinType, noHeadphoneJackDetect));
^\~\~\~\~\~\~\~\~\~\~\~\~\~\~\~
exit status 1
Compilation error: ‚ampEnablePin‘ was not declared in this scope
Einen vergleichbaren Fehler erzeugt auch PlatformIO. Ich kann daher zurzeit den Kopfhöreranschluss nicht mehr aktivieren (bei neueren Versionen).
Ich vermute, dass vielleicht etwas verändert wurde, in dem Rahmen (Folgende Anmerkung entnehme ich den Versionshinweisen zu V3.3.0_2025.07.26): “Weiterhin wurde ein Compile Error gefixt sowie die Datei „constants.hpp“ etwas überarbeitet (die Konstanten, die nur in einem Feature verwendet werden, werden auch nur aktiviert, wenn das Feature eingeschaltet wurde.”
Ich würde mich freuen, wenn sich vielleicht Hilfe finden ließe, wie ich diesen Fehler beheben könnte und auch in den nachfolgenden Versionen den Kopfhöreranschluss verwenden könnte. Ich danke schonmal für Hilfe im Voraus.
Diese Meldung sagt ganz klar, dass eine Variablendefinition fehlt.
Ein Blick in den Code der constants.hpp zeigt mir, dass diese Definition bei dem Feature SPKONOFF gemacht wird.
Vermutlich ist @Boerge1 beim „Aufräumen“ davon ausgegangen, dass HPJACKDETECT nicht als standalone aktiviert wird sondern immer auch in Kombination mit SPKONOFF.
Wenn also SPKONOFF auch aktiviert ist, compiliert die SW bei mir ohne Fehler.
Auch wenn Du das Feature für Deine Platine nicht benötigst, kannst Du es bedenkenlos aktivieren solange Du nicht den Pin D6 (z.B. Bluetooth) für andere Zwecke verwendest.
vielen Dank für die Rückmeldung. Ja, dies scheint eine Lösung zu sein. Ich habe probehalber nochmal die Version V3.3.1_2025.11.11 kompiliert und jetzt erhalte ich die benannte Fehlermeldung nicht mehr (nur der Speicherplatz reicht gerade nicht - da muss ich noch ein paar Logdateien kürzen.)
Was ich nur noch gesehen habe ist, dass der PIN D6 zumindest auch für #define USE_LED_BUTTONS verwendet werden könnte. Daher bliebe noch die Frage, ob es doch eine Möglichkeit gäbe nur #define HPJACKDETECT ohne gleichzeitig #define SPKONOFF zu aktivieren?
Außerdem habe ich noch nicht ganz verstanden, was #define SPKONOFF überhaupt bewirkt. Vielleicht könnte mir das jemand noch näher erklären. Auch dafür schonmal vielen Dank im Voraus.
Ob es eine Möglichkeit gibt JACKDETECT alleine zu nutzen, kann nur @Boerge1 im Code feststellen bzw. einrichten. Eigentlich ist die Steuerung von D6 für JACKDETECT ja nicht notwendig.
Abgesehen davon, dass meine Programmierkenntnisse dazu bei weitem nicht ausreichen, möchte ich nicht mit „halbgaren“ Ratschlägen in seinem Code herumpfuschen.
Das stimmt vielleicht nicht ganz. Die Aufgabe von JACKDETECT ist meiner Meinung ja gerade, den Lautsprecher auszuschalten und dazu noch die Lautstärke zu ändern. Die Lautstärke alleine zu ändern macht nicht viel Sinn, da dann der Lautsprecher immer noch (mit vielleicht viel zu hoher Lautstärke) spielt.
Ich werde das so ändern, dass SPKONOFF automatisch bei HPJACKDETECT aktiviert wird.
Oder habt ihr in eurer Schaltung den Kopfhörer an den Lautsprecherausgang angeschlossen und der Lautsprecher wird mit der Kopfhörerbuchse ausgeschaltet? Dann könnte ich auch die Steuerung des Lautsprechers beim JACKDETECT weglassen, wenn SPKONOFF nicht aktiviert ist.
@Boerge1
Ich denke @Turkulainen verwendet eine Kopfhörerbuchse mit mech. Schaltern für seine Platine.
Wäre es eine (saubere?) Lösung, die Steuerung des ampEnablePin in der mp3.cpp bei HPJACKDETECT in Abhängigkeit von SPKONOFF in Zeile 381 einfach zu übergehen?
Problem ist gelöst, jetzt kann JACKDETECT ohne SPONOFF aktiviert werden.
V3.3.2 22.11.25 (noch kein Release aber auf dem main Branch verfügbar)
Damit kann die Software den Lautsprecher (über eine Schaltung, die z.B. über D6 gesteuert wird) ein- und ausschalten. Das wird zum Beispiel beim Startup verwendet, um die Knackgeräusche beim Einschalten zu unterdrücken. Und natürlich auch, um den Lautsprecher auszuschalten, wenn der Kopfhörer eingesteckt wird.
auch dir vielen Dank für deine Hilfe - und generell für das gesamte Projekt. Richtig, ich verwende eine Kopfhörerbuchse, die zwischen dem Lautsprecher und Klinke mechanisch umschaltet. Ich meine dies war mal hier im Forum auch vorgeschlagen (und auch die Lösung von den Leiterkartenpiraten) - PJ-306BM. Da ich keine weiteren Platinen dort erwerben konnte, habe ich ja eine eigene Platine für die Classic direkt mit Köpfhöreranschluss entworfen.
Mit der Erklärung klingt die Steuerung der Lautstärke beim Systemstart in der Tat interessant - auch wenn ich an dieser Stelle jetzt keine Schwierigkeiten hatte. Jetzt ergibt sich für mich die Nachfrage - interessehalber - wie denn eine Schaltung aussehen könnte, um PIN D6 bei einer Classic entsprechend anzubinden. Ich bin da nicht ausreichen vom Fach, um mir das vorstellen zu können. Wäre damit ein Lösung mit Stereo (zwei Lautsprecher) und Kopfhörer möglich - Problem ist für mich zurzeit, dass ich die Stereoplatine an die gleichen Anschlüsse wie die Kopfhörerbuchse anschließe und daher nicht beides betreiben kann.
Aber genau das ist doch der vorgesehene Einbauort für einfache Kopfhörerbuchsen mit integriertem Schalter. Da wird ganz ohne Zusatzschaltung der Lautsprecher abgeschaltet, da die Leitung zum Verstärkereingang aufgetrennt wird.
Wenn Du jetzt zusätzlich HPJACKDETECT nutzt, hast Du den Vorteil, dass sich die max-, Min- und Startlautstärke für beides getrennt einstellen lässt.
Die Lautstärkeregelung findet nämlich im Decoderchip des DF-Players statt.
Bei der gezeigten Schaltung sind nur die Transistoren Q2 und Q3 interessant.
Die beiden Transistoren haben Durchgang und verbinden so SPL_IN mit SPK_OUT. Sie sperren, sobald SPK_OFF auf Masse (von D6) gezogen wird.
Wenn Du das für einen Stereoverstärker machen willst, benötigst Du die Schaltung für beide Kanäle /rechts / links)
Die Buchse und Platine der Leiterkartenpiraten kann den Kopfhörer mit Stereo von L & R verbinden und dabei die Verbindung zwischen Lautsprecher und plus & Minus unterbrechen. Sie schaltet ein anderes Signal als das was sie nutzt. Dadurch hat man auf dem Kopfhörer stereo, wo man das ja auch gut wahrnehmen kann. Über Lautsprecher spielt der TonUINO aber mono, was meistens auch ausreicht weil die Lautsprecher sowieso zu nah zusammen sind um einen Unterschied zu bemerken
nochmals vielen Dank für die weiteren Erklärungen. Ich sehe, dass die weitere Schaltung, mit der die Lautsprecher über PIN D6 abgeschaltet werden könnten doch erheblich komplizierter ist. Ich werde mir das noch in Ruhe ansehen müssen - vermute aber, dass ich das aufgrund meiner eingeschränkten fachlichen Fähigkeiten nicht umsetzen kann. Vor allem ist die Platine, die ich verwende (Aufgrund von Blenden, die ich inzwischen entworfen habe und auf jeden Fall weiterverwenden möchte), auch auf 7x3 cm beschränkt. Und da ist gar nicht mehr so viel Platz, um viele weitere Schaltungen zu integrieren. So werde ich wohl bei der Lösung bleiben, dass ich entweder eine Kopfhörerbuchse oder eine Stereoplatine an DAC_R und DAC_L an den DFPlayer Mini anschließe. Ist auch so in Ordnung.