Marco's Affenbox Fork

Ich sags mal so: Der Hauptgrund, der mich bisher von adressierbaren LEDs abgehalten hat, war dass dein Fork das nicht unterstützt (und der für mich seit der ersten Box gesetzt ist).

Wenn Neopixel und Konsorten unterstützt werden, bin ich sofort dabei. Dann bau ich meine Hardware um. Bin grad schon am überlegen ob in die BlobBox eher ein Ring oder ein Streifen rein passt… :laughing:

2 „Gefällt mir“

Hallo zusammen,

erstmal vielen Dank für diesen Fork, die Integration des Drehreglers war ein Kinderspiel!

Was ich jedoch bisher schmerzlich vermisst habe, ist die Integration eines Displays. Ich habe mich daher selbst damit beschäftigt, den Affenbox-Code geforked und damit rumgespielt. Als Anzeige nutze ich derzeit ein TM1637 7-Segmentanzeige.

Meine bisher entwickelten Features:

  • Display ab-/zuwählbar per define
  • Anzeige der Lautstärke beim Ändern
  • Anzeige der Titelnummer (nicht für Partymodus)

Geplante Features:

  • Einstellbarkeit der Displayhelligkeit per Adminmenü (nur verfügbar wenn Display per define aktiviert ist)
  • Anzeige der Zeit
  • automatischer Wechsel zurück zum Titel bzw Zeit (derzeit bleibt die geänderte Lautstärke stehen bis der nächste Titel gestartet wird
  • Unterstützung Partymodus (derzeit wird da einfach stupide hochgezählt, ich hätte aber gerne die korrekte Nummer)

Besteht daran generell Interesse?

2 „Gefällt mir“

Für den sauberen Zwischenstand habe ich mal einen Pull-Request angelegt:

Features:

  • Integration Display per define
  • Anzeige aktueller Titelnummer (kein Partymodus)
  • Anzeige Lautstärke
  • automatischer Wechsel zurück zur Titelanzeige, nachdem die Lautstärke geändert wurde

Das Ändern der Helligkeit per Adminmenü habe ich erstmal auf Eis gelegt. Da man bei C++ nicht wie bei Java die Enum-Länge abrufen kann ging mir das beim Start des Menüs nicht generisch genug. Die Helligkeit ist jetzt per define in der Config enthalten, das sollte ausreichen.

Vielleicht setze ich mich nochmal an den Partymodus, allerdings nutze ich/meine Tochter den nicht, somit lag auch bei meiner Implementierung kein Augenmerk darauf.

Für die Zeit fehlte mir dann doch ein bisschen die Notwendigkeit. Braucht man die wirklich oder ist das nice-to-have? Und wie lange sollte dann beim Titelwechsel die Titelnummer angezeigt werden?

das Interesse scheint sich in Grenzen zu halten. Falls jemand meinen Code haben möchte, kann man diesen hier finden:

Hallo nochmal,

nach einem knappen Monat intensiver Nutzung haben wir ein fehlendes Feature bemerkt. Wenn eine Album fertig gespielt hat, endet die Musik. Ich würde das Album gerne neu starten können, indem ich die Play-Taste drücke.
Da wir die Funktion „Stoppe Musik wenn Karte weg“ aktiviert haben, ist sichergestellt dass sich die Karte zu diesem Zeitpunkt auf dem Lesegerät befindet.
Allerdings fehlt mir ein bisschen die Fantasie an welchem Punkt im Code ich da starten muss. Kann mir da bitte jemand helfen, wo ich mit der Implementierung beginnen muss?

Moin,
ich nutze den Affebox Fork auf 3 AIO Boxen. Auf 2 läuft der wunderbar.
Auf einer sturzt die box unregelmäßig ab. Der einzige unterschied zwischen den Boxen ist das, die die abstürzt dies immer tut wenn man eine Modifikationskarte auflegt um den Sleepmodus einzuschalten. In dem fall 45 Minuten Hörbuch spielen und dann ausschalten.
Die Box geht auch aus, aber danach nichtmehr an. Leider ist das nicht reproduzierbar und da ich die Box verschankt habe, komme ich da auch nicht immer ran.
hat jemand eine Idee?

Hi, ist auf allen die selbe Version installiert?

Hallo @marco-117 oder andere,

Ich überlege gerade das Konzept für eine neue Box und hatte gerne einen großen Dreh Ring für die Lautstärke und in dessen Mitte den RFID Reader. Idealerweise auf der Affenbox-Fork.

Ich habe gesehen, dass der KY-040 Encoder unterstützt wird, habe aber davon leider keine „offene“ Variante gefunden. Hat jemand eine Idee, ob ich einen solchen Encoder auch nutzen kann: https://www.mouser.de/datasheet/2/54/per60-2930501.pdf

Er hat nur 3 Anschlüsse, aber das Signal sieht doch sehr ähnlich aus.

Der fehlende Pin ist das Draufdrücken.
Aber das brauchst du ja nicht.
Möglich wäre aber auch, ein großes Rad zu nehmen und an einer Stelle den Decoder mitlaufen lassen.
Wie ein Dynamo außen am Rad

Hallo @marco-117 und alle anderen Experten dieses Forks.

Wir nutzen seit einem Jahr unseren Tonuino mit dem Affenbox Fork und sind sehr zufrieden damit.
Das ist ein AiO (nicht Plus), 5-Button-Setup mit aktivierter „Pause wenn Karte weg“ Konfiguration. Allerdings gibt es ein Ärgernis für die Kids das fast immer beim Starten auftritt:

Box startet mit Druck auf „Play“, und es dauert ein paar Sekunden bis der „Willkommenssound“ ertönt. In der Zwischenzeit legen die Kinder aber schon die Karte auf und drücken wie wild weiter auf Play, da es noch nicht losgeht. Nach mehrfachem Hin und Her funktioniert es dann schon, aber ich beobachte als Hauptproblem, dass der Player halt beim Drücken immer zwischen Pause und Play wechselt.

Da die Kinder beratungsresistent sind („Bitte einfach 10 Sekunden warten, dann klappt es auf Anhieb…“), will ich nun etwas nachhelfen. Da Play/Pause eh über die Karte gesteuert wird, möchte ich diese Funktion hart am Play-Button deaktivieren. Dieser dient dann nur noch zum Ein-/Ausschalten: ein normales Drücken macht bei laufender Box nichts, nur der Longpress startet den Shutdown.

Ich habe mir den Code angeschaut und in der Konfiguration nichts gesehen was darauf hindeutet dass es das als Option gibt. Kann mir jemand sagen welche Zeilen ich im Code auskommentieren muss um das Verhalten hinzubekommen? Also stupide hardcodiert in meinem eigenen Fork. Meine C+±Kenntnis ist äußerst eingerostet, und selbst das wäre noch geschmeichelt…

Danke für jegliche Hilfe!
Timo

Hallo Timo,
Ich habe mal wegen einer ähnlichen Anfrage Pause und An/Aus trennbar gemacht.
Das lässt sich sogar per Konfiguration aktivieren. Ich muss aber erst schauen welche Ersatzvariable das war, ich hab das bis dato versteckt gehalten.

Habs mal raus gesucht.
In der Configuration.h findest du folgenden Block

/** 
 * Konfiguration eines separten power buttons
 */
//#define buttonPower A0

wenn du das define für den buttonPower aktivierst und weiter oben dem buttonPause einen ungenutzten Pin zuweist, dann wird über deinen Pausetaster die Box nur aktiviert. Allerdings könnte es dann Probleme mit allem geben das den Pausetaster zwingend erfordert z.B. Adminmenü

Ergänzung: Ich habe gerade geschaut ob es möglich ist nur Pause vom Button zu nehmen ohen den Rest zu beeinflussen. Wenn dann liegt die Lösung in dieser Funktion:

void pauseAction(bool fromCard /* = false */)
{
  if (myTriggerEnable.pauseTrack == true)
  {
    myTriggerEnable.pauseTrack = false;
    if (activeModifier != NULL)
    {
      if (activeModifier->handlePause() == true && !fromCard)
      {
#if defined DEBUG
        Serial.println(F("pause act lckd"));
#endif
        return;
      }
    }
    if (isPlaying())
    {
#if defined DEBUG
      Serial.println(F("pause"));
#endif
      checkForUnwrittenTrack();
      mp3Pause();
      //setstandbyTimer();
    }
    else if (knownCard || activeShortCut >= 0)
    {
#if defined DEBUG
      Serial.println(F("play"));
#endif
      mp3.start();
      //disablestandbyTimer();
    }
  }
}

Die wird immer Aufgerufen wenn ein Trigger ( Karte, Taster, etc. ) Pause auslöst. Speziell für die Kartenpause gibt es einene Übergabevariable fromCard. Du kannst also erkennen wenn Pause von der Karte oder allem anderem kommt. Wenn du um den ganzen Inhalt der Methode eine Abfrage machst ob fromCard=true ist, kannst du nur reagieren wenn die Karte pause auslöst. In etwa so:

void pauseAction(bool fromCard /* = false */)
{
  if (myTriggerEnable.pauseTrack == true && fromCard)
  {
    myTriggerEnable.pauseTrack = false;
    if (activeModifier != NULL)
    {
      if (activeModifier->handlePause() == true && !fromCard)
      {
#if defined DEBUG
        Serial.println(F("pause act lckd"));
#endif
        return;
      }
    }
    if (isPlaying())
    {
#if defined DEBUG
      Serial.println(F("pause"));
#endif
      checkForUnwrittenTrack();
      mp3Pause();
      //setstandbyTimer();
    }
    else if (knownCard || activeShortCut >= 0)
    {
#if defined DEBUG
      Serial.println(F("play"));
#endif
      mp3.start();
      //disablestandbyTimer();
    }
  }
}

Hinweis, das gilt für die aktuellste Version.

Könnte man nicht auch einen Modifier machen, der nur die Pausetaste sperrt (wenn man die normale Tastensperre nicht nutz, könnte man sogar die abändern) und den beim Start aktivieren?

Hi, das ginge auch, aber dann wären die Modifier generell gesperrt, weil dann immer die Pauseblockade drin sein muss. So kann man sagen ist es ein Eingabekonzept, nur bei Karte weg zu pausieren.

Ich hatte es so verstanden, dass das Problem vor allem beim Einschalten auftritt. Da wäre es nicht so schlimm wenn später nach Auflegen eines anderen Modifiers Play nicht mehr gesperrt wäre.

Über ein temporäres ausschalten hab ich auch nachgedacht, aber das fand ich auch irgendwie komisch.
Auch die implementierung wäre dann etwas aufwändiger
Über den Modififer wirkt es eher wie ein Workaround als ein bewusstes Feature, auch hier wäre der Aufwand größer.

So hatte ich die Frage auch verstanden, wenn du es als Feature mit aufnehmen willst, dann ist das natürlich etwas anderes. Ansonsten wäre aus der Tastensperre alle anderen Tasten löschen und diesen Modifier beim Start aktivieren etwas, was relativ leicht umzusetzen wäre

Als Feature will ich es nicht aufnehmen, aber man kann mit der kleinen Ergänzung von && fromCard eines draus machen.
muss @TimoDeus entscheiden was ihm besser gefällt

Super, ihr seid ja schnell!
Vielen Dank für die Hinweise. Die Methode pauseAction mit fromCard waren genau wonach ich gesucht habe. Aus meiner Sicht muss da kein großes Fass aufgemacht werden, ich baue das einfach für mich selbst ein.

Hallo marco-117 (bzw. die anderen Experten),
wie kann man bei dem Affenbox Fork den Start- und Shutdown-Sound abschalten?
Ich habe echt lange gegoogelt, bin aber anscheinend einfach zu blöd es zu finden…
Ich habe den „Affenbox v2.12“ Master
Vielen Dank im Voraus!
Gruß
Christian