Spiel­uhr mit dem Tastenpad

Lese­zeit: 5 Minu­ten

Lösung
Seite als PDF

Wer­den die Tas­ten des Tas­ten­pads gedrückt, wird eine Melo­die abgespielt:

  • Tas­te 1: Alle mei­ne Entchen
  • Tas­te 2: Backe Backe Kuchen
  • Tas­te 3: Ton­lei­ter von C1 bis C2
  • Tas­te 4: Bru­der Jakob 

So klingt es: (die Musiker*innen mögen mir verzeihen)

Alle mei­ne Entchen

Backe backe Kuchen

Ton­lei­ter

Bru­der Jakob

Benö­tig­te Bauteile:

  • Laut­spre­cher
  • Tas­ten­pad
  • Lei­tungs­dräh­te

Baue die Schal­tung auf:
(Fah­re mit der Maus über das Bild, um die Bezeich­nun­gen der Bau­tei­le zu sehen)

Defi­nie­re die ➨Arrays für die Fre­quen­zen der Töne und die Län­ge der Töne in Millisekunden.

Hier fin­dest du eine 🔗Über­sicht (exter­ner Link, abge­ru­fen am 15.10.2023) über die Frequenzen.

// Frequenzen: c' d' e' f' g' a' h' c'' 
int Tonleiter[] = 
{261, 293, 329, 349, 391, 440, 493, 523, 493, 440, 391, 349,  329, 293, 261}; 

// Länge der Töne "Tonleiter" in Millisekunden 
int TonlaengeTonleiter[] = 
{200, 200, 200, 200, 200, 200, 200, 200, 200, 200,  200, 200, 200, 200, 200, 200}; 

// Frequenzen "Alle meine Entchen“ 
int AlleMeineEntchen[] = 
{261, 293, 329, 349, 391, 391, 440, 440, 440, 440, 391, 440, 440, 440, 440, 391, 349, 349, 349, 349, 329, 329, 391, 391, 391, 391,  261}; 

// Länge der Töne "Alle meine Entchen“ in Millisekunden 
int TonlaengeAlleMeineEntchen[] = 
{250, 250, 250, 250, 500, 500, 250, 250, 250,  250, 500, 250, 250, 250, 250, 500, 250, 250, 250, 250, 500, 500, 250, 250, 250,  250, 500, 500}; 

// Frequenzen "Bruder Jakob“ 
int BruderJakob[] = 
{349, 391, 440, 349, 349, 391, 440, 349, 440, 466, 523,  440, 466, 523 }; 

// Länge der Töne "Bruder Jakob“ in Millisekunden 
int TonlaengeBruderJakob[] = 
{500, 500, 500, 500, 500, 500, 500, 500, 500, 500,  1000, 500, 500, 1000}; 

// Frequenzen "Backe backe Kuchen“
int BackeKuchen[] = 
{440, 440, 493, 493, 440, 369, 293, 440, 440, 493, 493, 440,  
369};

// Länge der Töne "Backe backe Kuchen“ in Millisekunden 
int TonlaengeBackeKuchen[] = 
{250, 250, 250, 250, 500, 250, 250, 250, 250, 250,  250, 500, 250};

int LAUTSPRECHER = 4; 
int Taster;
int Analogwert;

Der set­up-Teil.

void setup()
{
  // wenn der Wert der gedrückten Taste angezeigt werden soll
  // Serial.begin(9600);
  // auf serielle Verbindung warten
  // while (!Serial) {;}
}

Die gedrück­te Tas­te wird durch die Mes­sung des ana­lo­gen Wer­tes ermit­telt. Lei­der kann die­ser Wert nur unge­fähr ange­ge­ben wer­den, so dass es beim lau­fen­den Pro­gramm gele­gent­lich zu nicht erwünsch­ten Effek­ten kom­men kann.

Tas­terUnge­fäh­rer ana­lo­ger Wert
links0 - 5
oben Mit­te30 - 40
unten Mit­te85 - 95
rechts160 - 170
außen330 - 380
nicht gedrückt1023
Download

Ver­wen­de die Funk­ti­on ➨Tas­ter­ab­fra­ge.

int Tasterabfrage()
{
  int Analogwert = analogRead(A0);
  
  // kurzes delay() -> doppelten Tastendruck so weit wie möglich verhindern
  delay(200);

  /* 
     A0 gibt je nach Taster einen Wert aus
     über den Seriellen Monitor wird dieser Wert angezeigt
     und kann dann eventuell angepasst werden
  */
  // Serial.println(Analogwert);

  switch (Analogwert)
  {
    case 0 ... 20:
      Taster = 1;
      break;
    case 30 ... 60:
      Taster = 2;
      break;
    case  70 ... 120:
      Taster = 3;
      break;
    case 150 ... 200:
      Taster = 4;
      break;
    case 300 ... 400:
      Taster = 5;
      break;
    default:
      return 0;
  }

  // gedrückten Taster zurückgeben
  return Taster;
} 

Im loop-Teil wird der gedrück­te Tas­ter abge­fragt und in einer for-Schlei­fe die Ton­fol­ge mit den dazu­ge­hö­ri­gen Ton­län­gen gespielt.

Die for-schlei­fe wird vom ers­ten bis zum letz­ten Ele­ment des Arrays ausgeführt.

sizeof() bestimmt die Anzahl der Ele­men­te eines Arrays. Hier­zu wird zunächst der Spei­cher­platz in Bytes bestimmt den alle Ele­men­te als Sum­me bele­gen, anschlie­ßend wird die­ser Wert durch den vom ers­ten Ele­ment beleg­ten Spei­cher­platz geteilt.

Wei­te­re Informationen

void loop()
{
  Taster = Tasterabfrage();

  // Taste links
  if (Taster == 1)
  {
    // Alle meine Entchen
    for (int i = 0; i < sizeof(AlleMeineEntchen) / sizeof(AlleMeineEntchen[0]); i ++)
    {
      tone(LAUTSPRECHER, AlleMeineEntchen[i]);
      delay(TonlaengeAlleMeineEntchen[i]);
      delay(10);
      noTone(LAUTSPRECHER);
    }
  }

  // Taste oben Mitte
  // backe backe Kuchen spielen
  if (Taster == 2)
  {
    // Backe backe Kuchen
    for (int i = 0; i < sizeof(BackeKuchen) / sizeof(BackeKuchen[0]); i ++)
    { 
      tone(LAUTSPRECHER, BackeKuchen[i]);
      delay(TonlaengeBackeKuchen[i]);
      delay(20);
      noTone(LAUTSPRECHER);
    }
  }
  
  // Taste unten Mitte
  // Tonleiter spielen
  if (Taster == 3)    

  {
    for (int i = 0; i < sizeof(Tonleiter) / sizeof(Tonleiter[0]); i ++)
    {
      tone(LAUTSPRECHER, Tonleiter[i]);
      delay(TonlaengeTonleiter[i]);
      delay(10);
      noTone(LAUTSPRECHER);
    }
  }

  // Taste rechts
  // Bruder Jakob spielen
  if (Taster == 4)
  {
    // Bruder Jakob
    for (int i = 0; i < sizeof(BruderJakob) / sizeof(BruderJakob[0]); i ++)
    {
      tone(LAUTSPRECHER, BruderJakob[i]);
      delay(TonlaengeBruderJakob[i]);
      delay(10);
      noTone(LAUTSPRECHER);
    }
  }
}

Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 21. Nov 2023 @ 9:56