Переменные клавиатуры Arduino к последовательному порту

serial string keypad

Я уже больше недели пытаюсь создать программу, которая будет хранить мои нажатия клавиш в переменной, а при нажатии клавиши enter она переключится на следующую переменную для хранения нажатий. Программа предназначена для загрузки адресов (в основном IP-адресов) на различные устройства по последовательным соединениям. Поскольку существуют различные типы адресов, каждый раз, когда пользователь нажимает enter на клавиатуре (сделал кнопку # символом '\r'), программа должна переключиться на следующий тип адреса, получить нажатия клавиш с клавиатуры и сохранить их до следующего нажатия '\r'. Моя проблема в том, что я не знаю, как хранить эти адреса в Arduino, и переключаюсь на другой "char" (я использовал char, потому что не знал, как преобразовать их для хранения нажатий клавиш в строку) при каждом нажатии "\r". Я включил обработчик для этой части моего кода. Это мой первый пост здесь, так что если что-то пропало, дайте мне знать. заранее спасибо.

bool handlerManualEntry( void )
{
    static uint8_t stateManualEntry = statesFunc::ST_INIT;
       
    char keyval = ReadKey();
    switch( stateManualEntry )
    {
        case    statesFunc::ST_INIT:
            //делайте все, что вам нужно Здесь (экран, переменные и т.д.)
                      
            stateManualEntry = statesFunc::ST_RUN;
           
        break;

        case    statesFunc::ST_RUN:
            //есть ли нажатие клавиши?
            if( keyval != NO_KEY )
            {
                switch( keyval )
                {
                  
                    case    '\r':
                        //когда мы получим возврат, отправьте его в последовательный порт
                        Serial.print( '\n' );
                        u8g2log.print('\f');
                        for(int i=0; i<6; i++)
                        {
                          if(i == 0)
                          {
                          Serial.print(ethernetIP);
                          }
                        else if(i == 1)
                          {
                          Serial.print(ethernetSubnet);
                          }
                        else if(i == 2)
                          {
                          Serial.print(ethernetGetway);              
                          }
                        else if(i == 3)
                          {
                          Serial.print(vmeIP);
                          }
                        else if(i == 4)
                          {
                          Serial.print(vmeSubnet);
                          }
                        else if(i == 5)
                          {
                          Serial.print(eventPort);
                          }
                        else if(i == 6)
                          {
                          Serial.print(timeOut);
                          }
                        }
                        //и закончите тем, что вернете состояние в INIT и вернете true
                        //stateManualEntry = statesFunc::ST_INIT;
                        //return true;
                       
                    break;
                    case 'D':                    
                          u8g2log.print('N');
                          Serial.print('N');                                                   
                    break;

                         
                    case 'C':                  
                          u8g2log.print('Y');
                          Serial.print('Y');                         
                    break;
       
                    default:
                        //для любого другого ключа, печать на последовательный порт и ЖК-дисплей
                        u8g2log.print(keyval);
                        
                        enterAddresses();   
                    break;
                   
                }
               
            }
           
        break;

    }

    return false;

}

void enterAddresses()
{
  int x;
  if(keyval != '\r')
  {
    if(pointer == 1)
    {

      keyval = keypad.getKey();
      u8g2log.print(keyval);
      ethernetIP += keyval;
    }
    else if(pointer == 2)
    {
      keyval = keypad.getKey();
      u8g2log.print(keyval);
      ethernetSubnet += keyval;
      }
    }
    else if(pointer == 3)
    {

      keyval = keypad.getKey();
      u8g2log.print(keyval);
      ethernetGetway += keyval;
                
    }
    else if(pointer == 4)
    {
      keyval = keypad.getKey();
      u8g2log.print(keyval);
      vmeIP += keyval;
    }
    else if(pointer == 5)
    {
        keyval = keypad.getKey();
      u8g2log.print(keyval);
      vmeSubnet += keyval;
    }
    else if(pointer == 6)
    {
      keyval = keypad.getKey();
      u8g2log.print(keyval);
      eventPort += keyval;
    }
    else if(pointer == 7)
    {

      keyval = keypad.getKey();
      u8g2log.print(keyval);
      timeOut += keyval;

    }
    pointer++;
    u8g2log.print('\f');
  
}

char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'.','0','\r','D'}
};

byte rowPins[ROWS]={39,41,43,45};
byte colPins[COLS]={31,33,35,37};
    
//Create an object of keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
char keyval;

, 👍1

Обсуждение

пожалуйста, отформатируйте весь код, а не только его части ... он не читается так, как вы его представили, @jsotola

в чем причина использования for(int i=0; i<6; i++) запускать семь команд ' Serial.print()` последовательно?, @jsotola


1 ответ


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

Упростите свой код, введя правила ввода IP-адреса. При вводе адреса IPv4 в десятичной системе счисления требуется, чтобы все 3 цифры всегда использовались для каждого из четырех четырехточечных обозначений. Например, адрес IPv4 192.168.10.20 будет введен как "192168010020".

  • Устраните ненужные кнопки клавиатуры.

Единственными ключами, необходимыми для приведенной выше схемы, являются 0, 1, 2, ..., 9. Никакие другие ключи не должны быть обнаружены или поддерживаться дополнительным программным обеспечением.

  • Начните с простого, заставьте это работать, а затем добавьте сложность.

По сути, конечный автомат чаще всего используется в качестве базового шаблона кодирования при взаимодействии с пользователем. Отслеживание того, что сделал пользователь, в каком текущем состоянии он находится и куда он может пойти, является задачей конечного автомата. Чтобы реализовать вышесказанное, конечный автомат должен быть достаточно сложным, чтобы отслеживать положение 1, 10 и 100 секунд для каждого значения четырехточечной записи, а также то, какое значение четырехточечной записи вводится в данный момент. Это достаточно сложно для первого прохода. Позже, при последующих проходах, подумайте о добавлении клавиши "прервать", когда пользователь почувствует, что новая попытка в порядке. Еще позже рассмотрите возможность добавления клавиши "пробел". Наконец, подумайте о том, чтобы добавить клавишу "enter" и ввести 3 цифры для каждого требования к значению с четырьмя точками.

,