Как ввести многозначное число в Arduino с помощью клавиатуры 4×4?

Я пытаюсь сделать кодовый замок, используя Arduino, клавиатуру и сервопривод, но я столкнулся с препятствием.

Я не могу найти способ сохранить 4-значное значение в переменной. так как keypad.getKey позволяет хранить только одну цифру.

После некоторого просмотра в Интернете я нашел решение для моей проблемы на форуме, но ответ не включал пример кода, и я не мог найти что-либо еще в Интернете.

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

Я хотел бы узнать больше об этих завершающих символах и о том, как их реализовать, или если бы кто-нибудь мог предложить лучшее решение, которое также будет высоко оценено.

Заранее спасибо,

0

Решение

к сохранить 4-значные значения, самый простой и наивный способ сделать это, вероятно, использовать массив размером 4. Предполагая, keypad.getKey возвращает int, вы можете сделать что-то вроде этого: int input[4] = {0};,
Вам понадобится переменная курсора, чтобы знать, в какой слот массива вам нужно записать, когда нажимается следующая клавиша, чтобы вы могли сделать такой цикл:

int input[4] = {0};
for (unsigned cursor = 0; cursor < 4; ++cursor) {
input[cursor] = keypad.getKey();
}

Если вы хотите использовать завершающий символ (скажем, на клавиатуре есть клавиши 0-9 и A-F, мы могли бы сказать, что F — это завершающая клавиша), код изменяется примерно так:

bool checkPassword() {
static const int expected[4] = {4,8,6,7}; // our password
int input[4] = {0};

// Get the next 4 key presses
for (unsigned cursor = 0; cursor < 4; ++cursor) {
int key = keypad.getKey();

// if F is pressed too early, then it fails
if (key == 15) {
return false;
}

// store the keypress value in our input array
input[cursor] = key;
}

// If the key pressed here isn't F (terminating key), it fails
if (keypad.getKey() != 15)
return false;

// Check if input equals expected
for (unsigned i = 0; i < 4; ++i) {
// If it doesn't, it fails
if (expected[i] != input[i]) {
return false;
}
}

// If we manage to get here the password is right :)
return true;
}

Теперь вы можете использовать функцию checkPassword в своей основной функции следующим образом:

int main() {
while (true) {
if (checkPassword())
//unlock the thing
}
return 0;
}

NB: Использование звуков таймера также возможно (и может быть объединено с опцией завершающего символа, они не являются исключительными). Способ сделать это состоит в том, чтобы установить таймер на продолжительность по вашему выбору, и когда он заканчивается, вы сбрасываете переменную курсора на 0.

(Я никогда не программировал на Arduino и не знаю о его библиотеке клавиатур, но логика здесь, теперь решать вам)

1

Другие решения

В комментарии OP говорится, что требуется один номер. Типичный алгоритм состоит в том, что для каждой введенной цифры вы умножаете аккумулятор на 10 и добавляете введенную цифру. Это предполагает, что ключевая запись — ASCII, следовательно, вычитая ‘0’ из нее, чтобы получить цифру 0..9 вместо '0'..'9',

#define MAXVAL 9999
int value = 0;                                  // the number accumulator
int keyval;                                     // the key press
int isnum;                                      // set if a digit was entered
do {
keyval = getkey();                          // input the key
isnum = (keyval >= '0' && keyval <= '9');   // is it a digit?
if(isnum) {                                 // if so...
value = value * 10 + keyval - '0';      // accumulate the input number
}
} while(isnum && value <= MAXVAL);              // until not a digit

Если у вас есть клавиша возврата, вы просто делите аккумулятор value на 10

0

По вопросам рекламы [email protected]