Редактирование значения переменной с помощью кнопок на LCD дисплее

Тема в разделе "Arduino & Shields", создана пользователем sergey_mak, 5 янв 2015.

  1. sergey_mak

    sergey_mak Нуб

    Здравствуйте, такой вопрос. В программе имеются переменная - настроечный коэффициент, типа double, к примеру, consKp=0.044 Мне необходимо иногда его редактировать, целую и дробную часть, то есть число отображается на дисплее, кнопками влево вправо нужно двигать курсор по разрядам, а кнопками вверх вниз соответственно увеличивать и уменьшать разряд, под которым курсор. При этом при каждое изменение должно сохраняться. Ума не приложу как это можно сделать, помогите пожалуйста, натолкните на мысль. Спасибо.
     
  2. Unixon

    Unixon Оракул Модератор

    Храните в памяти поразрядное представление числа, по кнопкам меняете опять его и обновляете отображение на дисплее, а потом, когда нужно использовать как одно число, - собираете все отдельные разряды в одну переменную double суммированием.
     
  3. sergey_mak

    sergey_mak Нуб

    То есть мне нужно число представить в виде строки или массива, каждый элемент которого есть разряд числа?
     
  4. ANV

    ANV Гуру

    Да, это называется BCD кодировка

    Так будет реально проще, особенно для числа, которое должно стать числом с плавающей точкой - избежите возможных фокусов представления числа
     
  5. sergey_mak

    sergey_mak Нуб

    Спасибо, теперь надо думать как double в массив перегнать.
     
  6. Unixon

    Unixon Оракул Модератор

    А нужно ли? Может начальное значение проще сразу загнать в массив "как есть"...
     
  7. sergey_mak

    sergey_mak Нуб

    Да, это я перемудрил. Ничего преобразовывать вообще не надо. Кнопками вправо, влево просто менять шаг приращения или убавления по закону 0.001, 0.01, 0.1, 1, а кнопками вверх вниз соответственно прибавлять или удалять. Спасибо за помощь!
     
  8. Unixon

    Unixon Оракул Модератор

    Это на самом деле довольно корявое решение, хоть и выглядит просто. Дело в том, что в двоичном представлении (внутри double) нет полного соответствия десятичному представлению и при таких манипуляциях будет накапливаться ошибка. К тому же, у вас появляется куча ненужных вычислений, связанных с преобразованием double в строку (а то и обратно).
     
  9. sergey_mak

    sergey_mak Нуб

    Не понимаю зачем преобразовывать. Переменная double будет храниться в eeprom, при инициализации она будет считана, а кнопками буду прибавлять или удалять к ней либо 0.001 либо 0.01, либо 0.1, либо 1, в зависимости от того какой разряд надо изменить, а дисплей лишь выводит эту переменную, ну и курсор подставлять в редактируемый разряд. Поясните, где я ошибаюсь, на самом деле не понимаю зачем над числом делать преобразования в строку и обратно.
     
  10. Unixon

    Unixon Оракул Модератор

    Когда вы выводите double на дисплей вы так или иначе преобразуете его в строку. Обратного преобразования в этом случае нет, конечно. Но это не главное.

    Просто хотел предупредить об ошибках округления, которые у вас неизбежно будут при таком способе редактирования числа. Скорее всего, длины double хватит, чтобы до значимых разрядов это не дошло.
     
  11. sergey_mak

    sergey_mak Нуб

    Понял теперь, думаю ошибка не проявится, этот параметр нечасто будет изменяться. Спасибо.