Код скетча
// Синтезатор на клавиатуре 4×4.
//
// Шестнадцать клавиш — шестнадцать нот, от до первой октавы до ре
// третьей. Держите клавишу — нота звучит, отпустите — тишина. Опрос
// клавиатуры сделан вручную, без библиотеки: строки по очереди
// опускаются в ноль, а столбцы читаются с подтяжкой.
const byte ROWS[4] = {2, 3, 4, 5};
const byte COLS[4] = {6, 7, 8, 9};
const int BUZZER = 10;
const char KEYS[16] = {'1', '2', '3', 'A', '4', '5', '6', 'B', '7', '8', '9', 'C', '*', '0', '#', 'D'};
const int NOTES[16] = {262, 294, 330, 349, 392, 440, 494, 523, 587, 659, 698, 784, 880, 988, 1047, 1175};
const char *NAMES[16] = {"C4", "D4", "E4", "F4", "G4", "A4", "B4", "C5", "D5", "E5", "F5", "G5", "A5", "B5", "C6", "D6"};
int scan() {
for (int r = 0; r < 4; r++) {
for (int i = 0; i < 4; i++) pinMode(ROWS[i], INPUT_PULLUP);
pinMode(ROWS[r], OUTPUT);
digitalWrite(ROWS[r], LOW);
delayMicroseconds(10);
for (int c = 0; c < 4; c++) if (digitalRead(COLS[c]) == LOW) return r * 4 + c;
}
return -1;
}
int playing = -1;
void setup() {
Serial.begin(9600);
for (byte c : COLS) pinMode(c, INPUT_PULLUP);
Serial.println(F("Играйте на клавиатуре: 16 нот"));
}
void loop() {
int k = scan();
if (k != playing) {
playing = k;
if (k < 0) noTone(BUZZER);
else {
tone(BUZZER, NOTES[k]);
Serial.print(F("клавиша "));
Serial.print(KEYS[k]);
Serial.print(F(": нота "));
Serial.print(NAMES[k]);
Serial.print(' ');
Serial.print(NOTES[k]);
Serial.println(F(" Гц"));
}
}
delay(10);
}