Страница 5 из 14

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 11:01
Сергей Саныч
aftaev писал(а):функция GetTemperature считывает температуру с датчиков DS18b20 и выдает их в виде 23,33
НУЖНО УБРАТЬ один знак после запятой
Понял, щас напишу.

float Fr_min = 23.33; // это якобы получили от датчика
int Fr_min1; // промежуточная переменная, где храним значение температуры в десятых долях градуса
char string[20]; // строка, используемая для вывода
Fr_min1 = (int)(Fr_min*10); // умножаем на 10 и преобразуем float в int
sprintf(string, "Fr_min %3d.%-01d", Fr_min1/10, Fr_min1%10); // перевод значения в строку, отдельно целую часть и дробную.
lcd.print(string);

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 11:13
aftaev
Serg-tmn писал(а):Объяви переменные, как int, а не float. И значения присвой не 23.33, а 233
А смысл? При объявлении переменной температура будет записываться функцией GetTemperature как 23 дробная часть вообще отбросится

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 11:17
Сергей Саныч
aftaev писал(а):А смысл? При объявлении переменной температура будет записываться функцией GetTemperature как 23 дробная часть вообще отбросится
Я уже исправился :? http://www.cnc-club.ru/forum/viewtopic. ... 291#p43288
просто не знал, откуда ты берешь значения температуры и в каком формате.

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 11:34
aftaev
Serg-tmn писал(а):Понял, щас напишу.
Так заработало только. Спасибо!
нужно вывести
23.3 23.4 34.5 45.6
34.5

Тобишь без всяких буков. Попробую вечером разобраться

В описании Ардуино не нахожу чтоб число преобразовать в строку, а потом отрезать нужное кол-во символов. В бейсике есть така функция Left(s,1) или Riht(s,1). В Си наверно тож есть

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 12:03
Сергей Саныч
aftaev писал(а):нужно вывести
23.3 23.4 34.5 45.6
34.5
sprintf(string, "%3d.%-01d", Fr_min1/10, Fr_min1%10);
Это без лишних букв для одного числа. Для нескольких просто повторяешь с нужными переменными. Возможно, потребуется устанавливать курсор дисплея в нужные места.
Но лучше будет написать функцию вывода и вызывать с нужными параметрами.
aftaev писал(а):В описании Ардуино не нахожу чтоб число преобразовать в строку, а потом отрезать нужное кол-во символов. В бейсике есть така функция Left(s,1) или Riht(s,1). В Си наверно тож есть
Есть-то они есть, но не в самом Си, а в библиотеках.
Но проблема твоя похоже была в другом - данная реализация sprintf() не поддерживает вывода чисел с плавающей точкой. Пришлось идти в обход (как нормальные герои :) )

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 12:06
Тима
т.е. пришли к варианту, который я предлагал с уможением на 10 и отделением целой части...
все таки только через з..у и получилось :)

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 12:13
Сергей Саныч
Тима писал(а):т.е. пришли к варианту, который я предлагал с уможением на 10 и отделением целой части.
А куда деваться?

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 12:17
Тима
так предложил еще на второй странице обсуждения, а исписали 5причем ни одного оффтопа.

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 12:21
Serg
Так, погодите, не углу***йтесь в дебри. В ардуино не просто AVR/GCC, а есть ещё свой препроцессор со свими тараканами.
Делайте с оделением целой и дробной частей и без всяких sprintf.

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 12:37
Тима
по описанию должен сработать lcd.print(A, 1), только я думаю надо писать именно lcd.print , а не lcd.println. приставка ln это перевод курсора на следующую строку прсле вывода текста. может эта приставка и мутит воду.

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 12:53
Serg
lcd.print("Fr");
lcd.print(Fr_min/1, 2);
lcd.print(".");
lcd.print(Fr_min*10%10);
lcd.print("-");
lcd.print(Fr_max/1, 2);
lcd.print(".");
lcd.print(Fr_max*10%10);

и т.д.

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 13:00
Тима
работвет команда sprlntf или столбик команд снизу? или это один код?

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 13:05
Serg
Тима писал(а):работвет команда sprlntf или столбик команд снизу? или это один код?
Проверить работу sprlntf в ардуине не могу - не помню где моя валяется и ломает подключать к ней дисплей. :beer_blow:
Это не один код - это код дающий результат, которого тут хотят добиться от sprintf уже несколько страниц. :hehehe:

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 13:10
Сергей Саныч
UAVpilot писал(а):Fr_min/1
это как? вместо (int)Fr_min?

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 14:03
aftaev
Тима писал(а):все таки только через з..у и получилось
Тима, я кучу вариантов знаю как через задницу сделать хотелось printf опробовать в действии

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 14:09
Serg
(int)Fr_min - это не отбрасывание, а преобразование типа. А т.к. С это всётаки фактически ассеблер, то использование в таком ключе может сыграть злую шутку.
На самом деле и Fr_min/1 тоже не стоит использовать т.к. при оптимизации компилятор может это действо сократить, а в артуинском IDE похоже управлять оптимизатором невозможно. Поэтому правильнее будет вот такой код:
lcd.print((int)trunc(Fr_min), 2);
и
lcd.print((int)rint(Fr_min*10+0.01)%10);

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 14:12
Serg
aftaev писал(а):Тима, я кучу вариантов знаю как через задницу сделать хотелось printf опробовать в действии
при этом ты используешь для этого псевдоязык реализованный слегка через задницу. :good:

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 14:17
Тима
да я бы не сказал что способ предложенный мной это через задницу. это способ сделать на простых командах, не прибегая к спец.командам.

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 14:56
Сергей Саныч
UAVpilot писал(а):lcd.print((int)trunc(Fr_min), 2);
и
lcd.print((int)rint(Fr_min*10+0.01)%10);
Не, ну и так, наверно, можно.
Но через дополнительную переменную однозначнее:
int temp;
temp = (int)trunc(Fr_min*10.); // уходим от плавающей арифметики
ну и дальше использовать temp/10 и temp%10

а вообще, почему-то вспомнилась байка про барометр и высоту небоскреба ;)

Re: Мои проекты на Ардуино

Добавлено: 08 ноя 2012, 16:40
vladimir74
подключить библиотеку math.h не вариант?
#include <math.h>
самому проверить негде поэтому выскажу мысль до конца.

умножаем на 10 округляем до целого, делим на 10