Управляется включением и выключением в светодиодной матрице и кнопке - PullRequest
0 голосов
/ 27 октября 2019

Сэр, я использую матрицу светодиодов 3 * 3 с кнопкой 3 * 3, и мне нужна программа, которая должна подсвечивать верхний светодиод слева и ждать ответа пользователя. Если соответствующая кнопка нажата, светодиод выключится, и загорится ближайший соседний светодиод, и процесс продолжится. Этот код работает для этого, проблема в том, что когда пользователь нажимает 1-ю кнопку, 1-й светодиод гаснет, а 2-й светодиод горит, а когда нажимается 2-я кнопка, 2-й светодиод гаснет, а 3-й светодиод гаснет, НО, когда пользователь ошибочно касается2-ая ​​кнопка снова в середине процесса начинает мигать случайный светодиод, что не должно происходить, код должен ждать, пока нажата правильная кнопка и процесс продолжается, может кто-нибудь помочь мне с кодом. Спасибо.

#include <Keypad.h>

int led_rows[]={ 2 , 3 , 4 };
int led_cols[]={ 5 , 6 , 7 };

int led_matriz[3][3]= {     
    {0, 0, 0}, 
    {0, 0, 0},  
    {0, 0, 0}, };

const byte rows = 3; 
const byte cols = 3; 

char keys[rows][cols] = {
  {'1','2','3'},
  {'4','5','6'},
  {'7','8','9'},
};

byte rowPins[rows] = {10,9,8}; 
byte colPins[cols] = {13,12,11}; 

Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, rows, cols );

void setup(){
  Serial.begin(9600);

  for(int i=0;i<3;i++){
  pinMode(led_cols[i], OUTPUT);
  digitalWrite (led_cols[i], HIGH);
  }

  for(int i=0;i<3;i++){
  pinMode(led_rows[i], OUTPUT);
  digitalWrite (led_rows[i], LOW);
  }
  Led1_On();
}

void Led1_On(){
  digitalWrite (led_rows[0], HIGH);
  digitalWrite (led_cols[0], LOW);
}

void Led1_Off(){
  digitalWrite (led_rows[0], LOW);
  digitalWrite (led_cols[0], HIGH);
}

void Led2_On(){
  digitalWrite (led_rows[0], HIGH);
  digitalWrite (led_cols[1], LOW);
}

void Led2_Off(){
  digitalWrite (led_rows[0], LOW);
  digitalWrite (led_cols[1], HIGH);
}

void Led3_On(){
  digitalWrite (led_rows[0], HIGH);
  digitalWrite (led_cols[2], LOW);
}

void Led3_Off(){
  digitalWrite (led_rows[0], LOW);
  digitalWrite (led_cols[2], HIGH);
}

void Led4_On(){
  digitalWrite (led_rows[1], HIGH);
  digitalWrite (led_cols[0], LOW);
}

void Led4_Off(){
  digitalWrite (led_rows[1], LOW);
  digitalWrite (led_cols[0], HIGH);
}

void Led5_On(){
  digitalWrite (led_rows[1], HIGH);
  digitalWrite (led_cols[1], LOW);
}

void Led5_Off(){
  digitalWrite (led_rows[1], LOW);
  digitalWrite (led_cols[1], HIGH);
}

void Led6_On(){
  digitalWrite (led_rows[1], HIGH);
  digitalWrite (led_cols[2], LOW);
}

void Led6_Off(){
  digitalWrite (led_rows[1], LOW);
  digitalWrite (led_cols[2], HIGH);
}

void Led7_On(){
  digitalWrite (led_rows[2], HIGH);
  digitalWrite (led_cols[0], LOW);
}

void Led7_Off(){
  digitalWrite (led_rows[2], LOW);
  digitalWrite (led_cols[0], HIGH);
}

void Led8_On(){
  digitalWrite (led_rows[2], HIGH);
  digitalWrite (led_cols[1], LOW);
}

void Led8_Off(){
  digitalWrite (led_rows[2], LOW);
  digitalWrite (led_cols[1], HIGH);
}

void Led9_On(){
  digitalWrite (led_rows[2], HIGH);
  digitalWrite (led_cols[2], LOW);
}

void Led9_Off(){
  digitalWrite (led_rows[2], LOW);
  digitalWrite (led_cols[2], HIGH);
}

void loop(){
  char key = keypad.getKey();
  //Led1_On();

  switch(key)
  {
    case '1' :
    Led1_Off();
    Led2_On();
    break;

    case '2' :
    Led2_Off();
    Led3_On();
    break;

    case '3':
    Led3_Off();
    Led4_On();
    break;

    case '4':
    Led4_Off();
    Led5_On();
    break;

    case '5' :
    Led5_Off();
    Led6_On();
    break;

    case '6' :
    Led6_Off();
    Led7_On();
    break;

    case '7' :
    Led7_Off();
    Led8_On();
    break;

    case '8' :
    Led8_Off();
    Led9_On();
    break;

    case '9' :
    Led9_Off();

  }
}

1 Ответ

0 голосов
/ 27 октября 2019

Вы должны убедиться, что пользователь нажимает только ожидаемую клавишу.
Для этого вам нужно отследить, какая клавиша ожидается, и проверить ее тоже.

Начните с установки глобальной переменнойс изначально ожидаемым ключом.

char expected = '1';

Затем поместите оператор switch в условное выражение, которое будет выполняться только при выполнении условия.

if (key==expected)
{
    switch(key)
    {

Затем в каждом из случаев переключения обновите ожидаемый ключ доследующий.

        case '1' :
            expected = '2';
            Led1_Off();
            Led2_On();
            break;
...