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

Контроллеры, драйверы, датчики, управляющие устройства.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

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

Сообщение aftaev »

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

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

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

aftaev писал(а):в Ардуино такое же покажи :)
Не покажу. Ввиду отсутствия наличия :wik:
Чудес не бывает. Бывают фокусы.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

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

Сообщение aftaev »

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

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

Сообщение Serg »

Serg-tmn писал(а):
UAVpilot писал(а):С какого перепугу? Это вролне законная запись.
Законная. Это не ошибка. Но тем не менее:
По 4 строке - то самое предупреждение.
Это одна из документированных фишек: в этом случае компилятор C не ругается, а компилятор C++ "предупреждает. Есть ещё несколько подобных моментов с аналогичной реакцией. :)
Собственно это разновидность такой, легальной в обоих языках записи:
if ((x = foobar()) != 0)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5181
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

aftaev писал(а):С дробями не выходит. Чтоне так?

float Fr_min=23.33; // переменная ферментация мин.
float Fr_max=23.33; // переменная ферментация макс.
float Ps_min=23.33; // переменная пастеризация мин.
float Ps_max=23.33; // переменная пастеризация макс.
.............................

lcd.clear(); // очищаем
lcd.setCursor(0, 0);
//sprintf(s,"Fr%d-%d Ps%d-%d\0", Fr_min,Fr_max,Ps_min,Ps_max); // работает
sprintf(s," %.2f- %.2f %.2f- %.2f\0", Fr_min,Fr_max,Ps_min,Ps_max); //
lcd.print(s);

выводит:
?- ? ?- ?

:thinking:
А если вместо
%.2f
писать
%4.2f
?

P.S. "\0" в конце не нужен, я проверил. :)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

Serg-tmn писал(а):Разве? Всегда было, что в случае %7.2f лидирующие нули заменялись пробелами, то есть вывод будет "__12.34", а чтобы получить 0012.34, надо написать %07.2
Ну может быть, я не знаю. просто вчера в LinuxCNC компонент LCD настраивал там было именно так, как я написал :)
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

Может надо числа не float задавать, а double?

т.е.
double Fr_min=23.33; // переменная ферментация мин.
double Fr_max=23.33; // переменная ферментация макс.
double Ps_min=23.33; // переменная пастеризация мин.
double Ps_max=23.33; // переменная пастеризация макс.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

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

Сообщение aftaev »

UAVpilot писал(а):P.S. "\0" в конце не нужен, я проверил.
а что это дает /0 ?
UAVpilot писал(а):А если вместо
%.2f
писать
%4.2f
?
Нифига точно также выдает вопросы ? ? ? ?

lcd.clear(); // очищаем
lcd.setCursor(0, 0);
//sprintf(s,"Fr%d-%d Ps%d-%d\0", Fr_min,Fr_max,Ps_min,Ps_max); // работает
sprintf(s," %4.2f- %4.2f %4.2f- %4.2f", Fr_min,Fr_max,Ps_min,Ps_max); //
lcd.print(s);
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

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

Сообщение aftaev »

Nick писал(а):Может надо числа не float задавать, а double?

т.е.
double Fr_min=23.33; // переменная ферментация мин.
double Fr_max=23.33; // переменная ферментация макс.
double Ps_min=23.33; // переменная пастеризация мин.
double Ps_max=23.33; // переменная пастеризация макс.
...............
sprintf(s," %4.2f- %4.2f %4.2f- %4.2f", Fr_min,Fr_max,Ps_min,Ps_max); //
lcd.print(s);

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

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

Сообщение Serg »

aftaev писал(а):а что это дает /0 ?
в C все строки заканчиваются на байт со значением 0, было предположение что в ардуине sprintf не добавляет его автоматом.

И вообщея не нашёл описания ардуинской реализации функций printf, sprintf и т.п., может они какие-нибудь урезанные.
UAVpilot писал(а):выводит:
?- ? ?- ?
Нарисуй полностью точно что именно выводит, с пробелами и прочей фигнёй.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

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

Сообщение aftaev »

double Fr_min=23.33; // переменная ферментация мин.
double Fr_max=23.33; // переменная ферментация макс.
double Ps_min=23.33; // переменная пастеризация мин.
double Ps_max=23.33; // переменная пастеризация макс.
char s[150];
........................
sprintf(s," %4.2f- %4.2f %4.2f- %4.2f", Fr_min,Fr_max,Ps_min,Ps_max); //
lcd.print(s);

Выводится так: ?- ?
====?-====?===== (= это пробелы)
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

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

Сообщение aftaev »

Если код такой
sprintf(s," %2.2f- %2.2f %2.2f- %2.2f", Fr_min,Fr_max,Ps_min,Ps_max); //
lcd.print(s);

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

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

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

А у Ардуино (в смысле AVR/GCC компиляторе) вообще есть плавающая точка? А то может там какие заглушки стоят, которые ? выводят.
Вообще на таких слабеньких аппаратах по возможности лучше избегать плавающей арифметики - слишком много она жрет ресурсов (память и время).
Скажем, значение температуры можно хранить в переменных типа int (16-битной), приняв за дискретность одну сотую градуса. Полагаю, что диапазон от -327.68 до +327.67 градусов будет достаточен для любых грибных приложений :)
А выводить можно примерно так:
int Fr_min; // переменная, где храним значение температуры в сотых долях градуса
Fr_min = 2345; // пробное значение температуры 23,45 градусов
char string[20]; // строка, используемая для вывода
sprintf(string, "Fr_min %3d.%-02d", Fr_min/100, Fr_min%100); // перевод значения в строку, отдельно целую часть и дробную.
lcd.print(string);

Fr_min/100 - это понятно, целочисленное деление на 100 (остаток теряется). Получится 23
Fr_min%100 - а это наоборот, нахождение остатка от деления на 100. Результат 45

Должно нарисовать Fr_min 23.45
Чудес не бывает. Бывают фокусы.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

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

Сообщение aftaev »

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

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

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

aftaev писал(а):Нужно Fr_min 23.4
Легко! Принимаем дискрет - 0,1 градуса

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

Fr_min/10 - это понятно, целочисленное деление на 10 (остаток теряется). Получится 23
Fr_min%10 - а это наоборот, нахождение остатка от деления на 10. Результат 4

Должно нарисовать Fr_min 23.4
Чудес не бывает. Бывают фокусы.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

Сообщение Nick »

А может число тупо не влезает и поэтому пишет "?" попробуй вывести 1 число так
sprintf(s,"x%10.2fx", Fr_min)
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

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

Сообщение aftaev »

Nick писал(а):А может число тупо не влезает и поэтому пишет "?" попробуй вывести 1 число так
sprintf(s,"x%10.2fx", Fr_min)
sprintf(s,"x%10.2fx", Fr_min)
lcd.print(s);
выдает:
Х==========?х====
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

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

Сообщение aftaev »

Serg-tmn писал(а):Fr_min = 234; // пробное значение температуры 23,4 градусов
функция GetTemperature считывает температуру с датчиков DS18b20 и выдает их в виде 23,33
НУЖНО УБРАТЬ один знак после запятой
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6192
Откуда: Казахстан.
Контактная информация:

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

Сообщение aftaev »

Serg-tmn писал(а):sprintf(string, "Fr_min %3d.%-01d", Fr_min/10, Fr_min%10); // перевод значения в строку, отдельно целую часть и дробную.
lcd.print(string);
float Fr_min=23.33; // переменная ферментация мин.
float Fr_max=23.33; // переменная ферментация макс.
float Ps_min=23.33; // переменная пастеризация мин.
float Ps_max=23.33; // переменная пастеризация макс.
char s[150];
.....................................
sprintf(s, "Fr_min %3d.%-01d", Fr_min/10, Fr_min%10); // перевод значения в строку, отдельно целую часть и дробную.
lcd.print(s);
выдает ошибку
printf.cpp: In function 'void loop()':
printf:39: error: invalid operands of types 'float' and 'int' to binary 'operator%'
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Сергей Саныч
Мастер
Сообщения: 9116
Зарегистрирован: 30 май 2012, 14:20
Репутация: 2858
Откуда: Тюмень
Контактная информация:

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

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

Объяви переменные, как int, а не float. И значения присвой не 23.33, а 233
Чудес не бывает. Бывают фокусы.
Ответить

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