Подача значений в массив с помощью клавиатуры, подключенной к Arduino Uno.

Я пытаюсь ввести значения клавиатуры в массив. Код компилируется без ошибок. При запуске кода код переходит в цикл for и печатает «m» на ЖК-дисплее, но не выполняет «customKey = customKeypad.getKey();» и приведенные ниже шаги продолжают печатать «m» 5 раз. Я не могу вводить значения с клавиатуры. Пожалуйста, помогите.

#include <LiquidCrystal.h>
#include <Keypad.h>

const int rs = A1, en = A0, d4 = A2, d5 = A3, d6 = A4, d7 = A5;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

const byte ROWS = 4;
const byte COLS = 4;

char hexaKeys[ROWS][COLS] = { { '1', '2', '3', 'A' }, { '4', '5', '6', 'B' }, {
    '7', '8', '9', 'C' }, { '*', '0', '#', 'D' } };

byte rowPins[ROWS] = { 13, 12, 11, 10 };
byte colPins[COLS] = { 9, 8, 7, 6 };

Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS,
    COLS);

//Строка inputString = "";
char customKey;
char a[5];

void setup() {
  Serial.begin(9600);
  //inputString.reserve(200);
  lcd.begin(16, 2);
}

void loop() {
  lcd.clear();
  if (Serial.read() == '1') {
    lcd.setCursor(0, 0);
    lcd.print("WELCOME !");
    delay(1000);
    lcd.clear();
    lcd.print("Enter UserID :");
    lcd.setCursor(0, 1);
    for (int i = 0; i < 5; i++) {
      lcd.print('m');
      customKey = customKeypad.getKey();
      delay(30);

      if (customKey) {
        lcd.print('*');
        a[i] = customKey;
      }
      if (i == 5) {
        a[i] = '\0';
        break;
      }

      delay(1000);
    }
  }
}

, 👍0


1 ответ


2

customKeypad.getKey(); не ждет нажатия клавиши. он возвращает 0, если ни одна клавиша не нажата.

вам следует переписать скетч в версию, в которой цикл() может зацикливаться и нажатия клавиш считываются по мере их нажатия.

,

Неужели нет другого пути? Я проверяю Serial.read()=='1', потому что мне нужно получить последовательный вывод '1' от zigbee, подключенного к Arduino, чтобы перейти к используемому идентификатору., @maheshmt

Вам не обязательно переписывать эскиз, но стоит. Определенно лучше писать неблокирующий код, потому что тогда вы сможете добавить другие функции, которые, по-видимому, будут выполняться одновременно. Если вы действительно этого не хотите, просто поместите команду getKey() внутри оператора while(customKey == 0). Программа будет заблокирована до тех пор, пока не будет нажата клавиша., @chrisl

перезапись требует использования переменной состояния. затем он может включать состояние «ожидания» до того, как «1» была получена через последовательный порт., @kamen