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

Posted

技术标签:

【中文标题】如何使用 4x4 键盘将多位整数输入 Arduino?【英文标题】:How to input a multi-digit integer into an Arduino using a 4x4 keypad? 【发布时间】:2016-08-30 16:25:02 【问题描述】:

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

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

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

答案是使用时间限制让用户输入数字或终止字符(根据他们的说法,这将是更好的选择)。

我想了解更多关于这些终止字符以及如何实现它们的信息,或者是否有人可以提出更好的解决方案,也将不胜感激。

提前谢谢你,

【问题讨论】:

人工智能电话接线员告诉你“输入你的电话号码,然后输入绑定键”也是一样的,那么是什么阻止你这样做呢? 我不知道该怎么做。你能推荐一个解释它的网站吗? 很简单。想一想:通过不断调用 getkey() 来填充您的数字容器。每次获取密钥时,检查它,它是终止密钥然后停止,否则再次调用 getkey() 以获取新密钥。 你想要一个数字数组,还是0-9999范围内的单个数字? 我们都喜欢 Arduino 和它的简单性,但请不要复制粘贴代码,努力理解它。 【参考方案1】:

存储 4 位数值,最简单且天真的方法可能是使用大小为 4 的数组。假设 keypad.getKey 返回一个 int,您可以执行以下操作:@ 987654322@. 您将需要一个游标变量来知道当按下下一个键时您需要写入数组的哪个槽,这样您就可以执行某种循环,如下所示:

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;

注意:听起来也可以使用计时器(并且可以与终止字符选项结合使用,它们不是唯一的)。这样做的方法是将计时器设置为您选择的持续时间,并在结束时将光标变量重置为 0。

(我从未在 arduino 上编程,也不知道它的键盘库,但逻辑在这里,现在由你决定)

【讨论】:

【参考方案2】:

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

【讨论】:

如果不是 4*4 键盘也可以。顺便说一句,它可以修改为每次按键使用一个字节,从而可以访问所有键盘可能性:) @Aureo 键盘与问题无关。 OP回答了我的评论问题,他的目的是在0..9999范围内输入一个数字

以上是关于如何使用 4x4 键盘将多位整数输入 Arduino?的主要内容,如果未能解决你的问题,请参考以下文章

PIC 微控制器:扫描 4x4 键盘上的输入,仅使用 C 中的端口 C RC0-RC3

使用树莓派 3 从 4x4 键盘读取多个数字

Arduino 键盘 4x4 到 LCD 激活/停用(家庭安全系统)

MSP430G2553 4x4矩阵键盘

STM324*4键盘输入(附代码可直接使用)

STM324*4键盘输入(附代码可直接使用)