Строки-столбцы матричной клавиатуры

Тема в разделе "Arduino & Shields", создана пользователем kt315, 17 авг 2021.

  1. kt315

    kt315 Нуб

    Скетч для матричной клавиатуры.
    Код (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);
      }
    }
    Соответственно, мне нужен второй вариант как более краткий и удобный в настройке. Помогите найти ошибку.
     
  2. akl

    akl Гуру

    Код (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);
      }
    }
     
     
  3. kt315

    kt315 Нуб

    Не проканало. Ошибка "too many initializers for 'byte [4] {aka unsigned char [4]}'", да и строк мне нужно 4 а не 10.
     
  4. akl

    akl Гуру

    а если так?
    Код (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);
      }
    }
     
  5. kt315

    kt315 Нуб

    Не-а : \
    Ошибка не выскакивает, но кнопки не работают.
    Ладно, спасибо. Не буду изъ***ваться и оставлю первый вариант.