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

Контроллеры, драйверы, датчики, управляющие устройства.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

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

Сообщение Сергей Саныч »

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);
Чудес не бывает. Бывают фокусы.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

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

Сообщение aftaev »

Serg-tmn писал(а):Объяви переменные, как int, а не float. И значения присвой не 23.33, а 233
А смысл? При объявлении переменной температура будет записываться функцией GetTemperature как 23 дробная часть вообще отбросится
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

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

Сообщение Сергей Саныч »

aftaev писал(а):А смысл? При объявлении переменной температура будет записываться функцией GetTemperature как 23 дробная часть вообще отбросится
Я уже исправился :? http://www.cnc-club.ru/forum/viewtopic. ... 291#p43288
просто не знал, откуда ты берешь значения температуры и в каком формате.
Чудес не бывает. Бывают фокусы.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

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

Сообщение aftaev »

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

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

В описании Ардуино не нахожу чтоб число преобразовать в строку, а потом отрезать нужное кол-во символов. В бейсике есть така функция Left(s,1) или Riht(s,1). В Си наверно тож есть
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

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

Сообщение Сергей Саныч »

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() не поддерживает вывода чисел с плавающей точкой. Пришлось идти в обход (как нормальные герои :) )
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Тима
Почётный участник
Почётный участник
Сообщения: 3162
Зарегистрирован: 01 мар 2012, 20:47
Репутация: 1089
Настоящее имя: Тимур
Откуда: КБР
Контактная информация:

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

Сообщение Тима »

т.е. пришли к варианту, который я предлагал с уможением на 10 и отделением целой части...
все таки только через з..у и получилось :)
Дорогу осилит идущий!
Я все пойму, Вы только дайте денег!!!
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

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

Сообщение Сергей Саныч »

Тима писал(а):т.е. пришли к варианту, который я предлагал с уможением на 10 и отделением целой части.
А куда деваться?
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Тима
Почётный участник
Почётный участник
Сообщения: 3162
Зарегистрирован: 01 мар 2012, 20:47
Репутация: 1089
Настоящее имя: Тимур
Откуда: КБР
Контактная информация:

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

Сообщение Тима »

так предложил еще на второй странице обсуждения, а исписали 5причем ни одного оффтопа.
Дорогу осилит идущий!
Я все пойму, Вы только дайте денег!!!
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

Так, погодите, не углу***йтесь в дебри. В ардуино не просто AVR/GCC, а есть ещё свой препроцессор со свими тараканами.
Делайте с оделением целой и дробной частей и без всяких sprintf.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Тима
Почётный участник
Почётный участник
Сообщения: 3162
Зарегистрирован: 01 мар 2012, 20:47
Репутация: 1089
Настоящее имя: Тимур
Откуда: КБР
Контактная информация:

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

Сообщение Тима »

по описанию должен сработать lcd.print(A, 1), только я думаю надо писать именно lcd.print , а не lcd.println. приставка ln это перевод курсора на следующую строку прсле вывода текста. может эта приставка и мутит воду.
Дорогу осилит идущий!
Я все пойму, Вы только дайте денег!!!
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение 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);

и т.д.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Тима
Почётный участник
Почётный участник
Сообщения: 3162
Зарегистрирован: 01 мар 2012, 20:47
Репутация: 1089
Настоящее имя: Тимур
Откуда: КБР
Контактная информация:

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

Сообщение Тима »

работвет команда sprlntf или столбик команд снизу? или это один код?
Дорогу осилит идущий!
Я все пойму, Вы только дайте денег!!!
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

Тима писал(а):работвет команда sprlntf или столбик команд снизу? или это один код?
Проверить работу sprlntf в ардуине не могу - не помню где моя валяется и ломает подключать к ней дисплей. :beer_blow:
Это не один код - это код дающий результат, которого тут хотят добиться от sprintf уже несколько страниц. :hehehe:
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

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

Сообщение Сергей Саныч »

UAVpilot писал(а):Fr_min/1
это как? вместо (int)Fr_min?
Чудес не бывает. Бывают фокусы.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

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

Сообщение aftaev »

Тима писал(а):все таки только через з..у и получилось
Тима, я кучу вариантов знаю как через задницу сделать хотелось printf опробовать в действии
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение 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);
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

aftaev писал(а):Тима, я кучу вариантов знаю как через задницу сделать хотелось printf опробовать в действии
при этом ты используешь для этого псевдоязык реализованный слегка через задницу. :good:
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Тима
Почётный участник
Почётный участник
Сообщения: 3162
Зарегистрирован: 01 мар 2012, 20:47
Репутация: 1089
Настоящее имя: Тимур
Откуда: КБР
Контактная информация:

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

Сообщение Тима »

да я бы не сказал что способ предложенный мной это через задницу. это способ сделать на простых командах, не прибегая к спец.командам.
Дорогу осилит идущий!
Я все пойму, Вы только дайте денег!!!
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

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

Сообщение Сергей Саныч »

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

а вообще, почему-то вспомнилась байка про барометр и высоту небоскреба ;)
Чудес не бывает. Бывают фокусы.
vladimir74
Почётный участник
Почётный участник
Сообщения: 544
Зарегистрирован: 25 май 2011, 14:14
Репутация: 19
Откуда: Магнитогорск
Контактная информация:

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

Сообщение vladimir74 »

подключить библиотеку math.h не вариант?
#include <math.h>
самому проверить негде поэтому выскажу мысль до конца.

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

Вернуться в «Электроника»