Ввод чисел с точкой с помощью матичной клавиатуры 4x4

blackClover
Offline
Зарегистрирован: 27.08.2020

Доброго времени суток! Подскажите пожалуйста как организовать ввод чисел с точкой с помощью матичной клавиатуры 4x4, чтобы числа отображались на жк-дисплее и хранились в переменной, уже ломаю голову не первый день, и нигде не нахожу нужной информации. Вот код выполняющий действия считывания с клавиатуры:

void loop() {
  while (true) {
    char customKey = customKeypad.getKey();
    if (customKey >= '0' && customKey <= '9') {
      
      keyWholeNum = keyWholeNum * 10  + customKey - '0';
     
      LCD.setCursor(0, 0);
      LCD.print(keyWholeNum);
      Serial.println(keyWholeNum);
    }
 
    if (customKey == 'C') {
 
      //      Serial.println(digitalNumber);
      keyWholeNum = 0;
      LCD.clear();
    }
 
    
  }
}
nik182
Offline
Зарегистрирован: 04.05.2015

Сначала набираете строку. По вводу символа окончание ввода преобразуете строку в число.

Green
Offline
Зарегистрирован: 01.10.2015

См. atof().

blackClover
Offline
Зарегистрирован: 27.08.2020

Привет всем, все тот же вопрос.

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

b707
Offline
Зарегистрирован: 26.05.2017

blackClover пишет:

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

Тут помогают только тем, у кого есть свой код (пусть даже неправильный). Покажите, как Вы пытались решить проблему, приведите код.

А если никак не пытались - начинать разговор не имеет смысла.

blackClover
Offline
Зарегистрирован: 27.08.2020
 while (true) {
    customKey = customKeypad.getKey();
    if ((customKey  >= '0' && customKey <= '9') || customKey == '.') {
      str = str + customKey;
      char myStr1[10];
      str.toCharArray(myStr1, str.length());    // копируется String в массив myStr1
      LCD.print(str);

    }

Массив символов создан для дальнейшего превращения во float, и я не могу понять как сделать так, чтобы при нажатии кнопки окончания строки происходила конвертация string -> float и результат сохранялся в переменную.

b707
Offline
Зарегистрирован: 26.05.2017

 Надеюсь то, что при чтении каждого нового символа вы создаете новый массив- это не более чем тестовый код, чтобы показать приращение строки? - вы понимаете, что в окончательном коде так делать нельзя? - будем считать, что понимаете.

Тогда все просто. Делаете еще одно условие (по аналогии со строкой 3) на то, что новый принятый символ - конец строки (я не знаю, какой у вас символ на клавиатуре для этого используется). Когда приняли этот символ - вышли из цикла, только после этого создали массив char,  преобразовали str в массив - и можете использовать его для конвертации строчки во float функцией atof()

blackClover
Offline
Зарегистрирован: 27.08.2020

b707 пишет:

 Надеюсь то, что при чтении каждого нового символа вы создаете новый массив- это не более чем тестовый код, чтобы показать приращение строки? - вы понимаете, что в окончательном коде так делать нельзя? - будем считать, что понимаете.

Тогда все просто. Делаете еще одно условие (по аналогии со строкой 3) на то, что новый принятый символ - конец строки (я не знаю, какой у вас символ на клавиатуре для этого используется). Когда приняли этот символ - вышли из цикла, только после этого создали массив char,  преобразовали str в массив - и можете использовать его для конвертации строчки во float функцией atof()

Я только начинающий программист, и мне была поставлена задача разработать один проект, и вот я решил взяться за ардуино. 

Я принял во внимание Ваши замечания, и вот такой код у меня вышел, только проблема в том что при переводе массива во float, теряется точность. Ввожу 5.5 а после конвертации получаю  5.00.

И подскажите еще такое, мне нужно вводить два параметра, чтобы они отображались на дисплее и при нажатии на символ окончания  ввода по очереди конвертировались в другие типы, как организовать такой алгоритм?

void loop() {
  
    LCD.setCursor(0, 0);
    LCD.print("L=");
    LCD.setCursor(2, 0);
  


  while (true) {

    char customKey = customKeypad.getKey();
    if ((customKey  >= '0' && customKey <= '9') || customKey == '.') {
      str = str + customKey;
      
      
      LCD.print(customKey);
      
    }
    if (customKey == 'A') {
     
      break;
    }
   
  }
   char myStr1[10];
    str.toCharArray(myStr1, str.length());    // копируется String в массив myStr1
    L = atof(myStr1);
    LCD.setCursor(0, 1);
    LCD.print(L);
}

я только начинающий программист, и мне была поставлена задача разработать проект, и вот я 

b707
Offline
Зарегистрирован: 26.05.2017

1)не вижу, как описана переменная L

2) не знаю точно, но возможно. что функция atof() в ардуино не работает. В ардуино очень сильно урезана поддержка типа float.

Старайтесь обходится целыми. Например вместо 5.5 на клавиатукре можно вводить 55, а потом преобразовывать во float уже в программе делением на 10

sadman41
Offline
Зарегистрирован: 19.10.2016

Неделю назад atof() работала. Что, правительство и до нее дотянулась?

b707
Offline
Зарегистрирован: 26.05.2017

sadman41 пишет:
Неделю назад atof() работала. Что, правительство и до нее дотянулась?

ну я просто предположил. printf с float в ардуине не работает, думал может и atof() тоже :)