如何对 Arduino 进行编程以将两个键盘输入保存在单独的变量中?

How to program Arduino to take and save two keypad inputs in separate variables?

试图制作一个简单的 Arduino 加法器,但我在编程时遇到了问题。我不确定我在哪里犯了错误。任何帮助将不胜感激。

用户必须在键盘上输入两个数字,它们的总和将显示在 LCD 上。用户输入的两个数字分别存储在它们的变量中。问题在于,在输入第一个数字后,程序会自动为第二个变量插入 0(因为此时没有按下任何键)。我已尝试使用 'if'、'while' 和 'do while' 语句来消除 NO_KEY,但其中 none 似乎有效。

问题是是否有办法将用户输入的数字存储在变量中,而不让程序用 0 覆盖它,因为此时没有按键被按下。或者,为了不让 Arduino 在按下某个键后从键盘接收更多输入(可能以某种方式禁用键盘)...

如果您愿意花一些时间查看代码,链接的网站 here 包含代码和整个实验室设置。

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

LiquidCrystal lcd (7,8,9,10,11,12);
int backLight(13);


int Addition(int x, int y){
    int z;
    z = x+y;
    lcd.setCursor(8,0);
    lcd.write(z);
}

void setup() {

}

const byte rows =4;
const byte cols =3;

char keys[rows][cols]={
    {'1','2','3'},
    {'4','5','6'},
    {'7','8','9'},
    {'*','0','#'}
};

byte rowPins[rows] = {0,1,2,3};
byte colPins[cols] = {4,5,6};

Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, rows, cols);


void loop(){

    int a;
    int b;

    a = keypad.getKey();
    if (a != NO_KEY){

        do {
            b = keypad.getKey();
        }while (b == NO_KEY);

        pinMode (backLight, OUTPUT);
        digitalWrite(backLight, HIGH);
        lcd.begin(16,2);
        lcd.clear();

        lcd.setCursor(0,0);
        lcd.write(a);

        lcd.setCursor(2,0);
        lcd.write("+");

        lcd.setCursor(4,0);
        lcd.write(b);

        lcd.setCursor(6,0);
        lcd.write("=");

        Addition(a,b);
        delay(10000);

    }

}

你有这样一段代码:

do {
    b = keypad.getKey();
} while (b = NO_KEY);

在 while 条件下,您似乎是用 (b = NO_KEY)NO_KEY 赋值给 b,而不是用 (b == NO_KEY) 检查相等性。赋值 returns 为真,因此循环不会退出。 它应该是这样的:

do {
    b = keypad.getKey();
} while (b == NO_KEY);

对于加法问题,您的键盘映射包含字符而不是整数。所以a和b应该是char类型,可以用atoi()转成int:

char a;
char b;

// ...assign values to a and b as you already do...

Addition(atoi(a), atoi(b)); // use atoi() (ascii to int) to pass integer values to Addition

或者,您可以将键盘映射更改为:

int keys[rows][cols]={
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9},
    {'*',0,'#'}
};

并使用 lcd.print(a, DEC) 打印值。那么你就不需要 atoi() 并且在我看来它会更干净。 加法函数:

Addition(int x, int y) {
    int z;
    z = x+y; // z is now the integer sum
    lcd.setCursor(8,0);
    lcd.print(z, DEC); // print the decimal value of z (default is ascii)
}