如何对 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)
}
试图制作一个简单的 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)
}