1

我想将从我的 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

4

2 回答 2

0

首先,逐步解决这个问题。也就是说,首先简单地读取键盘并通过串行线路将其输出显示在 PC 上。在你让它工作之后,然后编写代码将条目转换为整数。

请提供简单显示键盘条目的代码示例,然后提供将该条目转换为整数的示例。

于 2013-07-30T21:08:38.067 回答
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! –
     }
 } 
于 2013-08-01T04:22:51.353 回答