в Ардуино такое же покажиSerg-tmn писал(а):Законная. Это не ошибка. Но тем не менее:
Мои проекты на Ардуино
-
- Зачётный участник
- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6192
- Откуда: Казахстан.
- Контактная информация:
Re: Мои проекты на Ардуино
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Мои проекты на Ардуино
Не покажу. Ввиду отсутствия наличияaftaev писал(а):в Ардуино такое же покажи
Чудес не бывает. Бывают фокусы.
-
- Зачётный участник
- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6192
- Откуда: Казахстан.
- Контактная информация:
Re: Мои проекты на Ардуино
ты лучше покажи как знак после дроби убрать в этом посту Мои проекты на Ардуино #60Serg-tmn писал(а):Не покажу. Ввиду отсутствия наличия
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5181
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Мои проекты на Ардуино
Это одна из документированных фишек: в этом случае компилятор C не ругается, а компилятор C++ "предупреждает. Есть ещё несколько подобных моментов с аналогичной реакцией.Serg-tmn писал(а):Законная. Это не ошибка. Но тем не менее:UAVpilot писал(а):С какого перепугу? Это вролне законная запись.
По 4 строке - то самое предупреждение.
Собственно это разновидность такой, легальной в обоих языках записи:
if ((x = foobar()) != 0)
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- Serg
- Мастер
- Сообщения: 21923
- Зарегистрирован: 17 апр 2012, 14:58
- Репутация: 5181
- Заслуга: c781c134843e0c1a3de9
- Настоящее имя: Сергей
- Откуда: Москва
- Контактная информация:
Re: Мои проекты на Ардуино
А если вместо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);
выводит:
?- ? ?- ?
%.2f
писать
%4.2f
?
P.S. "\0" в конце не нужен, я проверил.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: Мои проекты на Ардуино
Ну может быть, я не знаю. просто вчера в LinuxCNC компонент LCD настраивал там было именно так, как я написалSerg-tmn писал(а):Разве? Всегда было, что в случае %7.2f лидирующие нули заменялись пробелами, то есть вывод будет "__12.34", а чтобы получить 0012.34, надо написать %07.2
- Nick
- Мастер
- Сообщения: 22776
- Зарегистрирован: 23 ноя 2009, 16:45
- Репутация: 1735
- Заслуга: Developer
- Откуда: Gatchina, Saint-Petersburg distr., Russia
- Контактная информация:
Re: Мои проекты на Ардуино
Может надо числа не float задавать, а double?
т.е.
double Fr_min=23.33; // переменная ферментация мин.
double Fr_max=23.33; // переменная ферментация макс.
double Ps_min=23.33; // переменная пастеризация мин.
double Ps_max=23.33; // переменная пастеризация макс.
т.е.
double Fr_min=23.33; // переменная ферментация мин.
double Fr_max=23.33; // переменная ферментация макс.
double Ps_min=23.33; // переменная пастеризация мин.
double Ps_max=23.33; // переменная пастеризация макс.
-
- Зачётный участник
- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6192
- Откуда: Казахстан.
- Контактная информация:
Re: Мои проекты на Ардуино
а что это дает /0 ?UAVpilot писал(а):P.S. "\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);
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
-
- Зачётный участник
- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6192
- Откуда: Казахстан.
- Контактная информация:
Re: Мои проекты на Ардуино
...............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: Мои проекты на Ардуино
в C все строки заканчиваются на байт со значением 0, было предположение что в ардуине sprintf не добавляет его автоматом.aftaev писал(а):а что это дает /0 ?
И вообщея не нашёл описания ардуинской реализации функций printf, sprintf и т.п., может они какие-нибудь урезанные.
Нарисуй полностью точно что именно выводит, с пробелами и прочей фигнёй.UAVpilot писал(а):выводит:
?- ? ?- ?
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
-
- Зачётный участник
- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6192
- Откуда: Казахстан.
- Контактная информация:
Re: Мои проекты на Ардуино
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);
Выводится так: ?- ?
====?-====?===== (= это пробелы)
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);
Выводится так: ?- ?
====?-====?===== (= это пробелы)
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
-
- Зачётный участник
- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6192
- Откуда: Казахстан.
- Контактная информация:
Re: Мои проекты на Ардуино
Если код такой
sprintf(s," %2.2f- %2.2f %2.2f- %2.2f", Fr_min,Fr_max,Ps_min,Ps_max); //
lcd.print(s);
тогда выводится так: ?- ? ?- ?
==?-==?===?-==? (= это пробелы)
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
Вообще на таких слабеньких аппаратах по возможности лучше избегать плавающей арифметики - слишком много она жрет ресурсов (память и время).
Скажем, значение температуры можно хранить в переменных типа 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
Чудес не бывает. Бывают фокусы.
-
- Зачётный участник
- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6192
- Откуда: Казахстан.
- Контактная информация:
Re: Мои проекты на Ардуино
Нужно Fr_min 23.4Serg-tmn писал(а):Должно нарисовать Fr_min 23.45
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
- Сергей Саныч
- Мастер
- Сообщения: 9116
- Зарегистрирован: 30 май 2012, 14:20
- Репутация: 2858
- Откуда: Тюмень
- Контактная информация:
Re: Мои проекты на Ардуино
Легко! Принимаем дискрет - 0,1 градусаaftaev писал(а):Нужно Fr_min 23.4
Новая редакция:
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: Мои проекты на Ардуино
А может число тупо не влезает и поэтому пишет "?" попробуй вывести 1 число так
sprintf(s,"x%10.2fx", Fr_min)
sprintf(s,"x%10.2fx", Fr_min)
-
- Зачётный участник
- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6192
- Откуда: Казахстан.
- Контактная информация:
Re: Мои проекты на Ардуино
sprintf(s,"x%10.2fx", Fr_min)Nick писал(а):А может число тупо не влезает и поэтому пишет "?" попробуй вывести 1 число так
sprintf(s,"x%10.2fx", Fr_min)
lcd.print(s);
выдает:
Х==========?х====
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
-
- Зачётный участник
- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6192
- Откуда: Казахстан.
- Контактная информация:
Re: Мои проекты на Ардуино
функция GetTemperature считывает температуру с датчиков DS18b20 и выдает их в виде 23,33Serg-tmn писал(а):Fr_min = 234; // пробное значение температуры 23,4 градусов
НУЖНО УБРАТЬ один знак после запятой
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
-
- Зачётный участник
- Сообщения: 34042
- Зарегистрирован: 04 апр 2010, 19:22
- Репутация: 6192
- Откуда: Казахстан.
- Контактная информация:
Re: Мои проекты на Ардуино
float Fr_min=23.33; // переменная ферментация мин.Serg-tmn писал(а):sprintf(string, "Fr_min %3d.%-01d", Fr_min/10, Fr_min%10); // перевод значения в строку, отдельно целую часть и дробную.
lcd.print(string);
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
Чудес не бывает. Бывают фокусы.