Преобразование клавиатуры

Я хочу, чтобы числа, вводимые с моей клавиатуры 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();  
        }
   }

}

Теперь я меняю «Серийный номер…» на «ЖК-дисплей…», и он отлично работает с моими ЖК-дисплеями. Это базовый код, теперь мне, конечно, нужно его настроить. -кл


person user2635777    schedule 30.07.2013    source источник
comment
Вы сообщаете нам ожидаемое значение x, но не фактическое значение. Каково фактическое значение X для x=(keyPressed * 3) в вашем коде?   -  person Craig    schedule 31.07.2013


Ответы (2)


Прежде всего, подходите к этой проблеме поэтапно. То есть сначала просто прочитайте клавиатуру и отобразите ее вывод через последовательную линию обратно на ПК. После того, как вы заставите это работать, напишите код для преобразования записи в целое число.

Предоставьте примеры кода простого отображения ввода с клавиатуры, а затем пример преобразования этого ввода в целое число.

person JackCColeman    schedule 30.07.2013
comment
После того, как вы заставите это работать, напишите код для преобразования записи в целое число. - person user2635777; 31.07.2013
comment
интервал customKeyINT; // глобальная переменная char customKey; // глобальная переменная void setup() { Serial.begin(9600); } void loop() { char customKey = customKeypad.getKey(); if (customKey) { if (customKey == '2') { int customKeyINT = 2; Serial.println(customKeyINT); // Serial Monitor: 2 (ОК) Serial.println(customKeyINT * 3); } // Serial Monitor: 6 (ОТЛИЧНО!!) Serial.println(customKeyINT); // Serial Monitor: 0 (почему, если это глобальная переменная?) Serial.println(customKeyINT * 3); } } // Serial Monitor: 0 (dido) Спасибо! - person user2635777; 31.07.2013
comment
прямой вопрос - это функция atoi() для преобразования char в int - person ealcober; 03.03.2021

Согласно вашему комментарию, вот ваш код с одной дополнительной строкой комментария. Глубоко внутри вложенных 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! –
     }
 } 
person JackCColeman    schedule 01.08.2013
comment
Спасибо - проблема решена, я сделал функцию char2int() и все работает нормально. Теперь следующий шаг, который я не могу решить, - это как получить вторую серию записей с клавиатуры. это упрощенный код: - person user2635777; 08.08.2013
comment
void loop() { char customKey = customKeypad.getKey(); if (customKey) { if (customKey == 'A') { Serial.println (нажмите клавишу:); // Последовательный монитор: pritns ok char key = customKeypad.getKey(); if (key) { Serial.print(Вы ввели:); // Последовательный монитор: ничего... Serial.println(key); } } } } - person user2635777; 08.08.2013
comment
@user2635777 user2635777, если вы опубликуете новый вопрос и отправите мне комментарий, я посмотрю на ваш новый код. как это довольно нечитабельно. Однако, как правило, старайтесь выдавать только один customKeypad.getKey()` в loop(), потому что цикл действительно делает именно это, и иногда вы получите ошибки, которые возникают только на второй или третьей итерации цикла. Таким образом, наличие чистой логики только с одним оператором ввода и/или одним оператором вывода позволяет избежать многих проблем. - person JackCColeman; 09.08.2013
comment
спасибо - как вы отправляете отформатированный код? когда я вставляю его, он теряет все форматирование... - person user2635777; 09.08.2013
comment
@ user2635777, когда вы находитесь в режиме редактирования, над областью редактирования появляется панель мини-меню. Вставьте свой код и выберите его, затем нажмите кнопку {}. Кроме того, между текстом и кодом должна быть пустая строка. - person JackCColeman; 09.08.2013
comment
как вы попадаете в «режим редактирования». Также, когда я нажимаю ENTER, он сразу же отправляет комментарий вместо новой строки. Как ввести возврат каретки? я должен сделать комментарий в html? - person user2635777; 10.08.2013
comment
Я имел в виду редактирование вашего кода в вашем вопросе или добавление другого ответа. Не уверен насчет комментариев.‹br/› Справа есть поле справки. - person JackCColeman; 10.08.2013
comment
@JackColeman, наконец, я получил рабочий код для взаимодействия клавиатуры с дисплеем (последовательный монитор и ЖК-дисплей), и я думаю, что понял, как вводить код на этом сайте. Спасибо еще раз! - person user2635777; 12.08.2013