AiO Platine Marko's Affenbox Fork 2.0.3 KY-040 Problem

Hallo liebe Community,

Ich habe mich jetzt mal an die AiO Platine in Kombination mit dem Degree Rotatory Encoder KY-040 gewagt. Allerdings scheine ich nicht in der Lage, diesen gangbar zu machen.

Als Fork habe ich diesen genutzt.

Ich habe die Pins des KY-040 wie folgt (auf dem Buttonboard) angeschlossen:

CLK : V-
DT: V+
SW: PBP
+: 3.3V (AiO Platine)
GND : GND

Defines habe ich folgende aktiviert:


//===========================================================================
//================================ All in One ===============================
//===========================================================================
/*
*Bei Verwendung der All in One Baugruppe, (genannt AiO) aktivieren
*https://www.leiterkartenpiraten.de/produkt/tonuino-all-in-one/
*/

#define AiO

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//===========================================================================
//============================= Hardware Features ===========================
//===========================================================================
/** 
*Nachfolgend sind alle möglichen Hardware erweiterungen aufgelistet und die dazugehörigen Konfigurationsmöglichkeiten.
*Um eine Funktion zu aktivieren das entsprechende "#define" auskommentiern. Dazu die beiden "//" davor entfernen.
*Alles weiter steht bei den entsprechenden Punkten
*/

//===========================================================================
//================================= Buttons =================================
//===========================================================================

/** 
 * Konfiguration der Standard Button Pins 
 */
 
/**
*Sample Classic
*/
//#define buttonPause A0
//#define buttonUp A1 
//#define buttonDown A2


/**
*Sample All in One
*/
 **#define buttonPause A0**
 **#define buttonUp A4**
 **#define buttonDown A3**

/**
*Sample Affenbox Pocket
*https://discourse.voss.earth/t/pocket-tonunio-affenbox-v2/4906?u=marco-117 
*/
// #define buttonPause A2
// #define buttonUp A0 
// #define buttonDown A1


//===========================================================================
//============================= FIVEBUTTONS =================================
//===========================================================================
/**
*Für die Verwendung von fünf Buttons, statt drei.
*/
#define FIVEBUTTONS  

#if defined FIVEBUTTONS
/**
*Sample Classic
*/
//#define buttonFourPin A3
//#define buttonFivePin A4

/**
*Sample All in One
*/
#define buttonFourPin A1
#define buttonFivePin A2

#endif
//===========================================================================
//============================= PUSH_ON_OFF =================================
//===========================================================================
/** 
*+++Bei AiO standardmäßig aktiv +++
*Ein-/Ausschalten des TonUINO über langen Druck des Pausetasters. 
*Setzt Hardware vorraus, die das Ausschalten unterstüzt,
*z.B.: 
*- Pololu-Switch -> https://discourse.voss.earth/t/pololu-als-power-switch-einsteiger/2099
*- Powerbank mit automatischer Abschaltung -> https://discourse.voss.earth/t/intenso-s10000-powerbank-automatische-abschaltung-software-only/805/5
*/

//#define PUSH_ON_OFF    

#if defined PUSH_ON_OFF

/* 
*Angabe des Anschlusspins für die PUSH_ON_OFF Funktion.
*Ausgeschlossen sind folgende Pins: 4, 9, 10, A7, sowie bereits durch andere Funktionen vergeneben Pins.
 */
#define PUSH_ON_OFF_PIN 7

#endif

//===========================================================================
//============================= SPEAKER_SWITCH ==============================
//===========================================================================
/**
*+++Bei AiO standardmäßig aktiv +++
*Bei verwendung einer externen Lautsprecherschaltung, zur unterdrückung des Einschaltgeräusches,
*sowie des Leerlaufrauschens.
*https://discourse.voss.earth/t/geraeusch-beim-start-der-box-allerdings-nicht-bei-jedem-start/1357/34?u=marco-117 
*/

//#define SPEAKER_SWITCH  

#if defined SPEAKER_SWITCH

/* 
*Angabe des Anschlusspins für den Lautsprecherschalter.
*Es kann jeder freie Ausgang geählt werden.
*Ausgeschlossen sind folgende Pins: 4, 9, 10, A7, sowie bereits durch andere Funktionen vergeneben Pins.*
 */
#define SPEAKER_SWITCH_PIN 8

#endif


//===========================================================================
//============================= ANALOG_INPUT ================================
//===========================================================================
/**
*Gibt die Möglichkeit die Affenbox mit mehreren Tastern über einen analogen Eingang zu steuern.
*Hierzu wird extra Hardware benötigt.
*z.B.:
*TonUINO Button Board (bereits vorkonfiguriert)
*https://www.leiterkartenpiraten.de/produkt/tonuino-button-board-3x3/
*
*Für eigene Aufbauten weitere Informationen:
*https://github.com/bxparks/AceButton/tree/develop/examples/LadderButtons
*
*Bitte beachten: die AiO verwendet andere Referenspegel als der Arduino Nano!
*/

//#define ANALOG_INPUT

#if defined ANALOG_INPUT

/**
*Angabe des Anschlusspins für die analogen Signale.
*Es kann jeder freie analoge Eingagn gewählt werden.
*Ausgeschlossen sind folgende Pins: A7, sowie bereits durch andere Funktionen vergeneben Pins.
 */
#define ANALOG_INPUT_PIN A3

/** 
*Menge der analogen Signale/Buttons.
 */
#define ANALOG_INPUT_BUTTON_COUNT 9

/** 
*Liste der analogen Werte für jeden Button.
*Es muss für jeden Button ein Wert angegeben werden, plus der Wert wenn kein Button gedrückt ist.
*Dieser Nullwert muss an erster Stelle stehen.
*Die hier in der {}-Klammer schon aufgelisteten Werte, sind die Standardwerte für das TonUINO Button Board. Sowohl für die AiO als auch für die klassische Variante. 
*Bei eigenen Aufbauten kann alles in der {}-Klammer gelöscht und ersetzt werden. 
*!!Zur erfassung der Werte hilft "#define ANALOG_INPUT_PRINT"!!
 */
static const uint16_t ANALOG_INPUT_LEVELS[ANALOG_INPUT_BUTTON_COUNT + 1 ] = {
 #if defined AiO  // values for AiO (2,048V reference, 12bit ADC), TU_BB_3x3 v1.0
  0,    //Null
  490,  //Button 1
  945,  //Button 2
  1494,
  1949,
  2480,
  2937,
  3373,
  3691,
  4064  //Button 9
#else// values for Arduino Nano (5V reference, 10bit ADC), TU_BB_3x3 v1.0
  0,
  92,
  194,
  307,
  405,
  512,
  608,
  698,
  773,
  1023
#endif
};

/** 
*Liste der Funktion für jeden analogen Wert.
*Es muss für jeden analogen Wert eine Funktion festgelegt werden, inklusive dem Nullwert.
*Die Reihenfolge der Funktionen muss der Reihenfolge der analogen Werte entsprechen.
*D.h. Analogwert 3 == Funktionswert 3
*
*Die hier in der {}-Klammer schon aufgelisteten Werte, sind die Standardwerte für das TonUINO Button Board. Sowohl für die AiO als auch für die klassische Variante. 
*Bei eigenen Aufbauten kann alles in der {}-Klammer gelöscht und ersetzt werden. 
*
* Folgende Werte können angegeben werden:
   Null                = 0,
   Pause               = 1,
   Next                = 2,
   Next +10            = 4,
   Previous            = 5,
   Previous +10        = 6,
   VolumeUp            = 7,
   VolumeDown          = 8,
   Abort/Shutdown      = 9,
   AdminMenu           = 10,
   Reset Playback Mode = 11,
   Shortcut No.1 to 12 = 12 bis 24
 */
//#define ANALOG_INPUT_SUPPLY_PIN 6 //Nur verwenden, wenn es unbedingt nötig ist!Der Referenzpegel kann auch von einem IO Pin kommen.
static const uint8_t ANALOG_INPUT_BUTTON_MAP[ANALOG_INPUT_BUTTON_COUNT + 1 ] = {
  0,  //Null
  12, //Shortcut No. 1
  13, //Shortcut No. 2
  14, 
  15,
  16,
  17,
  18,
  19,
  20  //Shortcut No. 9
};

/*
*Für genauere Debugausgaben im seriellen Monitor.
*!Achtung! Benötigt viel Speicher, eventuell müssen andere Funktionen temporär deaktivert werden!
*/
#define ANALOG_INPUT_PRINT

/*
*Gibt die analogen Werte so schnell wieder wie möglich. 
*Falls die analogen Werte der Taste nicht bekannt sind können sie hiermit ermittelt werden.
*/
#define ANALOG_INPUT_PRINT_ANALOGREAD

#endif

//===========================================================================
//============================= IRREMOTE ====================================
//===========================================================================
/**
*Gibt die Möglichkeit die Affenbox mit einer IR Fernbedienung zu steuern.
*Hierzu wird extra Hardware benötigt.
*z.B.:
*IR Infrarot Remote Receiver / Empfänger TSOP38238 
*https://www.berrybase.de/bauelemente/aktive-bauelemente/leds/infrarot-leds/ir-infrarot-remote-receiver/empf-228-nger-tsop38238

*Infrarot Fernbedienung mit 17 Tasten (bereits vorkonfiguriert)
*https://www.berrybase.de/raspberry-pi/raspberry-pi-computer/eingabegeraete/infrarot-fernbedienung-mit-17-tasten
*/

//#define IRREMOTE

#if defined IRREMOTE

/* 
*Angabe des Anschlusspins für den Data Pin des IR Empfängers.
*Es kann jeder freie digtale Eingang geählt werden.
*Ausgeschlossen sind folgende Pins: 4, 9, 10, sowie bereits durch andere Funktionen vergeneben Pins.
 */
#define IRREMOTE_PIN 6


/*
*Falls das Protokoll der gewünschten Fernbedienung beakannt ist, sollte NUR DAS ENTSPRECHENDE PROTOKOLL auskommentiert werden. 
*Das spart wertovllen Speicher.
*Falls das Protokoll nicht bekannt ist, keines der Prtoolle auskommentiern!
*"#define IRREMOTE_PRINT" hilft bei der identifizierung des Protokolls.
*/
//#define DECODE_DENON        // Includes Sharp
//#define DECODE_JVC
//#define DECODE_KASEIKYO
//#define DECODE_PANASONIC    // the same as DECODE_KASEIKYO
//#define DECODE_LG
#define DECODE_NEC          // Includes Apple and Onkyo
//#define DECODE_SAMSUNG
//#define DECODE_SONY
//#define DECODE_RC5
//#define DECODE_RC6

//#define DECODE_BOSEWAVE
//#define DECODE_LEGO_PF
//#define DECODE_MAGIQUEST
//#define DECODE_WHYNTER

//#define DECODE_HASH         // special decoder for all protocols


/*
*Für genauere Debugausgaben im seriellen Monitor.
*!Achtung! Benötigt viel Speicher, eventuell müssen andere Funktionen temporär deaktivert werden!
*/
//#define IRREMOTE_PRINT

#endif


//===========================================================================
//============================= ROTARY_ENCODER ==============================
//===========================================================================
/**
*Gibt die Möglichkeit die Lautstärke der Affenbox über eine Drehencoder zu steuern.
*Hierzu wird extra Hardware benötigt.
*z.B.:
*KY-040 Drehwinkelgeber/Drehgeber
*https://www.az-delivery.de/products/drehimpulsgeber-modul?_pos=1&_sid=85bb51922&_ss=r
*/

#define ROTARY_ENCODER  

#if defined ROTARY_ENCODER

/* 
*Angabe der Anschlusspins für den Data und Clock Pin des Drehgebers.
*Es kann jeder freie  Pin geählt werden, auch Analoge.
*Ausgeschlossen sind folgende Pins: 4, 9, 10, A7, sowie bereits durch andere Funktionen vergeneben Pins.
 */
#define ROTARY_ENCODER_PIN_A A1 
#define ROTARY_ENCODER_PIN_B A2  

/* 
*Anzahl erkannter Steps pro Klick des Drehgebers.
*Falls der Wert falsch eingestellt ist, werden eventuell mehr als ein Schritt pro Klick erkannt.
 */
#define ROTARY_ENCODER_STEPS 4

/* 
*Nur verwenden, wenn es unbedingt nötig ist! 
*Die Versorgung des Rotary Encoder kann auch von einem IO Pin kommen.
 */
//#define ROTARY_ENCODER_PIN_SUPPLY 8 

/*
*Für genauere Debugausgaben im seriellen Monitor.
*!Achtung! Benötigt viel Speicher, eventuell müssen andere Funktionen temporär deaktivert werden!
*/
#define ROTARY_ENCODER_PRINT

#endif



//===========================================================================
//===================== POWER_ON_LED(EXPERIMENTEL!!) ========================
//===========================================================================
//--------POWER_ON_LED(EXPERIMENTEL!!)--------
/*
*Gibt die Möglichkeit eine simple Status LED einzufügen.
*Als zusätzliche Funktion, kann diese durch fading den Staus genauer wiedergeben.
*/

//#define POWER_ON_LED    

#if defined POWER_ON_LED

/* 
*Angabe des Anschlusspins für die LED.
*Es kann jeder freie  Pin geählt werden, auch Analoge.
*Ausgeschlossen sind folgende Pins: 4, 9, 10, A7, sowie bereits durch andere Funktionen vergeneben Pins.
 */
#define POWER_ON_LED_PIN 5

//#define FADING_LED 

#endif
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//===========================================================================
//============================= NFCgain =====================================
//===========================================================================
/**
*Um Probleme bei der Erkennung von RFID Tags zu beheben, kann die Verstärkung des RFID Reader/Writer geändert werden.
*Ein unnötiges Hochsetzen der Empfindlichkeit kann ebenfalls zu Problemen bei der Erkennung führen.
*/
//#define NFCgain_max   // Maximale Empfindlichkeit
#define NFCgain_avg   // Mittlere Empfindlichkeit
//#define NFCgain_min   // Minimale Empfindlichkeit


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//===========================================================================
//============================= Debugging ===================================
//===========================================================================
/*
*Aktiviert Standard Debug Ausgaben
*/
//#define DEBUG  

/*
*Aktiviert Shortcut Debug Ausgaben
*/
//#define SHORTCUTS_PRINT

/*
*Aktiviert die Ausgabe der Queue
*/
//#define QUEUE_PRINT 

/*
*Aktiviert DFPlayer Debug Ausgaben
*/ 
//#define DFPLAYER_PRINT

/*
*Aktiviert die Ausgabe des EEPROMS zu beginn
*/
//#define EEPROM_PRINT

Das Hochladen von Markos Affenbox Fork verlief lauf IDE erfolgreich.

Die Konsole bei Baud 115200 gibt folgendes aus:

21:35:14.028 -> Affenbox by Marco Schulz
21:35:14.028 -> forked from TonUINO by Thorsten Voß; licensed under GNU/GPL.
21:35:14.028 -> Information and contribution https://tonuino.de.

Weiterhin keine Reaktion vom Rotatory Encoder KY-040. Ich bin nichtmal fähig die Platine mittels Taster auf dem Encoder aus dem Standby zu holen.

Wo liegt mein Fehler? Oder bin ich schlussendlich doch zu unfähig :sweat_smile:. Ich bitte um Hilfe :blush: LG
A.d.i

Edit: doppelte ** im Code wurden korrigiert

Da du @marco-117’s Fork benutzt, macht es auch Sinn ihn in deiner Frage zu erwähnen… so wird er nämlich benachrichtigt.

Dafür muss der Taster auch mit pbp und pbn verbunden sein. Du verwendest aber gnd. Versuch mal statt gnd pbn zu nehmen

Danke @Gute_Laune, werde ich probieren

LG A.d.i

@Gute_Laune Danke für den Hinweis mit Gnd des KY040 auf PBN :blush:
Jetzt kann ich die AiO mit dem Taster aus dem Standby holen. Dieselbe Funktion hat jetzt auch an die Rotation des Encoders übergeben, sprich ich kann die AiO mit drehen des Encoders (beide Richtungen möglich) und über den Taster aufwecken. Nur schickt sich die AiO wenige Sekunden später wieder in den Stand-by. Immerhin bin ich jetzt einen Schritt weiter :slight_smile: danke

Was das Abspielen über RFID betrifft, kann ich ihm jetzt schon 1 Sekunde spielzeit entlocken bevor er sich wieder schlafen legt.

Und die Konsole gibt auch mehr aus wenn Debug auskommentiert ist

13:27:48.807 ->Affenbox by Marco Schulz
13:27:48.807 -> forked from TonUINO by Thorsten Voß; licensed under GNU/GPL.
13:27:48.807 -> Information and contribution https://tonuino.de.
13:27:48.807 -> 
13:27:49.359 -> Firmware Version: 0x92 = v2.0
13:27:56.546 -> set stby timer
13:27:56.638 -> milis 30787832
13:27:57.926 -> ReadCardSerial fin
13:27:57.973 -> Card UID 
13:27:57.973 ->  72  53  F3  36 
13:27:57.973 -> PICC type MIFARE 1KB
13:27:57.973 -> Authenticating Classic using key A...
13:27:57.973 ->  FF  FF  FF  FF  FF  FF 
13:27:57.973 -> 0
13:27:57.973 -> Read block4
13:27:57.973 -> data on card 
13:27:57.973 -> folder 10
13:27:57.973 -> mode 5
13:27:57.973 -> special 9
13:27:57.973 -> special2 218
13:27:57.973 -> special3 0
13:27:57.973 -> special4 0
13:27:57.973 -> 10
13:27:57.973 -> 10
13:27:57.973 -> new tag
13:27:58.202 -> Audio Book
13:27:58.249 -> 7 mp3 in folder 10
13:27:58.249 -> play mp3 1
13:27:58.479 -> disable stby timer
13:27:58.572 -> Shut Down

Die Configuration, die du ober eingestellt hast, enthält sehr viele *. Sind die in der Arduino-Software auch da? Denn die sollten da nicht sein.

Das hat mir das System beim schreiben im Forum als „Fett“ bezeichnet :sweat_smile:im Code sind die nicht also im Code sind die normal aktiv

Das macht es natürlich sehr schwer, das zu lesen.
Ich zitiere mal aus einem anderen Thema zu AiO und ky-040

Demnach müsstest du entweder die anderen Pins nehmen oder das im Code anpassen. Denn du hast A1 und A2 als Pins für den Encoder in der Software aber ihn an A3 & A4 angeschlossen.

const uint8_t button0Pin = A0;                      // play/pause/power on
const uint8_t button1Pin = A1;                      // prev
const uint8_t button2Pin = A2;                      // next
const uint8_t button3Pin = A3;                      // vol-
const uint8_t button4Pin = A4;                      // vol+

Dieses Thema habe ich schon gesehen, nur ins der Thread mittlerweile 4 Jahre alt, es sind diverse Links down und diese const uint8_t Button-variablen sind im aktuellen Release 2.0.3 gar nicht vorhanden… aber ich sehe gerade da steht deaktiviere FIVEBUTTONS. Bei mir sind die aktiv… :flushed:

Ich versuche es mal mit deaktivieren FIVEBUTTONS

Das ist ein anderes Thema, die Aio gibt es erst seit einem Jahr :wink:
Du kannst ja einfach auf den Titel klicken, dann siehst du, dass es ein relativ neues Thema ist.

selbst mit deaktivierten FIVEBUTTONS verabschiedet sich die Platine nach 2 Sekunden in den Stand-by :frowning_face:

Dasliegt daran das der Pausebuttennals dauerhaft gedrückt erkannt wird.

Entferne mal fürs erste den Pausebutton

Hallo @marco-117, Kabel physische von der Buttonplatine getrennt jetzt läuft die Box

physisch trennen.

(20 Zeichen)

wie verbinde ich dann den Pause/Play-Button?

Da bin ich mir gerade nichr sicher, das musst du testen.

Der Aufbau aus deinem ersten Beitrag hat ja nicht geklappt.

Verbinde wieder den GND am Encoder mit GND an der AiO und versuch mal anstatt den SW am Encoder mit PBP, mit PBN zu verbinden.

Wenn das nicht funktioniert bleiben drei Optionen.

Entweder einen separaten Taster für Pause & AiO Ein

Oder einen seperaten Taster für AiO ein und Pause über den Encoder aber an einem weiteren Pin der AiO angeschlossen.

Oder du nimmst einen Mosfet und schaltest diesen mit dem Encoder und der Mosfet verbindet PBP mit PBN.

Ich kenne die Schaltungsdetails der AiO und dem Pause/Ein Anschluss nicht.
Aber da ist eine Schaltung separate Sxhaltung dahinter die relativ empfindlich reagiert.

Dann bin ich ja erleichtert, :sweat_smile: ich hatte schon an meinen Fähigkeiten gezweifelt. Okay, gut, dann werde ich mich mal als „Patient Zero“ erweisen und mal versuchen den KY040 in Kombination mit der AiO in Gang zu bringen. Ich werde meinen Fortschritt berichten und zum Schluss auch alles dokumentieren, so, dass die Variante mit dem Encoder auch von Laien verständlich ist :slight_smile:

Apropos, ich hätte da noch eine 4. Variante fällt mir gerade ein: was wäre, wenn ich für SW einfach einen der Analogen (A6 oder A7) nehmen würde, werde ich mal testen.

LG und eine schönen Restsonntag

A.d.i

So, jetzt hab ich zumindest mal die Lautstärke auch wenngleich mit viel Bounce

Ich habe folgendes gemacht:

KY-040 GND → GND
+ → 3.3V
SW → A6
DT → V- (Auf der Buttonplatine)
CLK-> V+

Dazu folgendes in der Config.h


//===========================================================================
//================================ All in One ===============================
//===========================================================================
/*
*Bei Verwendung der All in One Baugruppe, (genannt AiO) aktivieren
*https://www.leiterkartenpiraten.de/produkt/tonuino-all-in-one/
*/

#define AiO

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//===========================================================================
//============================= Hardware Features ===========================
//===========================================================================
/** 
*Nachfolgend sind alle möglichen Hardware erweiterungen aufgelistet und die dazugehörigen Konfigurationsmöglichkeiten.
*Um eine Funktion zu aktivieren das entsprechende "#define" auskommentiern. Dazu die beiden "//" davor entfernen.
*Alles weiter steht bei den entsprechenden Punkten
*/

//===========================================================================
//================================= Buttons =================================
//===========================================================================

/** 
 * Konfiguration der Standard Button Pins 
 */
 
/*
 * Versuch A.d.i
 * 
 **/
 #define buttonPause A6
 #define buttonUp A4
 #define buttonDown A3

 //Ende Versuch A.d.i
/**
*Sample All in One
*/
// #define buttonPause A0
// #define buttonUp A4
// #define buttonDown A3

//===========================================================================
//============================= FIVEBUTTONS =================================
//===========================================================================
/**
*Für die Verwendung von fünf Buttons, statt drei.
*/

//Versuch A.d.i
#define FIVEBUTTONS    

#if defined FIVEBUTTONS
/**
 * 
 * Ende Versuch A.d.i
*Sample All in One
*/
//#define buttonFourPin A1
//#define buttonFivePin A2

#endif
//===========================================================================
//============================= PUSH_ON_OFF =================================
//===========================================================================
/** 
*+++Bei AiO standardmäßig aktiv +++
*Ein-/Ausschalten des TonUINO über langen Druck des Pausetasters. 
*Setzt Hardware vorraus, die das Ausschalten unterstüzt,
*z.B.: 
*- Pololu-Switch -> https://discourse.voss.earth/t/pololu-als-power-switch-einsteiger/2099
*- Powerbank mit automatischer Abschaltung -> https://discourse.voss.earth/t/intenso-s10000-powerbank-automatische-abschaltung-software-only/805/5
*/

//#define PUSH_ON_OFF    

#if defined PUSH_ON_OFF

/* 
*Angabe des Anschlusspins für die PUSH_ON_OFF Funktion.
*Ausgeschlossen sind folgende Pins: 4, 9, 10, A7, sowie bereits durch andere Funktionen vergeneben Pins.
 */
#define PUSH_ON_OFF_PIN 7

#endif

//===========================================================================
//============================= SPEAKER_SWITCH ==============================
//===========================================================================
/**
*+++Bei AiO standardmäßig aktiv +++
*Bei verwendung einer externen Lautsprecherschaltung, zur unterdrückung des Einschaltgeräusches,
*sowie des Leerlaufrauschens.
*https://discourse.voss.earth/t/geraeusch-beim-start-der-box-allerdings-nicht-bei-jedem-start/1357/34?u=marco-117 
*/

//#define SPEAKER_SWITCH  

#if defined SPEAKER_SWITCH

/* 
*Angabe des Anschlusspins für den Lautsprecherschalter.
*Es kann jeder freie Ausgang geählt werden.
*Ausgeschlossen sind folgende Pins: 4, 9, 10, A7, sowie bereits durch andere Funktionen vergeneben Pins.*
 */
#define SPEAKER_SWITCH_PIN 8

#endif


//===========================================================================
//============================= ANALOG_INPUT ================================
//===========================================================================
/**
*Gibt die Möglichkeit die Affenbox mit mehreren Tastern über einen analogen Eingang zu steuern.
*Hierzu wird extra Hardware benötigt.
*z.B.:
*TonUINO Button Board (bereits vorkonfiguriert)
*https://www.leiterkartenpiraten.de/produkt/tonuino-button-board-3x3/
*
*Für eigene Aufbauten weitere Informationen:
*https://github.com/bxparks/AceButton/tree/develop/examples/LadderButtons
*
*Bitte beachten: die AiO verwendet andere Referenspegel als der Arduino Nano!
*/

//#define ANALOG_INPUT

#if defined ANALOG_INPUT

/**
*Angabe des Anschlusspins für die analogen Signale.
*Es kann jeder freie analoge Eingagn gewählt werden.
*Ausgeschlossen sind folgende Pins: A7, sowie bereits durch andere Funktionen vergeneben Pins.
 */
#define ANALOG_INPUT_PIN A3

/** 
*Menge der analogen Signale/Buttons.
 */
#define ANALOG_INPUT_BUTTON_COUNT 9

/** 
*Liste der analogen Werte für jeden Button.
*Es muss für jeden Button ein Wert angegeben werden, plus der Wert wenn kein Button gedrückt ist.
*Dieser Nullwert muss an erster Stelle stehen.
*Die hier in der {}-Klammer schon aufgelisteten Werte, sind die Standardwerte für das TonUINO Button Board. Sowohl für die AiO als auch für die klassische Variante. 
*Bei eigenen Aufbauten kann alles in der {}-Klammer gelöscht und ersetzt werden. 
*!!Zur erfassung der Werte hilft "#define ANALOG_INPUT_PRINT"!!
 */
static const uint16_t ANALOG_INPUT_LEVELS[ANALOG_INPUT_BUTTON_COUNT + 1 ] = {
 #if defined AiO  // values for AiO (2,048V reference, 12bit ADC), TU_BB_3x3 v1.0
  0,    //Null
  490,  //Button 1
  945,  //Button 2
  1494,
  1949,
  2480,
  2937,
  3373,
  3691,
  4064  //Button 9
#else// values for Arduino Nano (5V reference, 10bit ADC), TU_BB_3x3 v1.0
  0,
  92,
  194,
  307,
  405,
  512,
  608,
  698,
  773,
  1023
#endif
};

/** 
*Liste der Funktion für jeden analogen Wert.
*Es muss für jeden analogen Wert eine Funktion festgelegt werden, inklusive dem Nullwert.
*Die Reihenfolge der Funktionen muss der Reihenfolge der analogen Werte entsprechen.
*D.h. Analogwert 3 == Funktionswert 3
*
*Die hier in der {}-Klammer schon aufgelisteten Werte, sind die Standardwerte für das TonUINO Button Board. Sowohl für die AiO als auch für die klassische Variante. 
*Bei eigenen Aufbauten kann alles in der {}-Klammer gelöscht und ersetzt werden. 
*
* Folgende Werte können angegeben werden:
   Null                = 0,
   Pause               = 1,
   Next                = 2,
   Next +10            = 4,
   Previous            = 5,
   Previous +10        = 6,
   VolumeUp            = 7,
   VolumeDown          = 8,
   Abort/Shutdown      = 9,
   AdminMenu           = 10,
   Reset Playback Mode = 11,
   Shortcut No.1 to 12 = 12 bis 24
 */
//#define ANALOG_INPUT_SUPPLY_PIN 6 //Nur verwenden, wenn es unbedingt nötig ist!Der Referenzpegel kann auch von einem IO Pin kommen.
static const uint8_t ANALOG_INPUT_BUTTON_MAP[ANALOG_INPUT_BUTTON_COUNT + 1 ] = {
  0,  //Null
  12, //Shortcut No. 1
  13, //Shortcut No. 2
  14, 
  15,
  16,
  17,
  18,
  19,
  20  //Shortcut No. 9
};

/*
*Für genauere Debugausgaben im seriellen Monitor.
*!Achtung! Benötigt viel Speicher, eventuell müssen andere Funktionen temporär deaktivert werden!
*/
//#define ANALOG_INPUT_PRINT

/*
*Gibt die analogen Werte so schnell wieder wie möglich. 
*Falls die analogen Werte der Taste nicht bekannt sind können sie hiermit ermittelt werden.
*/
//#define ANALOG_INPUT_PRINT_ANALOGREAD

#endif

//===========================================================================
//============================= IRREMOTE ====================================
//===========================================================================
/**
*Gibt die Möglichkeit die Affenbox mit einer IR Fernbedienung zu steuern.
*Hierzu wird extra Hardware benötigt.
*z.B.:
*IR Infrarot Remote Receiver / Empfänger TSOP38238 
*https://www.berrybase.de/bauelemente/aktive-bauelemente/leds/infrarot-leds/ir-infrarot-remote-receiver/empf-228-nger-tsop38238

*Infrarot Fernbedienung mit 17 Tasten (bereits vorkonfiguriert)
*https://www.berrybase.de/raspberry-pi/raspberry-pi-computer/eingabegeraete/infrarot-fernbedienung-mit-17-tasten
*/

//#define IRREMOTE

#if defined IRREMOTE

/* 
*Angabe des Anschlusspins für den Data Pin des IR Empfängers.
*Es kann jeder freie digtale Eingang geählt werden.
*Ausgeschlossen sind folgende Pins: 4, 9, 10, sowie bereits durch andere Funktionen vergeneben Pins.
 */
#define IRREMOTE_PIN 6


/*
*Falls das Protokoll der gewünschten Fernbedienung beakannt ist, sollte NUR DAS ENTSPRECHENDE PROTOKOLL auskommentiert werden. 
*Das spart wertovllen Speicher.
*Falls das Protokoll nicht bekannt ist, keines der Prtoolle auskommentiern!
*"#define IRREMOTE_PRINT" hilft bei der identifizierung des Protokolls.
*/
//#define DECODE_DENON        // Includes Sharp
//#define DECODE_JVC
//#define DECODE_KASEIKYO
//#define DECODE_PANASONIC    // the same as DECODE_KASEIKYO
//#define DECODE_LG
#define DECODE_NEC          // Includes Apple and Onkyo
//#define DECODE_SAMSUNG
//#define DECODE_SONY
//#define DECODE_RC5
//#define DECODE_RC6

//#define DECODE_BOSEWAVE
//#define DECODE_LEGO_PF
//#define DECODE_MAGIQUEST
//#define DECODE_WHYNTER

//#define DECODE_HASH         // special decoder for all protocols


/*
*Für genauere Debugausgaben im seriellen Monitor.
*!Achtung! Benötigt viel Speicher, eventuell müssen andere Funktionen temporär deaktivert werden!
*/
//#define IRREMOTE_PRINT

#endif


//===========================================================================
//============================= ROTARY_ENCODER ==============================
//===========================================================================
/**
*Gibt die Möglichkeit die Lautstärke der Affenbox über eine Drehencoder zu steuern.
*Hierzu wird extra Hardware benötigt.
*z.B.:
*KY-040 Drehwinkelgeber/Drehgeber
*https://www.az-delivery.de/products/drehimpulsgeber-modul?_pos=1&_sid=85bb51922&_ss=r
*/

//#define ROTARY_ENCODER   

#if defined ROTARY_ENCODER

/* 
*Angabe der Anschlusspins für den Data und Clock Pin des Drehgebers.
*Es kann jeder freie  Pin geählt werden, auch Analoge.
*Ausgeschlossen sind folgende Pins: 4, 9, 10, A7, sowie bereits durch andere Funktionen vergeneben Pins.
 */
#define ROTARY_ENCODER_PIN_A A1 
#define ROTARY_ENCODER_PIN_B A2  

/* 
*Anzahl erkannter Steps pro Klick des Drehgebers.
*Falls der Wert falsch eingestellt ist, werden eventuell mehr als ein Schritt pro Klick erkannt.
 */
#define ROTARY_ENCODER_STEPS 4

/* 
*Nur verwenden, wenn es unbedingt nötig ist! 
*Die Versorgung des Rotary Encoder kann auch von einem IO Pin kommen.
 */
//#define ROTARY_ENCODER_PIN_SUPPLY 8 

/*
*Für genauere Debugausgaben im seriellen Monitor.
*!Achtung! Benötigt viel Speicher, eventuell müssen andere Funktionen temporär deaktivert werden!
*/
#define ROTARY_ENCODER_PRINT

#endif



//===========================================================================
//===================== POWER_ON_LED(EXPERIMENTEL!!) ========================
//===========================================================================
//--------POWER_ON_LED(EXPERIMENTEL!!)--------
/*
*Gibt die Möglichkeit eine simple Status LED einzufügen.
*Als zusätzliche Funktion, kann diese durch fading den Staus genauer wiedergeben.
*/

//#define POWER_ON_LED    

#if defined POWER_ON_LED

/* 
*Angabe des Anschlusspins für die LED.
*Es kann jeder freie  Pin geählt werden, auch Analoge.
*Ausgeschlossen sind folgende Pins: 4, 9, 10, A7, sowie bereits durch andere Funktionen vergeneben Pins.
 */
#define POWER_ON_LED_PIN 5

//#define FADING_LED 

#endif
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//===========================================================================
//============================= NFCgain =====================================
//===========================================================================
/**
*Um Probleme bei der Erkennung von RFID Tags zu beheben, kann die Verstärkung des RFID Reader/Writer geändert werden.
*Ein unnötiges Hochsetzen der Empfindlichkeit kann ebenfalls zu Problemen bei der Erkennung führen.
*/
//#define NFCgain_max   // Maximale Empfindlichkeit
#define NFCgain_avg   // Mittlere Empfindlichkeit
//#define NFCgain_min   // Minimale Empfindlichkeit


////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


//===========================================================================
//============================= Debugging ===================================
//===========================================================================
/*
*Aktiviert Standard Debug Asugaben
*/
#define DEBUG  

/*
*Aktiviert Shortcut Debug Ausgaben
*/
//#define SHORTCUTS_PRINT

/*
*Aktiviert die Ausgabe der Queue
*/
//#define QUEUE_PRINT 

/*
*Aktiviert DFPlayer Debug Ausgaben
*/ 
//#define DFPLAYER_PRINT

/*
*Aktiviert die Ausgabe des EEPROMS zu beginn
*/
//#define EEPROM_PRINT

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

und in der Affenbox.h alle ButtonFour und ButtonFive auskommentiert

#include <Arduino.h>
#include "Configuration.h"
#include <DFMiniMp3.h>
#include <EEPROM.h>
#include <JC_Button.h>
#include <AceButton.h>
#include <MFRC522.h>
#include <SPI.h>
#include <SoftwareSerial.h>
#if not defined AiO
#include <avr/sleep.h>
#endif
#if defined ROTARY_ENCODER
#define ENCODER_DO_NOT_USE_INTERRUPTS
#include <Encoder.h>
#endif
#if defined IRREMOTE
#include <IRremote.h>
#endif
#if defined AiO
#include "Emulated_EEPROM.h"
#endif

using ace_button::AceButton;
using ace_button::ButtonConfig;
using ace_button::LadderButtonConfig;

///////// General globals ////////////////////////////////////////////////
unsigned long sleepAtMillis = 0;

static const uint8_t openAnalogPin = A7; //Default A7, muss ein unbelegeter, analoger Eingang sein
//////////////////////////////////////////////////////////////////////////

////////// Button timings ////////////////////////////////////////////////
static const uint8_t SHORT_PRESS = 50;
static const uint16_t LONG_PRESS = 750;
static const uint16_t LONGER_PRESS = 1500;
//////////////////////////////////////////////////////////////////////////

///////// MFRC522 ////////////////////////////////////////////////////////
static const uint8_t RST_PIN = 9;                 // Configurable, see typical pin layout above
static const uint8_t SS_PIN = 10;               // Configurable, see typical pin layout above
MFRC522 mfrc522(SS_PIN, RST_PIN); // Create MFRC522
MFRC522::MIFARE_Key key;
bool successRead;
uint8_t sector = 1;
uint8_t blockAddr = 4;
uint8_t trailerBlock = 7;
MFRC522::StatusCode status;
//////////////////////////////////////////////////////////////////////////

///////// card cookie ////////////////////////////////////////////////////
static const uint32_t cardCookie = 322417479;
//////////////////////////////////////////////////////////////////////////
#if defined AiO
static const uint16_t EEPROM_size = 512;
#endif
static const uint16_t EEPROM_settingsStartAdress = 1;

#if defined ANALOG_INPUT
static const uint8_t availableShortCuts = 3 + ANALOG_INPUT_BUTTON_COUNT; //Die Anzahl Inputs einer 3x4 Matrix oder eines 0-9,#,* Tastenfeldes
#else
static const uint8_t availableShortCuts = 3 ; //
#endif
///////// setup buttons //////////////////////////////////////////////////
Button pauseButton(buttonPause);
Button upButton(buttonUp);
Button downButton(buttonDown);
#if defined FIVEBUTTONS
//Button buttonFour(buttonFourPin);
//Button buttonFive(buttonFivePin);
#endif
//////////////////////////////////////////////////////////////////////////

enum Enum_Trigger {
  NoTrigger = 0,
  PauseTrackTrigger,
  NextTrigger,
  NextPlusTenTrigger,
  PreviousTrigger,
  PreviousPlusTenTrigger,
  VolumeUpTrigger,
  VolumeDownTrigger,
  AbortTrigger,
  AdminMenuTrigger,
  ResetTrackTrigger,
  ShortcutTrigger //muss an letzter Stelle stehen bleiben!
};

struct inputTrigger {
  bool noTrigger;
  bool pauseTrack;
  bool next;
  bool nextPlusTen;
  bool previous;
  bool previousPlusTen;
  bool volumeUp;
  bool volumeDown;
  bool cancel;
  bool adminMenu;
  bool resetTrack;
  bool shortCutNo [availableShortCuts]; //muss an letzter Stelle stehen bleiben!
};

static inputTrigger myTrigger;
static inputTrigger myTriggerEnable;

static const uint8_t sizeOfInputTrigger = sizeof(inputTrigger);

#if defined AiO
const uint8_t folderMemoryCount = 3; //limited EEPROM space for the LGT8F328P
#else
const uint8_t folderMemoryCount = 5;
#endif

//////// IR Remote ////////////////////////////////////////////////////
#if defined IRREMOTE
const uint8_t irRemoteCodeCount = sizeOfInputTrigger;
#endif
//////////////////////////////////////////////////////////////////////////

//////// Rotary Encoder ///////////////////////////////////////////////
#if defined ROTARY_ENCODER
Encoder myEnc(ROTARY_ENCODER_PIN_A, ROTARY_ENCODER_PIN_B);
#endif
//////////////////////////////////////////////////////////////////////////

///////// DFPlayer Mini //////////////////////////////////////////////////
SoftwareSerial mySoftwareSerial(2, 3); // RX, TX
static const uint8_t busyPin = 4;
uint8_t numTracksInFolder;
uint8_t currentTrack;
uint8_t firstTrack;
uint8_t queue[255];
uint8_t volume;
static uint8_t _lastTrackFinished;
//////////////////////////////////////////////////////////////////////////

//////// analog input /////////////////////////////////////////////////
#if defined ANALOG_INPUT
static AceButton analogInputButtons[ANALOG_INPUT_BUTTON_COUNT];
static AceButton* analogInputButtonsPointer[ANALOG_INPUT_BUTTON_COUNT];
LadderButtonConfig *analogInputButtonConfig;
#endif
//////////////////////////////////////////////////////////////////////////

///////// Enums //////////////////////////////////////////////////////////
enum Enum_PlayMode
{
  AudioDrama = 1,
  Album = 2,
  Party = 3,
  Single = 4,
  AudioBook = 5,
  AdminMenu = 6,
  AudioDrama_Section = 7,
  Album_Section = 8,
  Party_Section = 9,
  AudioBook_Section = 10,
  PuzzlePart = 11
};
enum Enum_Modifier
{
  ModifierMode = 0,
  SleepTimerMod = 1,
  FreezeDanceMod = 2,
  LockedMod = 3,
  ToddlerModeMod = 4,
  KindergardenModeMod = 5,
  RepeatSingleMod = 6,
  PuzzleGameMod = 7,
  QuizGameMod = 8,
  ButtonSmashMod = 9,
  //TheQuestMod,
  CalculateMod = 10,
  AdminMenuMod = 255
};

enum Enum_AdminMenuOptions
{
  Exit = 0,
  ResetCard,
  MaxVolume,
  MinVolume,
  InitVolume,
  EQ,
  SetupShortCuts,
  SetupStandbyTimer,
  CreateFolderCards,
  InvertButtons,
  StopWhenCardAway,
  SetupIRRemote,
  ResetEEPROM,
  LockAdminMenu
};
enum Enum_PCS
{
  PCS_NO_CHANGE     = 0, // no change detected since last pollCard() call
  PCS_NEW_CARD      = 1, // card with new UID detected (had no card or other card before)
  PCS_CARD_GONE     = 2, // card is not reachable anymore
  PCS_CARD_IS_BACK  = 3 // card was gone, and is now back again
};

enum Enum_NfcGain
{
  minimum = 0,
  average = 1,
  maximum = 2
};
//////////////////////////////////////////////////////////////////////////

///////// this object stores nfc tag data ///////////////////////////////
struct folderSettings {
  uint8_t folder;
  uint8_t mode;
  uint8_t special; //von
  uint8_t special2; //bis
  uint8_t special3; //Trackmemory
  uint8_t special4;
};
folderSettings *myFolder;
folderSettings shortCuts[availableShortCuts];

uint8_t sizeOfFolderSettings = sizeof(folderSettings);

struct nfcTagObject {
  uint32_t cookie;
  uint8_t version;
  folderSettings nfcFolderSettings;
};
nfcTagObject myCard;
//////////////////////////////////////////////////////////////////////////

///////// admin settings stored in eeprom ///////////////////////////////
struct adminSettings {
  uint32_t cookie;
  byte version;
  uint8_t maxVolume;
  uint8_t minVolume;
  uint8_t initVolume;
  uint8_t eq;
  bool locked;
  unsigned long standbyTimer;
  bool invertVolumeButtons;
  uint8_t adminMenuLocked;
  folderSettings savedModifier;
  bool stopWhenCardAway;
  uint8_t userAge; // Reserviert für zukünftige Funktion
  uint16_t irRemoteUserCodes[sizeOfInputTrigger];//Ein Slot pro möglichem Trigger
};
adminSettings mySettings;
uint16_t sizeOfAdminSettings = sizeof(adminSettings);
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
static bool hasCard = false;
static byte lastCardUid[4];
static byte retries;
static bool lastCardWasUL;
static bool knownCard = false;
static int8_t activeShortCut = -1;
static uint8_t trackToStoreOnCard = 0;
//////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////
void shuffleQueue(uint8_t startTrack = firstTrack, uint8_t endTrack = numTracksInFolder);
void writeSettings();
void getSettings();
void resetShortCuts();
void writeShortCuts();
void getShortCuts();
void updateShortCutTrackMemory();
void resetSettings();
void playFolder();
void activateShortCut (uint8_t shortCutNo);
static void nextTrack(uint8_t track, bool force = false) ;
static void previousTrack() ;
bool isPlaying();
void mp3Pause(uint16_t delayTime = 100);
void waitForTrackToFinish (bool interruptByTrigger = true, uint16_t timeOut = 5000);
void waitForTrackToStart(uint16_t timeOut = 5000);
void setup();
void readButtons();
#if defined IRREMOTE
void readIr ();
#endif
#if defined ANALOG_INPUT
void readAnalogIn(AceButton* button, uint8_t eventType, uint8_t buttonState);
#endif
#if defined ROTARY_ENCODER
void RotEncSetVolume ();
#endif
void checkNoTrigger ();
void readTrigger(bool invertVolumeButtons = false);
void resetTrigger();
void resetTriggerEnable();
void volumeUpAction(bool rapidFire = false);
void volumeDownAction(bool rapidFire = false);
void nextAction() ;
void previousAction();
void pauseAction();
void loop();
void adminMenu(bool fromCard = false);
uint8_t voiceMenu(int16_t numberOfOptions, uint16_t startMessage, int messageOffset,
                  bool preview = false, uint8_t previewFromFolder = 0, int defaultValue = 0,
                  bool enableSkipTen = false);
bool setupFolder(folderSettings * theFolder) ;
void setupShortCut(int8_t shortCutNumber = -1);
void setupCard();
bool readCard(nfcTagObject * nfcTag);
void resetCard() ;
void writeCard(nfcTagObject nfcTag, int8_t writeBlock = -1, bool feedback = true) ;
void dump_byte_array(byte * buffer, byte bufferSize) ;
bool setupModifier(folderSettings * tmpFolderSettings);
bool SetModifier (folderSettings * tmpFolderSettings);
bool RemoveModifier();
void writeCardMemory (uint8_t track, bool announcement = false);
void checkForUnwrittenTrack  ();
byte pollCard();
Enum_PCS handleCardReader();
void onNewCard();
void setstandbyTimer();
void disablestandbyTimer();
void checkStandbyAtMillis();
void shutDown();
#if defined FADING_LED
void fadeStatusLed(bool isPlaying);
#endif
//////////////////////////////////////////////////////////////////////////
class Mp3Notify;

static DFMiniMp3<SoftwareSerial, Mp3Notify> mp3(mySoftwareSerial);

Anmerkung: PBP und PBN muss einmalig gebrückt werden um die AiO aufzuwecken

Ich kann jetzt sobald eine RFID aufliegt mit dem Taster des KY040 die Musik anhalten/starten
und die Lautstärke erhöhen verringern (sehr großer Bounce aber OK)

Konsole

Affenbox by Marco Schulz
forked from TonUINO by Thorsten Voß; licensed under GNU/GPL.
Information and contribution https://tonuino.de.

Firmware Version: 0x92 = v2.0
set stby timer
milis 30787833
ReadCardSerial fin
Card UID 
 B2 0A  28  B2 
PICC type MIFARE 1KB
Authenticating Classic using key A...
 FF  FF  FF  FF  FF  FF 
0
Read block4
data on card 
folder 12
mode 5
special 26
special2 45
special3 3
special4 0
12
12
new tag
Audio Book
18 mp3 in folder 12
play mp3 3
disable stby timer
pause
set stby timer
milis 30816016
play
disable stby timer
vol up 19
vol down 18
vol up 19
vol down 18
vol up 19
vol down 18
vol up 19
vol down 18
vol up 19
vol down 18
vol down 17
vol up 18
vol down 17

Dafür kann ich das aktuelle Kapitel nicht wechseln
also < und > auf der Buttonplatine sind funktionslos

Button Four und Five sind zwingend notwendig um vor und zurück zu verwenden.
Du musst sie wenn dann nur ind deConfiguration.h aktivieren /deaktivieren, über das define FIVEBUTTON.

Für das bouncen müsste es ebenfalls einen Parameter geben, such ihn dir raus