Вывод переменной float на lcd 1602

Тема в разделе "Arduino & Shields", создана пользователем Кирилл Лаврентьев, 19 июл 2016.

  1. Всем привет! У меня возникла проблема при выводе переменной типа float на экран lcd 1602, подключённый через I2C. Переменная выводится на экран, но иногда вместо корректного значения выводится надпись "inf". Попробовал передавать значения переменной в компьютер через последовательный порт, там тоже выводится вместо числа надпись "inf". Что это такое? Как избавиться от этого "inf"?
    Переменные Speed, Radius имеют тип volatile float (скорость считается в прерывании INT0),
    переменные Seconds, LastSeconds имеют тип volatile unsigned long.

    5.jpg 1.jpg 2.jpg 3.jpg 4.jpg .


    Таким образом я считаю скорость
    Код (C++):
      Speed=(((2.0*3.1428*Radius)/(Seconds-SecondsLast))*3.6); //скорость в км\ч
      jj=jj+Speed;// Суммируем все скорости, чтобы потом посчитать среднюю скорость
      SecondsLast=Seconds;
    Так я вывожу значение скорости на lcd
    Код (C++):
        lcd.setCursor(0,0);
        lcd.print("Speed:");
        lcd.setCursor(12,0);
        lcd.print("km/h");  
        lcd.setCursor(6,0);
        lcd.print(Speed,1);
        lcd.print(" ");
     
  2. Vetrinus

    Vetrinus Гик

    Попробуйте объявить десятичный базис числа
    Код (C++):
    lcd.print(Speed, DEC);
     
  3. AlexU

    AlexU Гуру

    'inf' означает, что число имеет бесконечное значение. Постоянно увеличивая переменную 'jj' в какой-то момент времени происходит превышение предела для типа 'float' и значение переменной 'jj' становиться равным 'inf' (infinite -- бесконечный). Любая операция с таким числом вернёт также значение 'inf', за исключением NaN -- операции с NaN всегда возвращают значение 'nan'.
     
    Igor68, Кирилл Лаврентьев и Vetrinus нравится это.
  4. AlexU, спасибо за объяснение) Vetrinus, ваш совет не помог.
    Всё-таки я не до конца понимаю. У меня "inf' появляется, если модель пересекает датчик с большой скоростью, то есть времени между кругами прошло немного, скажем 0,001 секунда. Положим радиус равен 15 м (float Radius=15.0). Получаем по формуле выше значение float Speed=(2*3.1428*15.0*3.6)/(0.001)=339422.2
    Переменная типа float может принимать значения в интервале от -3.4028235×10^38 до 3.4028235×10^38, переменная Speed попадает в этот интервал, но почему тогда на экране выводится надпись "inf"? Может быть, я рассуждаю неверно? Подскажите, в чём я ошибаюсь?
     
  5. Vetrinus

    Vetrinus Гик

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

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

    Деление на 0?
     
  8. DIYMan

    DIYMan Guest

    Ошибка в непонимании того, как представлены числа с плавающей запятой в компьютере: 0.001 - это совсем не 0.001 с точки зрения хранения информации в МК. И вполне вероятен вариант, что при таких малых величинах может случиться банальное деление на 0.
     
  9. Действительно, у меня получалось деление на ноль. При достаточно быстром пересечении датчика моделью в переменных Seconds и SecondsLast оказывались довольно близкие значения. Разность этих переменных в представлении МК даёт ноль, отсюда и была надпись "inf". Vetrinus, я воспользовался вашим советом и обнаружил свою ошибку. Спасибо всем, кто откликнулся! Проблему считаю решённой!
     
  10. ELISEY

    ELISEY Нуб

    Подскажи ты сделал расходомер топлива? можешь описать схему с ардуино что куда и как? )