TonUINO - Always queue -Maximale Ausstattung

So habe es nun auch auf dem Tonuino Classic gecheckt. Da hab ich auch keine Fehlfunktion. Prüfe doch mal nach ob das auch bei deaktivierter LED Animation auftritt. Dazu musst du nur die Konsole freigeben, die LED-Animation wird dann automatisch deaktiviert. Schau auch mal was die Konsole ausgibt beim Durchschalten der Lautstärke zwischen Max und Min.
Probiere auch mal die Max Lautstärke etwas zu reduzieren.

Also nach meheren versuchen an meinem ersten Tomuino denke ich das hier ein Hardware defekt vorliegt. Da ich nach meheren Versuchen auf die Alteversion zuruck zugehen ihr die gleiche Probleme sind.
Wir die nachsten Tage zerlegt und Ersatz eingebaut.

Nun Habe ich es an meinem zweiten versucht der ca 4 Wochen alt ist. Hier habe ich das oben genannte Problem nicht aber wurde in dieser Software etwas beim Abschalten geändert? Weil der Tonuino nun nicht mehr abschaltet. Laut Monitior kommt das Power Down Signal. Der Tonuino Schaltet irgentwie ab die LED im Ring Bleibt Stehen und er ist nicht mehr bedienbar. Ich hab einen Poulo-Switch eingebaut und der hat bis zu dieser Version immer funktioniert muste lediglich das signal anpassen. Vieleicht kann mir hier einer weiter Helfen weil solangsam versteh ich das hier nimmer ganz :weary:

Die Software schaltet den Power Off pin zum Ausschalten auf LOW. Ich glaub der Pololu switch braucht High zum Ausschalten. Dann musst du den Pegel in der voit Shutdown() Ändern in High statt Low.
Andere Möglichkeit

#ifdef HW_PowerOff
#ifndef AiO                              ****** ENTFERNEN
  digitalWrite(ShutDownPin, LOW);                                   // Ausschalten!, Low Pegel zum Rücksetzen des Einschalt-Flip-Flop
  delay(500);
  digitalWrite(ShutDownPin, HIGH);                                  // Wiederholung falls Reset des FF nicht erfolgreich
  delay(500);
#endif                                    ******** ENTFERNEN
  digitalWrite(ShutDownPin, LOW);                                   // Ausschalten!, Low Pegel zum Rücksetzen des Einschalt-Flip-Flop
  delay(500);
#endif

Dadurch wird das Ausschaltsignal als mehrfachimpuls mit LOW - HIGH - LOW Folge gesendet, so dass beide Varianten des Ausschaltens LOW Aktiv und HIGH aktiv bedient werden.

Im SETUP

#ifdef HW_PowerOff
#ifndef AiO
  pinMode(ShutDownPin, OUTPUT);         // Ausgang Ausschaltsignal für MosFet oder Polulo-Switch
  digitalWrite(ShutDownPin, HIGH);      // Voreinstellung - On
#endif
#endif

Die Zeile

digitalWrite(ShutDownPin, HIGH); // Voreinstellung - On

Ändern in

digitalWrite(ShutDownPin, LOW); // Voreinstellung - On

Dann sollte es funktionieren.

Ich werde das mal noch in die defines aufnehmen damit man das Ausschaltsignal als HIGH oder LOW Aktiv definieren kann.

So ich hab das mal so wie du mir das beschrieben hast implementiert leider wieder ohne erfolg. Das komische wenn er im Standby ist Wander die led im Neopixel Ring ist die Zeit abgelaufen bei die led stehen aber er schaltet nicht ab. Kann es vieleicht sein das du den Arduino irgendwie runter fährst bevor der Shutdown Signal kommt? Weil wenn die zeit abgelaufen ist schalte er nicht ab aber ich kann ihn auch nicht mehr bedienen! Taster und rfid reagieren nicht mehr. Ausschalten geht nur noch über Stecker ziehen.

Die Software schaltet definitiv aus. Irgendwie kriegt dein pololu aber den ausschaltimpuls nicht, oder nicht richtig. Ist der off Anschluss des pololu mit dem richtigen Pin am arduino verbunden und kriegt er den richtigen Pegel (High) zum Abschalten?

Ein gutes neues erstmal. Also wie schon gesagt hat es mit der Version 20_10_18 das abschalten funktioniert. Der Pegel und der pin sollte passen ihr hab ich nichts geändert. Für mich sieht aus als würde die Software abschalten bevor das ausschalte Signal kommt

Ein frohes Neues auch erst einmal. Hattest du in der 201018 pegelmäßig was angepasst?

Nein hier mußte ich nichts anpassen. Also die Software stop auf jeden Fall. Kann man das für test Zwecke mal raus nehmen?

Kopiere doch mal bitte deine Defines und poste sie hier. Dann schaun wir mal.

 ***********************************************************************************************************/
// _________________________________________________________________________________________________________

// *************** Auswahl der Tonuino-Variante ** AiO oder TonUINO Classic ********************************
// uncomment or comment the " #define AiO "  to switch enter the AiO Softwareversion or TonUINO Classic

// --------------------- All in One Board ------------------------------------------------------------------
//#define AiO                     // Software wird an das AiO Board angepasst
                                // Für den TonUINO Classic " #define AiO " in Kommentar setzen
// _________________________________________________________________________________________________________

// *************************** Auswahl der Zusatzfunktionen ************************************************

// uncomment or comment the " #define .... "  to enable or disable the additional function


// --------------------- Debug Modus --- AiO und Classic ------------------------------------------------------------
//#define Konsole                // Zum Einsparen von Programmspeicher wird die Ausgabe
                               // auf den Seriellen Monitor nur bei Freigabe ausgeführt.
                               // Bei aktiver LED-Animation, wird diese deaktiviert, um den Programmspeicher
                               // für die Konsolenausgabe frei zu machen.
                               // Soll die LED-Animation verwendet werden, 
                               // muss die #define Konsole durch in Kommentar "//" setzen deaktiviert werden.
                               
// -------------------- 5 Tasten Support --- AiO und Classic ----------------------------------------------------------
#define FIVEBUTTONS            // 5 Tasten support
                              // In diesem Modus kann die Batterieüberwachung im TonUINO Classic nicht verwendet werden
                              // wenn A4 von dieser verwendet wird, oder der PrüfPin muss umdeklariert werden.

// -------------------- Zuletzt gespielte Karte als Shortcut speichern --- AiO und Classic -------------------------------
#define LastCard              // Die zuletzt gespielte Karte wird als Shortcut auf die Pause-Taste gelegt 
                              // Shortcuts, Startsound und Weckersound werden dabei nicht berücksichtigt
                              // Die Konfiguration des Shortcuts der PlayTaste wird aus dem Adminmenü ausgeblendet.

// ---------------------- Hörbuch auf Anfang zurücksetzen --- AiO und Classic ---------------------------------------------
#define HB_Reset              // Durch langen Druck der Pausetaste bei laufender Wiedergabe, 
                              // wird im Abspielmodus Hörbuch der Fortschritt des Hörbuches auf Anfang zurückgesetzt

// -------------------- Menülautstärke der Adminfunktionen festlegen --- AiO und Classic ----------------------------------
#define MenueVol                 // Die Menülautstärke wird auf die Startlautstärke Lautsprecher eingestellt.
const uint8_t MenueVolume = 20;  // Bei Deaktivierung von MenueVol wird die Menülautstärke auf diesen Festwert eingestellt.

// ------------------- Zählen der Ordner auf der SD-Karte --- AiO und Classic ---------------------------------------------
#define CountFolders           // Die Anzahl der Ordner des Speichermediums im DfPlayer wird ermittelt
                               // und als Begrenzung bei der Ordnerauswahl verwendet.
                               // Abhängig vom Chipsatz des DfPlayers ist die Funktion nicht immer verfügbar.
                               // Dann deaktivieren ! Es werden dann wieder die Funktionen ohne CountFolders verwendet.
                               // Getestet mit MH-ETLive, IL AA19 und YX5200 24SS - und funktioniert.
                               // AiO Platine funktioniert auch.

// -------------------- Windows SystemVolumeInfo ignorieren --- AiO und Classic -------------------------------------------
#ifdef CountFolders            // Bei CountFolders stört der Windows SystemVolumeInfo Ordner die exakte Funktion.
 #define IgnoreWinSysInf       // Der Windows-Ordner "Windows SystemVolumeInformation" kann auf der SD-Karte
                               // verbleiben und wird ignoriert. Dies ist bei Nutzung der Option CountFolders
                               // wichtig, um die korrekte Ordner Anzahl für die davon abhängigen Funktionen
                               // zu verwenden.
#endif
// -------------------- Abschaltung über Hardware --- AiO und Classic ------------------------------------------------------
#define HW_PowerOff            // Abschaltung über Hardware, wie Mosfet oder Pololu-Switch
                               // Hardwareerweiterung für TonUINO Classc erforderlich. Mosfet oder Pololu-Switch
                               // Auf der AiO Platine ist die erforderliche Hardware bereits vorhanden

// -------------------- LED Animation mit NEOPixel LED Ring oder Strip --- AiO und Classic ----------------------------------
                               
#define LED_SR               // LED Animation mit Neopixel LED-Ring oder Strip
     #ifdef Konsole            // Hardwareerweiterung erforderlich: (Neopixel Strip oder Ring)
       #ifdef LED_SR           // Sind die Konsolenausgabe und die LED Animation Definiert, 
        #undef LED_SR          // die LED Animation ausblenden
       #endif
     #endif  
     #ifdef LED_SR                 // Bei definierter LED Animation
  const uint8_t LED_COUNT = 16 ;   // Anzahl an LEDs im Ring oder Strip. Kann hier angepasst werden.
      #define LED_SR_Switch    // Möglichkeit die LED-Animation über gleichzeitigen langen Druck 
                               // der Up-Down Tasten ein- und auszuschalten
    #endif 
   
// -------------------- Lautsprecher abschaltung über Software ---AiO auch über KH Buchse --------------------------------------
#define SpkOnOff              // Aus und Einschalten des Lautsprechers über Software 
                              // zur Unterdrückung des Einschaltgeräusches und
                              // Möglichkeit der Abschaltung beim Anschluss eines Kopfhörers (AiO über KH-Buchse )
                              // Hardwareerweiterung für TonUINO Classic erforderlich: (Abschaltung des Lautsprechers über MOS-FET's)
                              // Bei der AiO wird der Verstärker ein bzw. ausgeschaltet

// -------------------- Kopfhörer --- Nur TonUINO Classic --- Für Nutzung mit der AiO ist eine Änderung auf der Platine nötig ---
//#ifndef AiO                   // Nur TonUINO classic (Anpassung an AiO nur über Hardwareänderung möglich)
//#define EarPhone              // Abschaltung des Lautsprechers über Software, wenn Kopfhörer angeschlossen sind
    #ifdef EarPhone           // Hardwareerweiterung erforderlich: (Kopfhöerbuchse mit Schaltkontakten, oder Kopfhöreranschlussplatine)
       #ifndef SpkOnOff       // wenn SpkOnOff nicht aktiviert ist, wird diese Funktion automatisch mit aktiviert
        #define SpkOnOff      // Hardwareerweiterung erforderlich: (Abschaltung des Lautsprechers über MOS-FET's)
       #endif                 // Die Startlautstärken werden getrennt über das Adminmenü voreingestellt.
    #endif                    // Die letzten Laustärken werden getrennt bis zum Abschalten temporär gespeichert.
//#endif

// ------------------- Festlegen des Sensorpegels für den Kophöreranschluss ---Nur TonUINO Classic --------------------------------
#ifndef AiO                   // Nur TonUINO Classic
//#define KHSensLOW             // Der Sensorpegel für den Kopfhöreranschluss ist bei eingestecktem Kopfhörer LOW
                              // Wenn der Sensorpegel bei eingestecktem Kopfhörer HIGH ist, #define deaktivieren
#endif
// ------------------- Weckerfunktion mit Weckermodul --- AiO und Classic ---------------------------------------------------------

//#define Wecker               // Über ein externes Weckeruhrwerk wird eine Weckfunktion aktiviert
                            // TonUINO wird eingeschaltet und ein vordefinierter Shortcut als Wecker abgespielt
#ifdef Wecker               // Der Dialog zum Erstellen des Weckershortcuts wird im Adminmenü aktiviert.
 #ifndef SpkOnOff           // wenn SpkOnOff nicht aktiviert ist, wird diese Funktion automatisch mit aktiviert
   #define SpkOnOff         // Hardwareerweiterung für TonUINO Classic erforderlich: (Abschaltung des Lautsprechers über MOS-FET's)
  #endif
#endif

Von den Defines ist soweit alles ok.
Jetzt müssen wir Hardwaremäßig einiges Prüfen.

  1. Pololu switch.
  • auftrennen der Verbindung vom ShutDown pin Arduino zum Off anschluss Pololu.
    Tonuino anschalten
    Off anschluss des Pololu mit einem Jumperkabel kurz mit 5V antippen.
    Pololu und Arduino muss ausschalten.
    Wenn bis dahin das funktioniert ist der Pololu in ordnung.
  1. Ausschaltsignal vom Arduino kontrollieren.
    Off Verbindung zum Pololu noch nicht wieder anschließen.
    Tonuino anschalten
    Der ShutDown pin des Arduino muss LOW Pegel haben.
    Kontrollieren mit Multimeter, oder alternativ mit einer LED mit 220 Ohm bis 330 Ohm
    Widerstand in Reihe gegen Ground.
    Tonuino in Pause lassen bis Standbytimer den Tonuino ausschaltet
    Es muss ein kurzer HIGH Impuls am ShutDownpin für ca 0,5 sek anliegen. LED Leuchtet
    kurz auf.
    Passiert das so kommt auch der Ausschaltimpuls, Wenn nicht müssen wir weiter suchen.

Hallo @Tomtom
Wie siehts aus? Fehler gefunden?

Hallo Thomas erstmal vielen Dank für die Hilfe stellung. Hatte heute mal Zeit beide Tonuinos auseinander zu bauen. Beim ersten mit den Problemen mit der Lautstärke hab ich Sicherheitshalber Ardoino und dfplayer getauscht läuft wieder einwandfrei👍. Beim Zeiten mit dem ausschalten Problem war ich glaub am anschließen geistig um nachtet😔. Ich war einmal auf der platine nicht auf pin 7 sondern auf pin 8 und am polulo auf ctl. Hat mit der alten Version funktioniert weil da noch pin 8 usb off war. Hab das mal richtig gemacht nun passt das perfect👍 vielen dank nochmal für deine Unterstützung ist einfach genial hier💪

Freut mich zu hören. Viel Spaß noch beim weiterbasteln.

Hallo @Thomas-Lehnert,

habe nun deine Version im Einsatz. Sehr strukturiert. Gefällt mir gut. Danke für die Mühe.

Beim Übertrag auf mein eigenes Board mit ein paar Extras bin auf folgendes gestoßen. Vielleicht magst du das als Anregung übernehmen.

1.) Logikpegel des SpkOnOff. Für das AiO ist der fest definiert HIGH=OFF. Für die offene Lösung ist aktuell fest definiert LOW=OFF. Ich möchte anregen hier analog zu der Logik vom ShutDownPin mit dem ShutDownAktiveLow ein entsprechendes #define auch für den SpkOnOff einzuführen. Dann kann man den Pegel spezifizieren. Bei mir kam erstmal nichts an ;o), weil bei mir ist der Verstärker LOW aktiv.

2.) Umschaltung des Pegels für SpkOnOff bzw. ShutDownPin.
Für die Lösung machst du derzeit im Code an vielen Stellen Umschaltungen per #ifdef. Das führt zu viel redundanten Code und die Verschachtelung lässt sich schwer lesen. Hier ein Beispiel.

#ifdef HW_PowerOff
#ifndef AiO
  pinMode(ShutDownPin, OUTPUT);         // Ausgang Ausschaltsignal für MosFet oder Polulo-Switch
  #ifdef POffLowActive
  digitalWrite(ShutDownPin, HIGH);      // Voreinstellung - On
  #endif
  #ifndef POffLowActive
  digitalWrite(ShutDownPin, LOW);       // Voreinstellung - On
  #endif
#endif
#endif
#ifdef AiO
  pinMode(ShutDownPin, OUTPUT);
  digitalWrite(ShutDownPin, HIGH);      // Spannung AiO einschalten

Ggf. macht es Sinn, statt dessen das HIGH und LOW direkt durch ein entsprechendes #define zu ersetzen und die Logik dazu zentral in den Konfigurationsteil zu verschieben. z.B.

//Konfiguration
#ifdef HW_PowerOff //ggf. hier noch mit Logik und Abhängigkeiten vom AiO usw.
#define PowerOnOffOnLevel HIGH // Hier den erforderlichen Pegel definieren. HIGH oder LOW.
// Standard für AiO ist ???
#endif

// Im Code
#ifdef HW_PowerOff
pinMode(ShutDownPin, OUTPUT); // Ausgang Ausschaltsignal für MosFet, Polulo-Switch oder AiO.
digitalWrite(ShutDownPin, PowerOnOffOnLevel); // Voreinstellung - On
#endif

Dadurch reduziert sich das universell für alle Lösungen ohne Fallunterscheidung auf eine Zeile.
Für Off funktioniert dann übrigens:

digitalWrite(ShutDownPin, !PowerOnOffOnLevel);

3.) In dem Kontext ist mir auch aufgefallen, dass du den Pullup für die Buttons doppelt definierst. JC_Button sieht bereits per Default im Konstruktor die Spezifikation der IO Pins als Eingang mit Pullup vor. Da ich aktive Sensoren verwende, die bei Tastendruck HIGH liefern, habe ich die Objektinitialisierung entsprechend auf Invertiert ohne Pullup umgeschrieben.

#ifndef BUTTONS_HIGH_ACTIVE
          // JC default configuration is
          // dbTime   Debounce time in milliseconds (default 25ms)
          // puEnable true to enable the AVR internal pullup resistor (default true)
          // invert   true to interpret a low logic level as pressed (default true)
  Button pauseButton(ButtonPause);
  Button upButton(ButtonUp);
  Button downButton(ButtonDown);
  #ifdef FIVEBUTTONS
  Button buttonFour(ButtonFourPin);
  Button buttonFive(ButtonFivePin);
  #endif
#else
// For TTP 223 capacitive touch sensor in factory configuration touched is HIGH. No pull up required!
  Button pauseButton(ButtonPause, 25, false, false);
  Button upButton(ButtonUp, 25, false, false);
  Button downButton(ButtonDown, 25, false, false);
  #ifdef FIVEBUTTONS
  Button buttonFour(ButtonFourPin, 25, false, false);
  Button buttonFive(ButtonFivePin, 25, false, false);
  #endif
#endif

Aktuell wird das im Setup erneut überschrieben. Letztlich ist diese pinMode Definition mit JC_BUtton überflüssig.

pinMode(ButtonPause, INPUT_PULLUP); // Eingang Pausetaste
pinMode(ButtonUp, INPUT_PULLUP); // Eingang Uptaste
pinMode(ButtonDown, INPUT_PULLUP); // Eingang Downtaste
#ifdef FIVEBUTTONS
pinMode(ButtonFourPin, INPUT_PULLUP); // Eingang Taste 4
pinMode(ButtonFivePin, INPUT_PULLUP); // Eingang Taste 5
#endif

Schönen Abend,

MfG Nick

Was mir grad noch eingefallen ist. Die meisten Repros haben auch die RX/TX Pins als define in die Konfiguration übernommen.

// ******************** DF-Player **************************
// DFPlayer Mini
SoftwareSerial mySoftwareSerial(DFPlayerRx, DFPlayerTx);

Natürlich kann man das auch so machen wie du vorschlägst. Aber zum Beispiel für die Lautsprecherabschaltung waren mir bis dato nur die beiden Varianten Klassic mit Mosfets High-aktiv und AiO mit enablePin des Verstärkers LOW-aktiv bekannt. Man kann nicht immer alle vielleicht möglichen Versionen berücksichtigen, zumal der Code ja in erster Linie für meine Hardwareversionen geschrieben, bzw angepasst wurde. Natürlich steht es ja jedem frei den Code an seine Bedürfnisse weiter anzupassen. Aber wie gesagt, man kann nur schwer alle Möglichkeiten berücksichtigen. Das die Pullups in der library für die Buttons schon automatisch gesetzt werden wusste ich tatsächlich nicht, zumal in der Original Ursprungssoftware die Pullups im setup ebenfalls gesetzt werden. Aber wenn man normale Tasten verwendet macht das doppelte setzen ja nichts aus. Wer wie in deinem Fall die sensortasten verwendet, weiß das dann sicher auch und kann es für sich dann entsprechend anpassen. Nichts für ungut, die Eierlegende Wollmilchsau gibts ja auch nicht.

1 „Gefällt mir“

Hi Thomas,

passt, verstanden.

Dann nur für den Fall, das jemand anders auch drüber fällt. Initialer Reset als Direktzugriff auf die Hardware am Objekt vorbei. Und ich wunder mich noch über den obligatorischen Reset beim Hochlauf ;o).

// *************** Manueller Reset beim Einschalten ****************************************

// RESET — ALLE DREI KNÖPFE BEIM STARTEN GEDRÜCKT HALTEN → alle EINSTELLUNGEN werden auf DEFAULT gesetzt
if (digitalRead(ButtonPause) == LOW
&& digitalRead(ButtonUp) == LOW
&& digitalRead(ButtonDown) == LOW)

So läuft es dann auch mit invertierten Buttons:

// *************** Manueller Reset beim Einschalten ****************************************

// RESET — ALLE DREI KNÖPFE BEIM STARTEN GEDRÜCKT HALTEN → alle EINSTELLUNGEN werden auf DEFAULT gesetzt

  readButtons();                             // Tasten auslesen
if (pauseButton.isPressed()
    && upButton.isPressed()
    && downButton.isPressed())

Dann baschtel ich mal weiter.

MfG, Nick

Der Reset ist nur obligatorisch wenn eine Softwareversion aufgespielt wird, die einen abweichenden myCookie oder keinen myCookie aufweist. Das hängt mit verschiedenen Strukturen der Settings bzw unterschiedlichen mySettings zusammen. Würde hier kein Reset erzwungen kann es probleme mit dem entsprechenden Code geben weil falsche Werte in den Settings zu fehlfunktionen führen würden. Der manuelle Reset über die drei Tasten beim Einschalten ist nur eine weitere Möglichkeit den Tonuino bei „Seltsamen Fehlverhalten“ manuell zu resetten.

War hier in das Messer gelaufen, dass im Code pauschal auf LOW am Objekt vorbei abgefragt wird, und nicht ob Button.isPressed(). Somit ist die Invertierung, die der JC_Button über den Konstruktor anbietet umlaufen. Und da die Sensortasten im Ruhezustand LOW sind, liegt die Reset Bedingung quasi statisch bei jedem Hochlauf.

Amnesie per Default.