Страница 2 из 14
Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 09:13
aftaev
С этим кодом ваще разобраться не могу, нет тут ни одной моей переменной. А Си ток начал изучать и непонятно откуда нужно взять strcount
UAVpilot пиши под мой пример. Чтоб выделил вставил в ардуино и оно заработало
UAVpilot писал(а):char s[5];
...
lcd.print("Размер программы ");
sprintf(s, "%i", strcount);
lcd.print(s);
lcd.print(" строк кода.");
Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 09:53
Nick
aftaev писал(а):Исправил на массив char s[5];
Ошибки нет, но и экран пустой
Попробуй длину массива по больше сделать, например char s[40], или сколько там у тебя символов?
А то может он за размер выделенной памяти вылазит и потихоньку охреневает.
Да, еще вместо "Fr%d-%d Ps%d-%d\nPrint %d min"
можно написать:
"Fr% 4.1f-% 4.1f Ps% 4.1f-% 4.1f\nPrint % 4.1f min"
т.е. вместо каждого %d - % 4.1f - это значит выдить float, с 1 знаком после запятой, на все число потратить ровно 4 символа и заполнить передние пустые символы пробелами.
Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 10:25
aftaev
Nick писал(а):Попробуй длину массива по больше сделать, например char s[40], или сколько там у тебя символов?
попробовал char s[150];
И вылезли циферки НО

с косяками.
Выводит Fr23-23 Ps23-23
# (выводит абракадабру)
Потом как выводить 23.3
(для просмотра содержимого нажмите на ссылку)Код: Выделить всё
// описание языка http://arduino.ru/Reference
#include <LiquidCrystal.h> /* Подключаем библиотеку для работы с LCD */
//режимы
int Fr_min=23.33; // переменная ферментация мин.
int Fr_max=23.33; // переменная ферментация макс.
int Ps_min=23.33; // переменная пастеризация мин.
int Ps_max=23.33; // переменная пастеризация макс.
char s[150];
int Pos_min=30; // переменная выдача данных на принтер
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
//static FILE lcdout = {0} ; // LCD FILE structure
void setup()
{
lcd.begin(16, 2); /* Инициализируем дисплей: 2 строки по 16 символов */
lcd.setCursor(5, 1); //позиция курсора (столбец, строка)
lcd.print("DS18B20 "); // выводим приветсвие
delay(5000); // пауза 3 сек
lcd.clear(); // очищаем
}
//--------------------------------------------------------------------------------------------------------------------------------------------------
// ОСНОВНАЯ ПРОГРАММА
//--------------------------------------------------------------------------------------------------------------------------------------------------
void loop(void) // основной цикл
{
lcd.clear(); // очищаем
sprintf(s,"Fr%d-%d Ps%d-%d\nPrint %d min", Fr_min,Fr_max,Ps_min,Ps_max,Pos_min);
lcd.print(s);
//lcd.print(tab(23.55,1)); //124
delay(5000); // пауза 3 сек
}
//*************************************************************************************************************************************************
float tab(float data,int n)
{
float ret;
long buf;
long k=1;
while(n--) k*=10;
buf=data*=k;
if((data-buf)>0.5) buf++;
ret=buf;
return ret/k;
}
Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 10:50
wldev
int - это целочисленная знаковая переменная т.е
int Fr_min=23.33; // Fr_min=23
надо float - знаковая переменная с плавающей запятой!
float Fr_min=23.33; // Fr_min=23.33
а если float то
sprintf(s,"Fr%.1f-%d Ps%.1f-%.1f\nPrint %.1f min", Fr_min,Fr_max,Ps_min,Ps_max,Pos_min);
.1f - значит что f - переменная с плав. запятой , а .1 что после запятой нужен 1 знак
Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 11:04
wldev
Nick писал(а):"Fr% 4.1f-% 4.1f Ps% 4.1f-% 4.1f\nPrint % 4.1f min"
т.е. вместо каждого %d - % 4.1f - это значит выдить float, с 1 знаком после запятой, на все число потратить ровно 4 символа и заполнить передние пустые символы пробелами.
или так ... только пробелы не забудь м/у % и 4.
Оффтоп.
А какая максимальная частота выдачи сигнала в дискретный порт у таких устройств?
Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 12:52
ukr-sasha
Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 12:56
Тима
Впечатлило название руководства... "руководство полного идиота"...
Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 13:03
Тима
Кстати, еще в университете делал на паскали такое без специальных функций, нужно было отображать одно значение после запятой.
Умножаем число на 10, отделяем целую часть, делим его на 10 и выводим на экран. Но это немного грамостко получится, но тоже вариант.
Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 14:07
Serg
aftaev писал(а):С этим кодом ваще разобраться не могу, нет тут ни одной моей переменной. А Си ток начал изучать и непонятно откуда нужно взять strcount
UAVpilot пиши под мой пример. Чтоб выделил вставил в ардуино и оно заработало
Зачем? Мне почему-то показалось, что ты хочешь научиться писать программы на C, а не просто копипастить текст...

Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 14:10
Serg
aftaev писал(а):Nick писал(а):Попробуй длину массива по больше сделать, например char s[40], или сколько там у тебя символов?
попробовал char s[150];
И вылезли циферки НО

с косяками.
Выводит Fr23-23 Ps23-23
# (выводит абракадабру)
Потом как выводить 23.3
попробуй в sprintf в конце строки формата дописать \0, чтоб вот так было:
"Fr%d-%d Ps%d-%d\nPrint %d min\0"
Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 14:54
aftaev
мне это руководство больше нравиться
http://arduino.ru/Reference
Тима писал(а):Умножаем число на 10, отделяем целую часть, делим его на 10 и выводим на экран. Но это немного грамостко получится, но тоже вариант.
Через з..у я тож мог сделать например тупо забить знакоместо пробелом

Хочется же грамотно
UAVpilot писал(а):Зачем? Мне почему-то показалось, что ты хочешь научиться писать программы на C, а не просто копипастить текст...
Так должно заработать, и после этого разобраться что и как.
Сам разобрался с кнопками, ds18b20, принтером, меню с настройками и почти уже все написал, а вот printf незадался

Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 15:03
Serg
С \0 в конце попробовал?
Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 15:13
aftaev
Нужно чтоб выводилось:
Fr45-47 Ps65-67
Print 30 min
Если написать так
UAVpilot писал(а):"Fr%d-%d Ps%d-%d\nPrint %d min\0"
то выводится
Fr45-47 Ps65-67#(абракадабра)
Это потому как не влазиит все в одну строчку 16значного индикатора. Нужно
Print 30 min перевести на новую строчку
Попробовал lcd.clear(); // очищаем
lcd.setCursor(0, 0);
sprintf(s,"Fr%d-%d Ps%d-%d\0", Fr_min,Fr_max,Ps_min,Ps_max); //
выводит как нужно
Fr45-47 Ps65-67 без абракадабры
добавляю
lcd.setCursor(0, 1);
sprintf(s,"Print %d min\0", Pos_min);
в итоге на экран выводится только одна строчка
Print 30 min

Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 15:39
Impartial
aftaev писал(а):sprintf(s,"Print %d min\0", Pos_min);
Это же только вывод в строку.
Теперь не экран нужно вывести. \0 лишнее.
Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 15:48
Impartial
aftaev писал(а):lcd.setCursor(0, 0);
Кстати эта запись не от С а от С++, означает вызов метода setCursor статического класса lcd, либо вообще все что угодно или придумано ардуино.
Компилятор какой?
Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 16:18
aftaev
Impartial писал(а):Компилятор какой?
Все что знаю Ардуино 1.0.1
http://arduino.ru/Arduino_environment
Impartial писал(а):Это же только вывод в строку.
Теперь не экран нужно вывести
Нашел косяк свой, заработало.
Нужно теперь другое меню с выводом дробей сообразить. Попробую поковыряться
Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 16:22
Serg
Impartial писал(а):aftaev писал(а):lcd.setCursor(0, 0);
Кстати эта запись не от С а от С++, означает вызов метода setCursor статического класса lcd, либо вообще все что угодно или придумано ардуино.
Компилятор какой?
C++ тут никаким боком. Обычный C позволяет объявить структуру, членом которой может быть указатель на функцию.
Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 16:29
Impartial
С этим нужно разбираться, что то похожее на С++. Раз делают так, значит кому то это нужно.
Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 16:33
aftaev
кто на русский язык переведет.
Если вместо переменной S хочу использовать var например как будет выглядеть?
sprintf(s,"Print %d min\0", Pos_min);
Re: Мои проекты на Ардуино
Добавлено: 07 ноя 2012, 16:34
Impartial
UAVpilot писал(а):C++ тут никаким боком. Обычный C позволяет объявить структуру, членом которой может быть указатель на функцию.
Ну тогда почитайте то, что по ссылке.
Объявит можно, передать параметры проблематично. Это обеспечивается однозначно механизмом полиформизма С++.