Tonoino für die Kita

Vergiss die Widerstände nicht mit zu bestellen.

Staffelpreis beachten! Ab 100 Stk 0,019€/Stk

Update:
Das Material kam, ich hoffe ich kann es bald testen.

Update2:

Das Programm läuft!
Ich habe es wie folgt umgesetzt:
Grundlegend werden der verwendete Pin, Parameter wie Anzahl Stellungen des Schalters und Schwellwerte die eine Schrittänderung erkennen, über #defines festgelegt.

#define ROTARY_SWITCH_PIN  A3
#define ROTARY_SWITCH_POSITIONS 12
#define ROTARY_SWITCH_TOLERNACE 0.15
#define ROTARY_SWITCH_REF_VOLTAGE 5.0
#define ROTARY_SWITCH_STEP_MIN ((ROTARY_SWITCH_REF_VOLTAGE/ROTARY_SWITCH_POSITIONS) - ((ROTARY_SWITCH_REF_VOLTAGE/ROTARY_SWITCH_POSITIONS)*ROTARY_SWITCH_TOLERNACE))
#define ROTARY_SWITCH_STEP_MAX ((ROTARY_SWITCH_REF_VOLTAGE/ROTARY_SWITCH_POSITIONS) + ((ROTARY_SWITCH_REF_VOLTAGE/ROTARY_SWITCH_POSITIONS)*ROTARY_SWITCH_TOLERNACE))

Dann benötigt es ein paar globale Variablen, darunter ein Array, in dem alle Daten wie auf den RFID Karten abgelegt sind. Sowie ein Enum, der lesbarkeithalber.

uint8_t RotSwCurrentPos = 0;

typedef enum Enum_PlayMode
{
  Hoerspiel_1 = 1,
  Album_2 = 2,
  Party_3 = 3,
  Einzel_4 = 4,
  Hoerbuch_5 = 5,
  Hoerspiel_von_bis_7 = 7,
  Album_von_bis_8 = 8,
  Party_von_bis_9 = 9,
};

//Array Slot [x,0] = Folder No., Array[x,1] = Play Mode, Array[x,2] = Special, Array[x,3] = Special2.
uint8_t RotSwMap [ROTARY_SWITCH_POSITIONS][4];

Im „void setup()“ muss das Array mit Werten gefüllt werden, die interne Spannungsreferenz gesetzt und die aktuelle Schalterstellun gelesen werden.

Hier wird es interressant.
Man muss das Array so befüllen, wie die RFID Karten.
Man schreibt in

  • RotSwMap[x][0] die Nummer des Ordners
  • RotSwMap[x][1] den Abspielmodus, hier kann man die Enumwerte verwenden, zur lesbarkeit
  • RotSwMap[x][2] den Special Wert, je nach Modus steht hier der Einzeltrack oder bei „von bis“ der von-Track
  • RotSwMap[x][3] den Special2 alias „bis“-Wert
    „x“ steht für die Position des Schalters.

Lasst euch durch die Werte in dem Beispiel nicht verwirren, das kommt aus meine Fork, in dem schon einiges ergänzt wurde.

    analogReference(DEFAULT);

      // Enum_PlayMode
      //        Hoerspiel_1 = 1,
      //        Album_2 = 2,
      //        Party_3 = 3,
      //        Einzel_4 = 4,
      //        Hoerbuch_5 = 5,
      //        Hoerspiel_von_bis_7 = 7,
      //        Album_von_bis_8 = 8,
      //        Party_von_bis_9 = 9,
     
      //              |Folder No.|                 |Mode|                               |Special|                  |Special2|
      RotSwMap[0][0] =     1;     RotSwMap[0][1] =  Album_2;             RotSwMap[0][2] = 0;         RotSwMap[0][3] = 0;
      RotSwMap[1][0] =     2;     RotSwMap[1][1] =  Album_2;             RotSwMap[1][2] = 0;         RotSwMap[1][3] = 0;
      RotSwMap[2][0] =     3;     RotSwMap[2][1] =  Party_3;             RotSwMap[2][2] = 0;         RotSwMap[2][3] = 0;
      RotSwMap[3][0] =     4;     RotSwMap[3][1] =  Party_3;             RotSwMap[3][2] = 0;         RotSwMap[3][3] = 0;
      RotSwMap[4][0] =     5;     RotSwMap[4][1] =  Party_3;             RotSwMap[4][2] = 0;         RotSwMap[4][3] = 0;
      RotSwMap[5][0] =     6;     RotSwMap[5][1] =  Party_3;             RotSwMap[5][2] = 0;         RotSwMap[5][3] = 0;
      RotSwMap[6][0] =     7;     RotSwMap[6][1] =  Party_3;             RotSwMap[6][2] = 0;         RotSwMap[6][3] = 0;
      RotSwMap[7][0] =     8;     RotSwMap[7][1] =  Party_3;             RotSwMap[7][2] = 0;         RotSwMap[7][3] = 0;
      RotSwMap[8][0] =     0;     RotSwMap[8][1] =  FreezeDance_2;       RotSwMap[8][2] = 0;         RotSwMap[8][3] = 0;
      RotSwMap[9][0] =     0;     RotSwMap[9][1] =  PuzzleGame_8;        RotSwMap[9][2] = 1;         RotSwMap[9][3] = 0;
      RotSwMap[10][0] =    0;     RotSwMap[10][1] = QuizGame_9;          RotSwMap[10][2] = 1;        RotSwMap[10][3] = 0;
      RotSwMap[11][0] =    0;     RotSwMap[11][1] = ButtonSmash_10;      RotSwMap[11][2] = 5;        RotSwMap[11][3] = 5;

      RotSwCurrentPos = RotSwGetPosition();

Jetzt braucht es noch ein paar Methoden, welche die Arbeit machen. Die erste liest die Position des Drehschalters, die zweite startet nach Position und Inhalt des Arrays, den entsprchenden Ordner.

uint8_t RotSwGetPosition ()
{
  float analogValue = (analogRead(ROTARY_SWITCH_PIN) * ROTARY_SWITCH_REF_VOLTAGE) / 1024.0;

  for (uint8_t x = 0; x <= ROTARY_SWITCH_POSITIONS; x++)
  {
    if (analogValue > (ROTARY_SWITCH_STEP_MIN * x) && analogValue < (ROTARY_SWITCH_STEP_MAX * x)) {
          return x+1;          
    }   
   }
}

void RotSwSet (uint8_t RotarySwitchPosition) {
    folderSettings myRotSw;
    
    if (RotSwMap[RotarySwitchPosition-1][0] != 0) {
    
      myRotSw.folder = RotSwMap[RotarySwitchPosition-1][0];
      myRotSw.mode = RotSwMap[RotarySwitchPosition-1][1];
      myRotSw.special = RotSwMap[RotarySwitchPosition-1][2];
      myRotSw.special2 = RotSwMap[RotarySwitchPosition-1][3];
      myFolder = &myRotSw;
      playFolder();
      
    } 
}

Damit es auch funktioniert muss noch ein kleiner Teil in den „void loop()“ inerhalb der „do“ Schleife. Es wird nur bei Änderung der Stellung der Inhalt der neuen Stellung abgespielt.

Bei Start der Box passiert erst einmal nichts, man muss mindestens einmal drehen. Falls man das ändern will, muss man den Aufruf „RotSwCurrentPos = RotSwGetPosition();“ im „void setup()“ entfernen.

if (RotSwCurrentPos != RotSwGetPosition()) {
  RotSwCurrentPos = RotSwGetPosition();
      Serial.print("Current Rotary Switch Position: ");
      Serial.println(RotSwCurrentPos);
  RotSwSet(RotSwCurrentPos);
}

Ich plane noch weiter Funktionen umzusetzen:

  • Auswahl von Modifier wie den Pausetanz
  • Systembefehle wie z.B. Lautstärke oder Ausschalten
  • Ein bestätigung der Auswahl über einen Trigger. Entweder einen Knopfdruck oder nach ablauf einer gewissen Zeit, sodass man nicht jeden Inhalt sofort anspielt, wenn man mehrere überspringen muss/will.

So ich hoffe der Einbau klappt, sonst einfach nochmal melden.
@revilo du wohnst ja um die Ecke, ich kann dir damit auch persöhnlich helfen.