Пиво тому, кто поможет сохранить число (45.783266) в eeprom, а потом его вызвать в переменную!

Тема в разделе "Схемотехника, компоненты, модули", создана пользователем evganiy32, 15 апр 2019.

  1. evganiy32

    evganiy32 Нуб

    Ситуация такая. Мне надо сохранить координаты GPS в eeprom, а потом загрузить их в переменную, для скормления библиотеки TinyGPS для указания целевой точки GPS. Чтобы робот мог запоминать координаты, а потом в них возвращаться.
    Проблема в том, что float такого числа, (когда есть две цифры до запятой) имеет точность всего 5 цифр после запятой, т.е. число 45.78326 легко запоминается и вызывается, а вот если добавить еще одну цифру после (разрядность), то получается ерунда... Также не работают законы математики с такими числами. Например 45.783266+0,000001 не равно 45.783267...
    Либо помогите поправить библиотеку, чтобы можно было задавать целевую широту и долготу целыми числами...
     
  2. DetSimen

    DetSimen Гуру

    считай тогда и храни в BCD

    вапще, прочитай чонить про вычисления с фиксированной точкой. да прикрути к AVR
     
    Последнее редактирование модератором: 15 апр 2019
    Daniil нравится это.
  3. А какие переменные принимает библиотека tinygps?
     
  4. DetSimen

    DetSimen Гуру

    да, думаю, такие же (тот же дубовый float).
     
  5. А можно не думать, а знать, может быть?
     
  6. DetSimen

    DetSimen Гуру

    ну лана, думать больше не буду, раз низзя.
     
  7. evganiy32

    evganiy32 Нуб

    видимо не все понимают суть проблемы.
    Если на ардуине посчитать пример 45.783266+0,000001 = 45.783264
    Если на ардуине сохранить в eeprom 45.783266, то при вызове получим другое число (45.783267)
    Любая операция с числом 45.783266 приводит к его изменению!
     
  8. b707

    b707 Гуру

    Интересно, 45.783266 - это широта или долгота?
    Если широта, то ошибка 0.000001 = 11 см
    А если долгота - то 8 см
    Ни один бытовой GPS не дает точности определения коррдинат даже в 1 метр, так что сохранять шестую цифру в ЕЕПРОМ нет ни малейшего смысла, там пятая-то не всегда нужна...
     
  9.  
  10. b707

    b707 Гуру

    математически суть проблемы вполне понятна. И решение ее очень простое -написать свое собственное представление класса флоат. Например, храннить целую часть как int, а вещественную - как long

    Только на практике это не нужно
     
    Daniil нравится это.
  11. evganiy32

    evganiy32 Нуб

    double LONDON_LAT = 51.508131;
    double LONDON_LON = -0.128002;
    double distanceToLondon = TinyGPSPlus::distanceBetween(gps.location.lat(),gps.location.lng(),LONDON_LAT, LONDON_LON);

    Библиотека tinygps как-то оперирует с такими числами, т.к. (к примеру) gps.location.lat()=45.783266;
     
  12. DetSimen

    DetSimen Гуру

    на восьмибитках double==float.
     
  13. b707

    b707 Гуру

    а вы в компьютерах - совсем ни бум-бум? что такое double - не в курсе? - откройте гугль и почитайте.
    Проблема в том, что на ардуине нет double.
    Так что остается либо написать его самостоятельно, либо смирится с точностью только в пять цифр после запятой.
     
  14. evganiy32

    evganiy32 Нуб

    А вот это дельная мысль! Сейчас проверю!

    Что значит нет? Есть, только в ардуине double=float! Просто привел пример из скетча. Я ведь задавал вопрос про float!

    Видимо проблему обойти не смогу, буду использовать 5 цифр

    Я пробовал так делать - проблема возникает при сборке числа. Итоговое число всегда отличается от частей...
     
    Последнее редактирование модератором: 15 апр 2019
  15. Замечательно. Теперь следующий вопрос: зачем вам хранить данные в большем разрешении, чем принимает библиотека?
     
  16. Daniil

    Daniil Гуру

    это как с корнем кубическим из минус единицы. ((-1)^(1/3)) Кто-то скажет, что ответ -1, а кто-то 0.5+0.8660254038i. Надо разобраться как работает используемый инструмент и необходимость такой точности.
    Если такая точность необходима, то нужно писать свою собственную реализацию чисел с плавающей зпт. Но! Придется и переписывать библиотеку, т.к. уверен, что она не будет с самописной реализацией вашего типа.
    Даже если удасться записать ваше число в еепром, то в функцию всё равно будет уходить "округленное" число
     
  17. evganiy32

    evganiy32 Нуб

    Почему в большем? Библиотека как раз понимает 6 разрядов, только не понимаю как ))
    Либо 6 разряд в широте и долготе она выводит "от балды" ))
     
  18. Хорошо, давайте еще раз посмотрим внимательно на то, какой тип принимает библиотека.
     
  19. evganiy32

    evganiy32 Нуб

    Вы действительно правы! 6 разряд необязателен.
    Т.к. вы первый помогли решить мою проблему, как я и обещал, с меня пиво! :) Присылайте в личку куда скинуть денюшку!

    Всем спасибо за помощь в решении проблемы!
     
  20. b707

    b707 Гуру

    пожалуйста!
    Денег не надо - не за что. Вот если вам действительно нужно будет хранить такое число в ЕЕПРОМ - обращайтесь :)