如何使用4x4键盘将多位整数输入Arduino?

时间:2016-08-30 16:25:03

标签: c++ c arduino arduino-uno keypad

我正在尝试使用Arduino,键盘和伺服制作组合锁,但我遇到了障碍。

我找不到在变量中存储4位数值的方法。因为keypad.getKey只允许存储一个数字。

在互联网上浏览了一段时间后,我在论坛上找到了解决问题的方法,但答案中没有包含代码示例,我也无法在互联网上找到任何其他内容。

答案是要么使用时间限制来输入用户数字还是终止字符(根据这些字符,这将是更好的选择)。

我想知道更多关于这些终止字符以及如何实现它们,或者是否有人可以建议一个更受欢迎的更好的解决方案。

提前谢谢你,

2 个答案:

答案 0 :(得分:1)

存储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 :(得分:0)

在评论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。