Введите 4-значное число с помощью клавиатуры 4*4 и отобразите в последовательном мониторе.

#include <Keypad.h>

int myNum[4];

const byte ROWS = 4; 
const byte COLS = 4; 
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //подключаем к ряду распиновок клавиатуры 8,7,6,5
byte colPins[COLS] = {9, 8, 7, 6}; //подключаем к колонке распиновки клавиатуры 4,3,2,1
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS );

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

void loop() {
  Serial.println("Enter four-digit num -");  // запрос на ввод
  for (int i = 0; i < 4;){
    if(keypad.getKey()!= NO_KEY) {
      myNum[i] = keypad.getKey();
      i = i+1;
    }
  }
  Serial.print("Entered number is = ");
  Serial.print(myNum[0]);
  Serial.print(myNum[1]);
  Serial.print(myNum[2]);
  Serial.println(myNum[3]);
  delay(500);
}

Я хочу, чтобы когда я нажимаю 4-значный номер на клавиатуре, он отображался на последовательном мониторе. Этот код дает 0000, когда я нажимаю любую клавишу на клавиатуре.

, 👍1


2 ответа


1

keypad.getKey() не блокирует, как вы можете прочитать здесь: это немедленно вернет значение, даже если никакая клавиша не нажата. У вас есть цикл for, который каждый раз увеличивает i, и вы также увеличиваете его сами. Итак, что происходит, так это то, что ваш код сразу делает четыре чтения, все из которых не нажимаются на клавиши, поэтому он не сохраняет их, а затем печатает все, что происходит в буфере myNum.

Вместо этого нужно каждый раз ждать, пока будет нажата клавиша, и только после этого переходить к следующей цифре. Есть, конечно, много способов сделать это. Надеюсь понятно:

#include <Keypad.h>

int myNum[4];

const byte ROWS = 4; 
const byte COLS = 4; 
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //подключаем к ряду распиновок клавиатуры 8,7,6,5
byte colPins[COLS] = {9, 8, 7, 6}; //подключаем к колонке распиновки клавиатуры 4,3,2,1
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS );

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

void loop() {
  Serial.println("Enter four-digit num -");  // запрос на ввод

  for (int i = 0; i < 4; ++i){
    while((myNum[i] = keypad.getKey())==NO_KEY) {
      delay(1); // Просто ждем ключ
    } 
    // ждем, пока ключ будет отпущен
    while(keypad.getKey() != NO_KEY) {
      delay(1);
    } 

  }

  Serial.print("Entered number is = ");
  Serial.print(myNum[0]);
  Serial.print(myNum[1]);
  Serial.print(myNum[2]);
  Serial.println(myNum[3]);
  delay(500);
}
,

Пожалуйста. Если ответ поможет вам, рассмотрите возможность его принятия., @Mark Smith

когда я его компилирую, появляется код ошибки "Серийный номер не называет тип"., @kasun

Я предположил, что вы протестировали свой исходный код, так как вы описали, как он не работает. Нет?, @Mark Smith

@kasun Такая ошибка обычно возникает, когда вы пытаетесь выполнить оператор вне какой-либо функции. Вы пропустили фигурную скобку вокруг setup() или loop()? Покажите точный код, который дает вам ошибку!, @jose can u c

спасибо друг. это { беспокоит меня, @kasun

для (целое я = 0; я < 4; ++ я) { while((myNum[i] = keypad.getKey())!=NO_KEY) { задержка (1); // Просто ждем ключ } } он не работает должным образом. Вы можете отправить мне полный код для этого, @kasun

Поместите это в свой код, где у вас ранее был цикл for()., @Mark Smith

Я сделал это, но он не работает должным образом. можешь прислать мне весь код., @kasun

Я включил остальную часть кода выше и исправил ошибку (извините). Я также добавил некоторый код, чтобы убедиться, что первая клавиша отпущена перед чтением следующей клавиши. Если он по-прежнему не работает, опишите, как именно он ведет себя и что не так. Но было бы лучше, если бы вы попытались отладить его самостоятельно — так вы поймете, что происходит., @Mark Smith


0
#include <Keypad.h>

char myNum[4];

const byte ROWS = 4; 
const byte COLS = 4; 
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {5, 4, 3, 2}; //подключаем к ряду распиновок клавиатуры 8,7,6,5
byte colPins[COLS] = {9, 8, 7, 6}; //подключаем к колонке распиновки клавиатуры 4,3,2,1
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS );

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

void loop() {
  Serial.println("Enter four-digit num -");  // запрос на ввод

  for (char i = 0; i < 4; ++i){
    while((myNum[i] = keypad.getKey())==NO_KEY) {
      delay(1); // Просто ждем ключ
    } 
    // ждем, пока ключ будет отпущен
    while(keypad.getKey() != NO_KEY) {
      delay(1);
    } 

  }

  Serial.print("Entered number is = ");
  Serial.print(myNum[0]);
  Serial.print(myNum[1]);
  Serial.print(myNum[2]);
  Serial.println(myNum[3]);
  delay(500);
}
,