Скетч для матричной клавиатуры. Спойлер: Вот так работает Код (C++): #include <MIDI.h> #include <math.h> MIDI_CREATE_DEFAULT_INSTANCE(); const byte ROWS = 4; //--Количество столбцов матричной клавиатуры const byte COLS = 10; //--Количество строк матричной клавиатуры byte rowPins[ROWS] = {5,4,3,2}; //--Пины столбцов byte colPins[COLS] = {31,30,29,28,27,26,25,24,23,22}; //--Пины строк byte buttonState[COLS][ROWS] = { //--Массив состояния кнопок {1,1,1,1}, {1,1,1,1}, {1,1,1,1}, {1,1,1,1}, {1,1,1,1}, {1,1,1,1}, {1,1,1,1}, {1,1,1,1}, {1,1,1,1}, {1,1,1,1} }; byte kpdNote[COLS][ROWS] = { //Массив нот {68,58,48,0}, {69,59,49,0}, {70,60,50,0}, {71,61,51,41}, {72,62,52,42}, {73,63,53,43}, {74,64,54,44}, {75,65,55,45}, {76,66,56,46}, {77,67,57,47} }; byte dval = 0; void setup() { MIDI.begin(); //Инициализация MIDI интерфейса for(byte i = 0; i < COLS; i++){ //Конфигурируем строки мтрчн клвтр как выходы pinMode(colPins[i], OUTPUT); //и подаём на них лог. 1-------- digitalWrite(colPins[i], HIGH); // ---------------------------------- } for(byte i = 0; i < ROWS; i++) { //Конфигурируем столбцы мтрчн клвтр как входы pinMode(rowPins[i], INPUT); //и включаем встроенные в мк подтягивающие digitalWrite(rowPins[i], HIGH); //-----------------------резисторы } Serial.begin(115200); } void loop() { for(byte col = 0; col < COLS; col++) { //Цикл чтения матричной клавиатуры digitalWrite(colPins[col], LOW); //На считываем столбец выставляем 0 for(byte row = 0; row < ROWS; row++) { //Построчно считываем каждый столбец dval = digitalRead(rowPins[row]); //И при нажатой кнопке передаём ноту if ( dval == LOW && buttonState[col][row] == HIGH ) { MIDI.sendNoteOn(kpdNote[col][row], 127, 1); } if ( dval == HIGH && buttonState[col][row] == LOW ) { MIDI.sendNoteOff(kpdNote[col][row], 0, 1); } buttonState[col][row] = dval; } digitalWrite(colPins[col], HIGH); } } Когда меняю строки и столбцы местами, row<->col везде где надо, перестаёт посылать значения кнопок. Спойлер: А так нет Код (C++): #include <MIDI.h> #include <math.h> MIDI_CREATE_DEFAULT_INSTANCE(); const byte ROWS = 4; //--Количество столбцов матричной клавиатуры const byte COLS = 10; //--Количество строк матричной клавиатуры byte rowPins[ROWS] = {5,4,3,2}; //--Пины столбцов byte colPins[COLS] = {31,30,29,28,27,26,25,24,23,22}; //--Пины строк byte buttonState[ROWS][COLS] = { //--Массив состояния кнопок {1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1} }; byte kpdNote[ROWS][COLS] = { //Массив нот {0,0,0,41,42,43,44,45,46,47}, {48,49,50,51,52,53,54,55,56,57}, {58,59,60,61,62,63,64,65,66,67}, {68,69,70,71,72,73,74,75,76,77} }; byte dval = 0; void setup() { MIDI.begin(); //Инициализация MIDI интерфейса for(byte i = 0; i < ROWS; i++) { //Конфигурируем строки мтрчн клвтр как входы pinMode(rowPins[i], INPUT); //и включаем встроенные в мк подтягивающие digitalWrite(rowPins[i], HIGH); //-------------------------резисторы } for(byte i = 0; i < COLS; i++){ //Конфигурируем столбцы мтрчн клвтр как выходы pinMode(colPins[i], OUTPUT); //и подаём на них лог. 1 digitalWrite(colPins[i], HIGH); // ---------------------- } Serial.begin(115200); } void loop() { for(byte row = 0; row < ROWS; row++) { //Цикл чтения матричной клавиатуры digitalWrite(rowPins[row], LOW); //На считываем столбец выставляем 0 for(byte col = 0; col < COLS; col++) { //Построчно считываем каждый столбец dval = digitalRead(colPins[col]); //--И при нажатой кнопке передаём ноту if ( dval == LOW && buttonState[row][col] == HIGH ) { MIDI.sendNoteOn(kpdNote[row][col], 127, 1); } if ( dval == HIGH && buttonState[row][col] == LOW ) { MIDI.sendNoteOff(kpdNote[row][col], 0, 1); } buttonState[row][col] = dval; } digitalWrite(rowPins[row], HIGH); } } Соответственно, мне нужен второй вариант как более краткий и удобный в настройке. Помогите найти ошибку.
Код (C++): #include <MIDI.h> #include <math.h> MIDI_CREATE_DEFAULT_INSTANCE(); const byte ROWS = 10; //--Количество столбцов матричной клавиатуры const byte COLS = 4; //--Количество строк матричной клавиатуры byte rowPins[ROWS]={31,30,29,28,27,26,25,24,23,22}; //--Пины столбцов byte colPins[COLS] = {5,4,3,2}; //--Пины строк byte buttonState[ROWS][COLS] = { //--Массив состояния кнопок {1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1} }; byte kpdNote[ROWS][COLS] = { //Массив нот {0,0,0,41,42,43,44,45,46,47}, {48,49,50,51,52,53,54,55,56,57}, {58,59,60,61,62,63,64,65,66,67}, {68,69,70,71,72,73,74,75,76,77} }; byte dval = 0; void setup() { MIDI.begin(); //Инициализация MIDI интерфейса for(byte i = 0; i < COLS; i++){ //Конфигурируем строки мтрчн клвтр как выходы pinMode(colPins[i], OUTPUT); //и подаём на них лог. 1-------- digitalWrite(colPins[i], HIGH); // ---------------------------------- } for(byte i = 0; i < ROWS; i++) { //Конфигурируем столбцы мтрчн клвтр как входы pinMode(rowPins[i], INPUT); //и включаем встроенные в мк подтягивающие digitalWrite(rowPins[i], HIGH); //-----------------------резисторы } Serial.begin(115200); } void loop() { for(byte col = 0; col < COLS; col++) { //Цикл чтения матричной клавиатуры digitalWrite(colPins[col], LOW); //На считываем столбец выставляем 0 for(byte row = 0; row < ROWS; row++) { //Построчно считываем каждый столбец dval = digitalRead(rowPins[row]); //И при нажатой кнопке передаём ноту if ( dval == LOW && buttonState[col][row] == HIGH ) { MIDI.sendNoteOn(kpdNote[col][row], 127, 1); } if ( dval == HIGH && buttonState[col][row] == LOW ) { MIDI.sendNoteOff(kpdNote[col][row], 0, 1); } buttonState[col][row] = dval; } digitalWrite(colPins[col], HIGH); } }
Не проканало. Ошибка "too many initializers for 'byte [4] {aka unsigned char [4]}'", да и строк мне нужно 4 а не 10.
а если так? Код (C++): #include <MIDI.h> #include <math.h> MIDI_CREATE_DEFAULT_INSTANCE(); const byte ROWS = 10; //--Количество столбцов матричной клавиатуры const byte COLS = 4; //--Количество строк матричной клавиатуры byte rowPins[ROWS]={31,30,29,28,27,26,25,24,23,22}; //--Пины столбцов byte colPins[COLS] = {5,4,3,2}; //--Пины строк byte buttonState[COLS][ROWS] = { //--Массив состояния кнопок {1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1}, {1,1,1,1,1,1,1,1,1,1} }; byte kpdNote[COLS][ROWS] = { //Массив нот {0,0,0,41,42,43,44,45,46,47}, {48,49,50,51,52,53,54,55,56,57}, {58,59,60,61,62,63,64,65,66,67}, {68,69,70,71,72,73,74,75,76,77} }; byte dval = 0; void setup() { MIDI.begin(); //Инициализация MIDI интерфейса for(byte i = 0; i < COLS; i++){ //Конфигурируем строки мтрчн клвтр как выходы pinMode(colPins[i], OUTPUT); //и подаём на них лог. 1-------- digitalWrite(colPins[i], HIGH); // ---------------------------------- } for(byte i = 0; i < ROWS; i++) { //Конфигурируем столбцы мтрчн клвтр как входы pinMode(rowPins[i], INPUT); //и включаем встроенные в мк подтягивающие digitalWrite(rowPins[i], HIGH); //-----------------------резисторы } Serial.begin(115200); } void loop() { for(byte col = 0; col < COLS; col++) { //Цикл чтения матричной клавиатуры digitalWrite(colPins[col], LOW); //На считываем столбец выставляем 0 for(byte row = 0; row < ROWS; row++) { //Построчно считываем каждый столбец dval = digitalRead(rowPins[row]); //И при нажатой кнопке передаём ноту if ( dval == LOW && buttonState[col][row] == HIGH ) { MIDI.sendNoteOn(kpdNote[col][row], 127, 1); } if ( dval == HIGH && buttonState[col][row] == LOW ) { MIDI.sendNoteOff(kpdNote[col][row], 0, 1); } buttonState[col][row] = dval; } digitalWrite(colPins[col], HIGH); } }
Не-а : \ Ошибка не выскакивает, но кнопки не работают. Ладно, спасибо. Не буду изъ***ваться и оставлю первый вариант.