Buttons um Ordner direkt abzuspielen

Danke für den Link, ich hab noch dutzende micro Taster da, bei gelegenheit mach ich mir mal eine Tastatur.

Mein Fork ist jetzt angepasst.
Du kannst Konfigurieren, wie der Aufbau deines Tastenfelds ist. Ich gehe immer davon aus, das alle Widerstände gleich groß sind. Du musst dann folgende #define konfigurieren:

#define ROTARY_SWITCH_PIN  A6
//#define ROTARY_SWITCH_SUPPLY_PIN 6
#define ROTARY_SWITCH_POSITIONS 10
#define ROTARY_SWITCH_TOLERNACE 0.15
#define ROTARY_SWITCH_REF_VOLTAGE 5.0
#define ROTARY_SWITCH_RES_TO_GND 1 //Anzahl Widerstände zwischen der erten Stufe und GND
#define ROTARY_SWITCH_RES_TO_VCC 1 //Anzahl Widerstände zwischen der letzten Stufe und VCC
 const  float RotSwStepMin = (ROTARY_SWITCH_REF_VOLTAGE/(ROTARY_SWITCH_POSITIONS+ROTARY_SWITCH_RES_TO_GND+ROTARY_SWITCH_RES_TO_GND)) - ((ROTARY_SWITCH_REF_VOLTAGE/(ROTARY_SWITCH_POSITIONS+ROTARY_SWITCH_RES_TO_GND+ROTARY_SWITCH_RES_TO_VCC))*ROTARY_SWITCH_TOLERNACE);
 const  float RotSwStepMax = (ROTARY_SWITCH_REF_VOLTAGE/(ROTARY_SWITCH_POSITIONS+ROTARY_SWITCH_RES_TO_GND+ROTARY_SWITCH_RES_TO_VCC)) + ((ROTARY_SWITCH_REF_VOLTAGE/(ROTARY_SWITCH_POSITIONS+ROTARY_SWITCH_RES_TO_GND+ROTARY_SWITCH_RES_TO_VCC))*ROTARY_SWITCH_TOLERNACE);
#define ROTARY_SWITCH_TRIGGER_TIME 2000

Lass dich von dem Rotary Switch nicht irritieren, dass muss ich noch umbenennen.
Wichtig für dich, sind die Anzahl der Positions = anzahl Buttons.
Res to GND und Res to VCC, geben die Anzahl der Widerstände vor und nach deinen Tastern an.
Auch anzupassen ist die Trigger Time, die gibt in ms an, wie lange der Taster gedrückt sein muss, damit er angenommen wird, bei einem Tastenfeld, würde ich die auf 0-100 oder so stellen.

Die Shortcuts zu den stern musst su im Adminmeü einzeln einstellen. Wenn du die Alben mit Speicher konfigurierst, wunder dich nicht über die Ansage ob der Modifier bei Neustart aktiv sein soll. Das soll eigentlich heißen „Wollen Sie eine Speicherplatz festlegen“.

Wenn du meinen Fork aufspielst, dann lösche bitte einmal den EEPROM und aktualisier den mp3 und advert Ordner.

Falls dich weitere Features interressieren, kannst du mich gerne anschreiben, bei Problemen auch.
Der Angepasste Fork ist noch nicht in allen Bereichen getstet, ich habe darin ein paar weiter Sachen begonnen. Das sollte dich aber nicht tangieren.

Hier liegt mein Fork, bitte den develop branch nehmen, der Link sollte aber direkt dahin führen.

Grossartig! Bin ein wenig am testen. Scheitere jedoch bei der „Tolerance“ oder evtl res to gnd. und res to vcc.
Da ich im Moment nur das RoboDyn Keypad zum testen habe und ich nicht exakt die Werte kenne, ist es schwierig.
Aber ich bekomme jedoch schon mal was im Serial Monitor, dass ich Tasten gedrückt habe. Wieso ist eigentlich der switsch_trigger_time so hoch?

Vermutlich weil @marco-117 mit dem Rotary Switch getestet hat und er sonst sehr hektisch drehen muss. Deshalb hat er dir geraten die Zeit zu verkürzen

OK… Too late then. Danke für die Klärung

res to vcc/gnd gibt nur die anzahl Widerstände an, nicht deren Wert.
Vorausgesetzt, diese Widerstände sind so groß wie die zwischen den Tastern.

Der Tolerance Wert kann erstmal so stehen bleiben.
Das wird erst relevant, wenn die Toleranz so groß ist, das du Überlappungen hast.

Also du drückst einen Taster und mal der eine Ordner spielt, mal der andere.

Hast du einen Link zu der Tatstaur?

Keypad

Die hattest du schon gepostet, oder?
Entschuldige meine Unaufmerksamkeit.

Die Tatstaur ist nicht symmetrisch, hab mich kurz eingelesen.

Hab auch eine Bib zu der gefunden, die Methide zur Auswertung kann ich da raus kopieren.
Dann nehmnuch das als #define Auswahl rein.

:innocent:

Das hätte ich nie rausgefunden. Aber bitte keine zu grossen Umstände.
Das ist ja nur eine Testtastatur.

das hat mich jetzt 5min gekostet.
Also der Rede nicht wert.

Die Funktionsergänzung wird einfach sein, ich muss nur meine, mit der neuen, schon vorhandenen, ersetzen.

hab den develop branch angepasst, sodass die Robotdyn Tastatur laufen sollte.
Bei Gelegenheit mach ich das alles noch etwas universeller.
Auch die Bennenung ist nich nicht ideal.

Aver für deine Zwecke müsdte das passen.
Du musst nur das define ROBOTDY_3X4 zusammen mit dem Rotary Switch aktivieren

Update
Hab eben doch nich schnell die Namen angepasst zu Analog Input.

Update 2:
hatte den Syntaxcheck nicht richtig laufen lassen…Fehler ist jetzt behoben und ich habe die defines in eine extra Datei „Configuration.h“ ausgelagert. Dort müsssen nun alle relvanten Einstellunge gemacht werden.

1 Like

Ich hab mir mal ein kleines Developer Board mit verschiedenen Eingabemöglichkeiten für die AiO gebaut, da sie jetzt die Grenzen festlegt für weitere Entwicklungen an meinem Fork.

Ich hab hier eine 4x4 Tastatur, eine IR Empfänger, einen Rotary Switch, einen Drehschalter und die typischen 5 Tasten.

Drehschalter, IR und Matrix werden alle gleichermaßen mit den Schortcuts belegt.
Die Matrix sollte sogar Tastenkombinationen ermöglichen von 2 Tasten.

1 Like

Moin Marco

Hab mir jetzt 10 Tasten mit 12 Widerständen á 1kOhm nach dem sugpanischen Vorbild zusammen gebaut und deinen Fork installiert. So richtig klappt die Zuordnung aber noch nicht, Taste 2 und 9 funktionieren… ich hab die alte Platine mit dem Nano und bekomme aber die Debug Funktion wegen Speichermangel nicht aktiviert. Hast Du zufällig einen Testcode der die gemessenen Analog Werte inkl. der Tastennummer über die Konsole ausgibt?

Gruß
Papa

Kannst du mir sagen welchen Branch du benutzt? master oder develop?
Ich bräuchte auch einen Auszug der #defines

Das ist mir erst Mal egal, ich wüsste nur gerne ob alle zehn Tasten wie gewünscht funktionieren, bzw, warum nicht. Aber „blind“ die Werte einzustellen, ist irgendwie blöd. Ich schätze es liegt an der „TOLERNACE“ (soll wohl tolerance" heißen?)

Hab jetzt aktuell die develop drauf. Aber wie gesagt, den „Drehschalter“ und Debug zusammen passt nicht in den Speicher.

    //#define AiO

/////!! NICHT ENTFERNEN!!/////
#if not defined AiO
#define VERSION_TONUINO 2.1
#else
#define VERSION_TONUINO 2.2
#endif
//////////////////////////////

//#define FIVEBUTTONS 
//#define DEBUG           //Debug Ausgaben in der Konsole
#define DEBUG_QUEUE   //Debug Ausgabe der Queue
//#define EEPROM_DELETE //Löscht den EEPROM bei jedem Start

#define PUSH_ON_OFF     //Ein Ausschalten des TonUINO //mit AiO nicht mehr nötig, da standardmäßig vorhanden
#define SPEAKER_SWITCH  //mit AiO nicht mehr nötig, da standardmäßig vorhanden
//#define POWER_ON_LED
//#define FADING_LED    //nur in Verbindung mit POWER_ON_LED

#if not defined AiO     //!Folgende Funktionen sind noch nicht für die AiO frei gegeben!
#define ANALOG_INPUT  //old ROTARY_SWITCH
//#define ROTARY_ENCODER
//#define ROBOTDYN_3X4  //Ersetzt die Auswertung des ANALOG_INPUT, durch eine für die Robotdyn 3x4 Matrixtastatur angepasste. ANALOG_INPUT muss zusätzlich aktiviert sein!
//#define IRREMOTE
#endif
//////////////////////////////////////////////////////////////////////////

///////// conifguration of the input and output pins //////////////////////
#define buttonPause A0 //Default A0; Pocket A2
#define buttonUp A1 //Default A1; AiO A2; Pocket A0
#define buttonDown A2 //Default A2; AiO A1; Pocket A1
#define busyPin 4

#define shutdownPin 7 //Default 7; AiO 7

#define openAnalogPin A7 //Default A7, muss ein unbelegeter, analoger Eingang sein

#ifdef FIVEBUTTONS
#define buttonFourPin A4 //Default A3; AiO A4
#define buttonFivePin A3 //Default A4; AiO A3
#endif

#define RST_PIN 9                 // Configurable, see typical pin layout above
#define SS_PIN 10                 // Configurable, see typical pin layout above

#if defined SPEAKER_SWITCH || defined AiO
#define SpeakerOnPin 8
#endif

#ifdef POWER_ON_LED
#define PowerOnLEDPin 6
#endif

#ifdef ANALOG_INPUT
#define ANALOG_INPUT_PIN  A4
//#define ANALOG_INPUT_SUPPLY_PIN 6 //Der Referenzpegel kann auch von einem freien Output Pin kommen
#endif

#if defined IRREMOTE
#define irReceiverPin 5                    // pin used for the ir receiver
#endif

#ifdef ROTARY_ENCODER
#define ROTARY_ENCODER_PIN_A 5 //Default 5; 
#define ROTARY_ENCODER_PIN_B 6 //Default 6; 
// #define ROTARY_ENCODER_PIN_SUPPLY 8 //uncomment if you want to use an IO pin as supply
#endif
//////////////////////////////////////////////////////////////////////////

////////// Button timings ////////////////////////////////////////////////
#define LONG_PRESS 1000
#define LONGER_PRESS 2000
#define LONGEST_PRESS 5000
//////////////////////////////////////////////////////////////////////////

////////// NFC Gain //////////////////////////////////////////////////////
//#define NFCgain_max   // Maximale Empfindlichkeit
#define NFCgain_avg   // Mittlere Empfindlichkeit
//#define NFCgain_min   // Minimale Empfindlichkeit
//////////////////////////////////////////////////////////////////////////

///////// conifguration of the rotary encoder ////////////////////////////
#ifdef ROTARY_ENCODER
#define ROTARY_ENCODER_STEPS 4
#endif
//////////////////////////////////////////////////////////////////////////

///////// conifguration of the analog input ////////////////////////////
#ifdef ANALOG_INPUT
#define ANALOG_INPUT_POSITIONS 10
#define ANALOG_INPUT_TOLERNACE 0.10
#define ANALOG_INPUT_REF_VOLTAGE 5.0
#define ANALOG_INPUT_RES_TO_GND 1 //Anzahl Widerstände zwischen der erten Stufe und GND
#define ANALOG_INPUT_RES_TO_VCC 1 //Anzahl Widerstände zwischen der letzten Stufe und VCC
#define ANALOG_INPUT_TRIGGER_TIME 50
#endif
//////////////////////////////////////////////////////////////////////////

Ach, wo ich Dich grad „am Rechner“ hab, was genau war noch Mal :

#define openAnalogPin A7 //Default A7, muss ein unbelegeter, analoger Eingang sein

Danke für deinen Support!

Ich habe keine Möglichkeit eingebaut die Analogwerte aus zu lesen.
Ich arbeite daran, die Analogen eingänge über das Adminmenü mit einem Befehl zu verknüpfen, völlig unabhängig von defines. Das dauert aber noch etwas.

Bis dahgin, bleibt dir nur mit einem Multimeter oder einem eigenen Test sketch, deinen Aufbau zu prüfen.

Kannst du eine Skizze von deinem Aufbau posten? Also einen Schaltplan und eventuell auch ein Bild? Dann kann ich dir die #defines geben, die passen sollten.

Danke für den Hinweis mit TOLERANCE, das ist natürlich falsch geschrieben in meiner Software.

A7 dient der ermittlung eines Random wertes für den Party oder Hörspielmodus. Der muss offen sein damit er floatet und zufällige Werte ausspuckt.

image

Wie gesagt, ich habe mich an diesen Schaltplan gehalten, aber statt der 3,3k habe ich 1k verwendet. Kann ich irgendwie auch „schnell“ die Buttons 1 bis 10 den Ordnern 1 bis 10 zuordnen ohne mich zig Mal durch das Admin Menü zu klicken?

Ich schau Mal ob ich einen Sketch auf die Reihe bekomme um die analogen Werte auszulesen. Vielleicht komme ich dann dem Problem auf die Spur.

Du könntest deine Wunschwerte in der Softare als Default werte setzen. Hier werden die Default werte gesetzt die bei einem EEPROM Reset geschrieben werden. Unter #define ANALOG_INPUT werden die Werte für die Slots auf 0 gesetzt. Du kannst jetzt jeden Slot mit den Werten befüllen, die auch auf die Karten geschrieben werden würden.
Du kannst die for-Schleife drin lassen und darunter, nur die Werte setzen, die relevant sind. Falls dir das zu kryptisch ist, schick mir doch per PN eine Liste mit den Ordnern & Modus.

void resetSettings() {
#if defined DEBUG
  Serial.println(F("reset EEPROM"));
#endif
  mySettings.cookie = cardCookie;
  mySettings.version = 2;
  mySettings.maxVolume = 25;
  mySettings.minVolume = 1;
  mySettings.initVolume = 18;
  mySettings.eq = 1;
  mySettings.locked = false;
  mySettings.standbyTimer = 0;
#if defined AiO
  mySettings.invertVolumeButtons = false;
#else
  mySettings.invertVolumeButtons = true;
#endif
  mySettings.shortCuts[0].folder = 0;
  mySettings.shortCuts[1].folder = 0;
  mySettings.shortCuts[2].folder = 0;
  mySettings.adminMenuLocked = 0;
  /* mySettings.adminMenuPin[0] = 1;
    mySettings.adminMenuPin[1] = 1;
    mySettings.adminMenuPin[2] = 1;
    mySettings.adminMenuPin[3] = 1;*/
  mySettings.savedModifier.folder = 0;//Default: 0
  mySettings.savedModifier.special = 0;//Default: 0
  mySettings.savedModifier.special2 = 0;//Default: 0
  mySettings.savedModifier.mode = 0;//Default: 0
  mySettings.stopWhenCardAway = false;
#if defined ANALOG_INPUT
  for (uint8_t i = 0; i <= ANALOG_INPUT_POSITIONS - 1; i++) {
    mySettings.anaInSlots[i].folder = 0;
    mySettings.anaInSlots[i].mode = 0;
    mySettings.anaInSlots[i].special = 0;
    mySettings.anaInSlots[i].special2 = 0;
    mySettings.anaInSlots[i].special3 = 0;
    mySettings.anaInSlots[i].special4 = 0;
  }
#endif
  for (uint8_t i = 0; i <= sizeof(myTrigger) - 1; i++) {
    mySettings.irRemoteUserCodes[i] = 0;
  }
  writeSettingsToFlash();
}

Deine #defines sehen im übrigen passend aus.

Ja, mit dem Code komme ich leider nicht klar. Mir würde es wie gesagt reichen, wenn die Tasten 1 bis 10 mit den Ordnern 001 bis 010 im Hörspielmodus belegt werden. Dann kann ich weiter testen.
Soll ich die Tolerance lieber erhöhen oder verkleinern? Was genau besagt der Wert?

Ich verstehe leider nicht wie dein Code funktioniert. Ich hatte bei einem anderen Projekt Mal vier Tasten an einem analogen Port und da musste ich zuerst für jede Taste den Wert ermitteln und dann im Sketch einen Bereich deklarieren innerhalb dessen die Tasten 1 bis 4 auslösen sollen. Dein Code scheint aber universell zu sein, egal wie viele Tasten ich anschließe?

Gruß
Papa - der jetzt langsam ins Bett muss.

ja ich habe das universell gestaltet, solange der Teiler aus gleichen Widerständen besteht.

Ich teile die ANALOG_INPUT_REF_VOLTAGE Spannung durch ANALOG_INPUT_POSITIONS + ANALOG_INPUT_RES_TO_GND + ANALOG_INPUT_RES_TO_VCC

auf jeden Wert wird +/- ANALOG_INPUT_TOLERNACE gerrechnet. Der Wert ist in Prozent/100 angegeben.

Wenn ANALOG_INPUT_TOLERNACE zu hoch ist schieden sich eventuell die Werte der einzelnen Schritte. Zu niedrig kann es passieren das der Wert nicht erkannt wird.

Wenn du Ordner 1-10 je im Hörbuch nutzen willst musst du den Code wie folgt anpassen und einemal den EEPROM Reseten. Über das Menü oder all drei Tasten bei Start gedrückt halten.

void resetSettings() {
#if defined DEBUG
  Serial.println(F("reset EEPROM"));
#endif
  mySettings.cookie = cardCookie;
  mySettings.version = 2;
  mySettings.maxVolume = 25;
  mySettings.minVolume = 1;
  mySettings.initVolume = 18;
  mySettings.eq = 1;
  mySettings.locked = false;
  mySettings.standbyTimer = 0;
#if defined AiO
  mySettings.invertVolumeButtons = false;
#else
  mySettings.invertVolumeButtons = true;
#endif
  mySettings.shortCuts[0].folder = 0;
  mySettings.shortCuts[1].folder = 0;
  mySettings.shortCuts[2].folder = 0;
  mySettings.adminMenuLocked = 0;
   mySettings.adminMenuPin[0] = 1;
    mySettings.adminMenuPin[1] = 1;
    mySettings.adminMenuPin[2] = 1;
    mySettings.adminMenuPin[3] = 1;
  mySettings.savedModifier.folder = 0;//Default: 0
  mySettings.savedModifier.special = 0;//Default: 0
  mySettings.savedModifier.special2 = 0;//Default: 0
  mySettings.savedModifier.mode = 0;//Default: 0
  mySettings.stopWhenCardAway = false;
#if defined ANALOG_INPUT
  for (uint8_t i = 0; i <= ANALOG_INPUT_POSITIONS - 1; i++) {
    mySettings.anaInSlots[i].folder = 0;
    mySettings.anaInSlots[i].mode = 0;
    mySettings.anaInSlots[i].special = 0;
    mySettings.anaInSlots[i].special2 = 0;
    mySettings.anaInSlots[i].special3 = 0;
    mySettings.anaInSlots[i].special4 = 0;
  }
for (uint8_t i = 0; i <=10; i++) {
mySettings.anaInSlots[i].folder = i+1; 
mySettings.anaInSlots[i].mode = AudioDrama;
}
#endif
  writeSettingsToFlash();
}