Я пытаюсь сделать кодовый замок, используя Arduino, клавиатуру и сервопривод, но я столкнулся с препятствием.
Я не могу найти способ сохранить 4-значное значение в переменной. так как keypad.getKey позволяет хранить только одну цифру.
После некоторого просмотра в Интернете я нашел решение для моей проблемы на форуме, но ответ не включал пример кода, и я не мог найти что-либо еще в Интернете.
В ответе сказано, что пользователь может использовать ограничение по времени для ввода числа или завершающего символа (что, по их мнению, было бы лучшим вариантом).
Я хотел бы узнать больше об этих завершающих символах и о том, как их реализовать, или если бы кто-нибудь мог предложить лучшее решение, которое также будет высоко оценено.
Заранее спасибо,
к сохранить 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 и не знаю о его библиотеке клавиатур, но логика здесь, теперь решать вам)
В комментарии 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