Как заставить выводить цыфры после запятой.

Тема в разделе "Arduino & Shields", создана пользователем Ariadna-on-Line, 19 окт 2023.

  1. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Выводятся значения температуры, НО постоянно с двумя нолями после запятой.
    void loop() {

    float IntTemp = read_IntTemp(); // Получили значение сенсора в милливольтах
    // Пересчитываем в градусы
    IntTemp = -(25/54648) * IntTemp * IntTemp + (33515/27324) * IntTemp - (195640/621);

    lcd.print(IntTemp);
    }
    //===================
    float read_IntTemp() {
    analogReference(INTERNAL);
    delay(2);
    long result_1 = analogRead(4); // получили целочисленный отсчет
    // Пересчитываем его в значение в милливольтах
    float result = (1100L * result_1) / 1023; // Calculate V (in mV); 1100mV = 1.1V

    return result; // Он должен уже быть числом с цыфрами после запятой
    } //
    //===================
    Ясное дело что с АЦП идут целочисленные отсчеты. Их надо превратить в температуру с цифрами после запятой. Что-то у меня это не получается.
     
    Последнее редактирование: 19 окт 2023
  2. User248

    User248 Гик

    С одним нолём после запятой:
    Код (C++):

    lcd.print(IntTemp, 1);
     
    Или так:
    Код (C++):

    lcd.print(String(IntTemp, 1));
     
     
  3. Ariadna-on-Line

    Ariadna-on-Line Гуру

    У меня есть даже две цифры после запятой, но всегда нули !!!
     
  4. User248

    User248 Гик

    Не так понял вопрос. У вас там целочисленные операции. Естественно, округляются до целых. Нужно перевести во float.
    Например, такой вариант:
    Код (C++):

    float result = (1100L * float(result_1)) / 1023; // Calculate V (in mV); 1100mV = 1.1V
     
    Или так:
    Код (C++):

    float result = (1100L * result_1) / 1023.0; // Calculate V (in mV); 1100mV = 1.1V
     
     
    Ariadna-on-Line нравится это.
  5. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Спасибо. Работает. Наткнулся на это решение сам чуть-чуть раньше - тупо методом проб и ошибок. Спасибо.
    ПС. Вообще-то я всегда считал, что в возникающие при делении цифры после запятой не должны округляться до целых, коль ожидаемый результат задан как float.
     
    Последнее редактирование: 19 окт 2023
  6. Asper Daffy

    Asper Daffy Иксперд

    Кто, кроме Вас, об этом знает? Никто :(
     
    parovoZZ нравится это.
  7. parovoZZ

    parovoZZ Гуру

    Очень хотелось бы ожидаемый результат задать как string и надеяться, что он таким и будет. Увы, это так не работает.
    Причём я даже не знаю языка, который бы так делал.
     
  8. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Понятно. Как всегда - ларчик открылся просто, но с другой стороны.
    ПС. Чем дальше влез - тем толще партизанки. Получил ожидаемые цифры после запятой. НО - получаются дискретные цифры с интервалом 2,15 'C. 14.03 16.18 18.33 20.48 Вручную подставляя байты вместо АЦП получил (см. ниже). Почему-то с АЦП теряется младший бит.
    306 - 14.03
    307 - 15.10
    308 - 16.18
    309 - 17.25
    310 - 18.32 и тд.
     
  9. User248

    User248 Гик

    Вообще не понятно, зачем такие астрономические числа используются?
    Код (C++):

    IntTemp = -(25/54648) * IntTemp * IntTemp + (33515/27324) * IntTemp - (195640/621);

    float result = (1100L * result_1) / 1023; // Calculate V (in mV); 1100mV = 1.1V
     
    Здесь только double может помочь.
     
  10. User248

    User248 Гик

    И дроби везде проставить:
    Код (C++):

    IntTemp = -(25/54648.0) * IntTemp * IntTemp + (33515/27324.0) * IntTemp - (195640/621.0);

    float result = (1100L * result_1) / 1023.0; // Calculate V (in mV); 1100mV = 1.1V
     
    И можно без ноля, только с точкой:
    Код (C++):

    IntTemp = -(25/54648.) * IntTemp * IntTemp + (33515/27324.) * IntTemp - (195640/621.);

    float result = (1100L * result_1) / 1023.; // Calculate V (in mV); 1100mV = 1.1V
     
     
  11. parovoZZ

    parovoZZ Гуру

    Js тоже не режет точность вычисления, но я про строки.
     
  12. parovoZZ

    parovoZZ Гуру

    В младшему бите любого АЦП - шум. Его никто не использует.
     
  13. User248

    User248 Гик

    Python V2 относился к целым числам как язык си, а Python V3 похоже все числа воспринимает как float64. Можно спокойно делить целое на целое, а на выходе будет дробное.
     
  14. parovoZZ

    parovoZZ Гуру

    Эээээ ты с термопарой работаешь? Почему такая высокая дискретность?

    Для чего значения после запятой, да и ещё два знака, если твоя точность не выше плюс/минус пара градусов?
     
  15. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Не хотел грузить форум, но коль спросили - объясню. МК считывает свой внутренний темо- сенсор и выводит градусы. Код писал сам. Полином пересчета вычислен по инфе из ДШ. Я изначально не знал, что 1 бит будет 1 градус и цифер после запятой не получишь. Зато научился новому. Теперь надо разобраться с младшим битом (получается - он всегда ноль). Может реально брак микрухи ? Или дело в коде. Дискретность 2 градуса все же не того.
    ПС. Код еще измеряет Vcc питалова МК с двумя знаками после запятой. Проверил мультиметром - вполне точно. Но там работает библиотека. В нее не совался.
     
    Последнее редактирование: 20 окт 2023
  16. User248

    User248 Гик

    Проверил. Если не поставить здесь дроби, то результат отличается.
    Код (C++):

    IntTemp = -(25/54648.0) * IntTemp * IntTemp + (33515/27324.0) * IntTemp - (195640/621.0);

    float result = (1100L * result_1) / 1023.0; // Calculate V (in mV); 1100mV = 1.1V
     
     
    Ariadna-on-Line нравится это.
  17. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Показания занижены вдвое.
    ПС. В коде температуры - убрал пересчет оцифровок в милливольты. По инфе из ДШ - рассчитал полином прямой конверсии оцифровок в градусы.
    T = - (1/1960)*LSB*LSB + (235/196)*LSB - (14150/49);
    Показания стали похожи на реальные с дискретностью ок. 1V. В общем тема исчерпана. Всем спасибо.
     
    Последнее редактирование: 21 окт 2023
  18. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Неа. Все же проц с браком. Младший бит АЦП появляется и теряется непредсказуемо. Соответственно меняется дискретность показаний. Ну да бог с ним. На работе алгоритма Герцеля это сильно сказываться вроде не должно.
     
  19. Asper Daffy

    Asper Daffy Иксперд

    То, что он (проц) соответствует техническим характеристикам, приведённым в даташите, теперь называется браком?
    Код (C++):
    ADC absolute accuracy
        (ADC clock=200kHz)  - 2 LSB
        (ADC clock=1MHz)  - 4.5 LSB
     
     
  20. parovoZZ

    parovoZZ Гуру