我希望从我的Arduino键盘输入的数字(类型为'char')转换为'int'类型,这样我就可以在变量中使用它们并使用数学。 例如,如果我按下键“5”,我如何将它放入变量“keyPressed”并执行“X =(keyPressed * 3)”以获得“int X = 15”。 我累了atol,atoi,reinterpret_cast,static_cast等没有成功。 我正在使用“开关盒”从我的键盘输入条目,但任何其他方法都可以。 我需要按下一个键并获得类似Serial.println()等的输出,但不能作为我可以在进一步计算中使用的int值。 请帮忙。 谢谢。
这段代码终于有效了!:谢谢你的帮助。
// Keypad***********************************************************************
#include <Keypad.h>
#include <Streaming.h>
#include <AFMotor.h>
#include <LiquidCrystal.h>
AF_Stepper motor1(200, 1); // steps for 360 degrees = 1.8 degree/step
AF_Stepper motor2(200, 2);
const byte ROWS = 4;
const byte COLS = 4;
const int debounceTime = 20;
char keys[ROWS] [COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'} };
byte rowPins[ROWS] = {9, 8, 7, 6}; // Arduino pins -red/yellow/green/blue
byte colPins[COLS] = {10, 11, 12, 13}; // Arduino pins- brown/gray/white/black
Keypad customKeypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS);
//**************************************************************************************
char customKey;
int customKeyINT;
int keyINT;
char mtID;
char mtDir;
int mtIDINT;
int mtDirINT;
boolean mtDirBLN;
char mtSteps;
char mtSteps1;
char mtSteps2;
char mtSteps3;
int mtSteps1INT;
int mtSteps2INT;
int mtSteps3INT;
int steps;
// function entry() *****************************************************************
void entry()
{
for (int i = 1; i > 0; i--)
{
Serial << "Custom FM move" << endl;
Serial << "Enter: ";
Serial << "1: Right/Left or " << endl;
Serial << "2: Front/Back:" << endl;
while(Serial.available() == 0)
{
customKey = customKeypad.getKey();
if (customKey)
{
mtID = customKey;
Serial.print("You entered Motor: ");
Serial << mtID << endl;
Serial.println();
break;
}
}
}
// ------------------------------------------------------------------------
for (int i = 1; i > 0; i--)
{
Serial << "Enter: " << endl;
Serial << "1: Front - 2: Back" << endl;
while(Serial.available() == 0)
{
customKey = customKeypad.getKey();
if (customKey)
{
mtDir = customKey;
if (mtDir == '1')
{
Serial.print("You entered: ");
Serial << "Front" << endl;
Serial.println();
break;
}
if (mtDir == '2')
{
Serial.print("You entered: ");
Serial << "Back" << endl;
Serial.println();
break;
}
}
}
}
// ---------------------------------------------------------------------
for (int i = 1; i > 0; i--)
{
Serial << "Enter # of steps" << endl;
Serial << "i.e., 025 :" << endl;
while(Serial.available() == 0)
{
customKey = customKeypad.getKey();
if (customKey)
{
mtSteps1 = customKey;
Serial.print("You entered: ");
Serial << "First digit: " << endl;
Serial << mtSteps1 << endl;
Serial.println();
break;
}
}
}
// ---------------------------------------------------------------------
for (int i = 1; i > 0; i--)
{
Serial << "Enter 2nd digit:" << endl;
while(Serial.available() == 0)
{
customKey = customKeypad.getKey();
if (customKey)
{
mtSteps2 = customKey;
Serial.print("You entered: ");
Serial << mtSteps1 << mtSteps2 << endl;
Serial.println();
break;
}
}
}
// ---------------------------------------------------------------------
for (int i = 1; i > 0; i--)
{
Serial << "Enter last digit:" << endl;
while(Serial.available() == 0)
{
customKey = customKeypad.getKey();
if (customKey)
{
mtSteps3 = customKey;
Serial.print("You entered: ");
Serial << mtSteps1 << mtSteps2 << mtSteps3 << endl;
Serial.println();
break;
}
}
}
// 'steps' conversion from char to int -----------------------------------
mtSteps1INT = char2int(mtSteps1);
if (mtSteps1INT == 48)
{ mtSteps1INT = 0; }
delay(20);
mtSteps2INT = char2int(mtSteps2);
if (mtSteps2INT == 48)
{ mtSteps2INT = 0; }
delay(20);
mtSteps3INT = char2int(mtSteps3);
if (mtSteps3INT == 48)
{ mtSteps3INT = 0; }
delay(20);
steps = (mtSteps1INT * 100)+(mtSteps2INT * 10)+mtSteps3INT;
Serial << steps << " steps" << endl;
// 'motor ID' and 'direction' conversion from char to int ----------------------
mtIDINT = char2int(mtID);
mtDirINT = char2int(mtDir);
if (mtDirINT == 1)
{ mtDirBLN = HIGH; }
delay(20);
if (mtDirINT == 2)
{ mtDirBLN = LOW; }
delay(20);
if (mtIDINT == 1)
{
motor1.step(steps, mtDirBLN, DOUBLE); // this will run the motor
Serial << "motor1.step(" << steps << ", " << mtDirBLN << ", " << "DOUBLE)" << endl;
}
else
if (mtIDINT == 2)
{
motor2.step(steps, mtDirBLN, DOUBLE); // this will run the motor
Serial << "motor2.step(" << steps << ", " << mtDirBLN << ", " << "DOUBLE)" << endl;
}
delay(20);
// ---------------------------------------------------------------------
} // end of function
// *****************************************************************************
void setup()
{
Serial.begin(9600);
} // end of SETUP *************************************************************
// *****************************************************************************
void loop()
{
customKey = customKeypad.getKey();
if (customKey)
{
if (customKey == 'A')
{
entry();
}
}
}
我现在正在更改“lcd ....”的“Serial ....”,它可以与我的液晶显示器配合使用。这是基本代码,我现在必须对其进行微调。 -Cl
答案 0 :(得分:0)
首先,以增量方式处理此问题。也就是说,首先只需读取键盘并通过串行线路在PC上显示其输出。在使用此工作之后,编写代码将条目转换为整数。
请提供仅显示键盘条目的代码示例,然后提供将该条目转换为整数的示例。
答案 1 :(得分:0)
根据您的评论,这是您的代码,还有一个额外的评论行。在嵌套ifs的深处是语句int customKeyINT = 2;
,int
将块变量声明为一个“掩盖”同名全局变量的整数。
删除该行的int
部分,使其显示为:customKeyINT = 2;
。最后两个serial.println
语句也会显示2和6,但前提是您在键盘上按2。因此,尝试使用atoi
语句作为更通用解决方案的下一个增量步骤。
// global variable
int customKeyINT;
// global variable
char customKey;
void setup()
{
Serial.begin(9600);
}
void loop()
{
char customKey = customKeypad.getKey();
if (customKey)
{
if (customKey == '2')
{
// the following line of code is the culprit:
int customKeyINT = 2;
Serial.println(customKeyINT); // Serial Monitor: 2 (OK)
Serial.println(customKeyINT * 3); // Serial Monitor: 6 (GREAT!!)
}
Serial.println(customKeyINT);
// Serial Monitor: 0 (why if it's a global var.?)
Serial.println(customKeyINT * 3);
// Serial Monitor: 0 (ditto) Thanks! –
}
}