Töne erzeu­gen mit dem Tastenfeld

Lese­zeit: 4 Minu­ten

Lösung
Seite als PDF

Bei einem Tas­ten­druck auf dem Tas­ten­feld soll jeweils ein Ton der Ton­lei­ter zwi­schen C' und C'' wie­der­ge­ge­ben werden.

NoteFre­quenzTas­te auf dem Tastenpad
c'262Tas­te 1
d'294Tas­te 2
e'330Tas­te 3
f'349Tas­te 4
g'392Tas­te 5
a'440Tas­te 6
h'494Tas­te 7
c''523Tas­te 8

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

Töne erzeu­gen Seri­el­ler Monitor

Benö­tig­te Bauteile:

  • Laut­spre­cher
  • Tas­ten­feld 3×4
  • 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)

Du benö­tigst die Biblio­thek Adafruit Keypad:

Das Tas­ten­feld besteht aus Rei­hen und Spal­ten, die von unten nach oben in einem ➨zwei­di­men­sio­na­len Array ange­ord­net werden:

Bin­de die benö­tig­te Biblio­thek ein und defi­nie­re die Variablen.

# include <Adafruit_Keypad.h>

int LAUTSPRECHER = 13;

// Größe des Tastenfeldes
// 3 Spalten
const byte SPALTEN = 3;

// 4 Zeilen
const byte REIHEN = 4;

// die Ziffern/Zeichen:
// Array 3 x 4
char Tasten[REIHEN][SPALTEN] =
{
  { '#', '0', '*' },
  { '9', '8', '7' },
  { '6', '5', '4' },
  { '3', '2', '1' }
};

// die Pins für die 3 Spalten
byte SpaltenPins[SPALTEN] = { 3, 4, 5 };

// die Pins für die 4 Zeilen
byte ReihenPins[REIHEN] = { 6, 7, 8, 9 };

// TastenFeld → Name des Keypads
// -> Zuordnung der Pins zu den REIHEN und SPALTEN des Arrays
Adafruit_Keypad Tastenfeld = Adafruit_Keypad(makeKeymap(Tasten), ReihenPins, SpaltenPins, REIHEN, SPALTEN);

Der set­up-Teil:

void setup()
{
  // Tastenfeld starten
  Tastenfeld.begin();

  pinMode(LAUTSPRECHER, OUTPUT);
  Serial.begin(9600);

  // auf serielle Verbindung warten
  while (!Serial) {;}
}

Der loop-Teil.

Die gedrück­te Tas­te wird mit switch abge­fragt. Die Tas­ten­codes ent­spre­chen dem ASCII-Code.

void loop()
{
  // gedrückte Taste lesen
  Tastenfeld.tick();

  while (Tastenfeld.available())
  {
    keypadEvent Taste = Tastenfeld.read();

    // wenn die Taste losgelassen wurde -> Lautsprecher ausschalten
    if (Taste.bit.EVENT == KEY_JUST_RELEASED) noTone(LAUTSPRECHER);

    // solange die Taste gedrückt wird -> Ton abspielen
    if (Taste.bit.EVENT == KEY_JUST_PRESSED)
    {
      // gedrückte Taste anzeigen
      Serial.print("ASCII: " +String(Taste.bit.KEY) + "\t");
      Serial.print("Taste: ");
      Serial.println((char)Taste.bit.KEY);

      /*
         Tastencode entspricht dem ASCII-Code:
         49 = 1
         50 = 2
         . . . 
         56 = 8
      */
      switch (Taste.bit.KEY)
      {
        // C'
        case 49:
          tone(LAUTSPRECHER, 262);
          break;

        // D
        case 50:
          tone(LAUTSPRECHER, 294);
          break;

        // E
        case 51:
          tone(LAUTSPRECHER, 330);
          break;

        // F
        case 52:
          tone(LAUTSPRECHER, 350);
          break;

        // G
        case 53:
          tone(LAUTSPRECHER, 392);
          break;

        // A
        case 54:
          tone(LAUTSPRECHER, 440);
          break;

        // H
        case 55:
          tone(LAUTSPRECHER, 495);
          break;
          
        // C''
        case 56:
          tone(LAUTSPRECHER, 523);
          break;
      }
    }
  }
}

Startseite
Aufgaben A-Z
Suchen
Downloads
Fehlermeldungen
Seite als PDF

Ver­wand­te Aufgaben:


Letzte Aktualisierung: 15. Okt 2023 @ 11:45