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

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

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

Сообщение aftaev »

С этим кодом ваще разобраться не могу, нет тут ни одной моей переменной. А Си ток начал изучать и непонятно откуда нужно взять strcount
UAVpilot пиши под мой пример. Чтоб выделил вставил в ардуино и оно заработало
UAVpilot писал(а):char s[5];
...
lcd.print("Размер программы ");
sprintf(s, "%i", strcount);
lcd.print(s);
lcd.print(" строк кода.");
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Nick
Мастер
Сообщения: 22776
Зарегистрирован: 23 ноя 2009, 16:45
Репутация: 1735
Заслуга: Developer
Откуда: Gatchina, Saint-Petersburg distr., Russia
Контактная информация:

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

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

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

Сообщение aftaev »

Nick писал(а):Попробуй длину массива по больше сделать, например char s[40], или сколько там у тебя символов?
попробовал char s[150];
И вылезли циферки НО :attention: с косяками.
Выводит Fr23-23 Ps23-23# (выводит абракадабру)
Потом как выводить 23.3 :thinking:
(для просмотра содержимого нажмите на ссылку)

Код: Выделить всё

// описание языка 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;
}
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
wldev
Мастер
Сообщения: 1650
Зарегистрирован: 24 янв 2012, 16:04
Репутация: 510
Настоящее имя: Сергей Бочаров
Откуда: Новосибирск
Контактная информация:

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

Сообщение 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 знак
Новости: https://t.me/wldevruch
Обсуждения: https://t.me/wldevgr
Аватара пользователя
wldev
Мастер
Сообщения: 1650
Зарегистрирован: 24 янв 2012, 16:04
Репутация: 510
Настоящее имя: Сергей Бочаров
Откуда: Новосибирск
Контактная информация:

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

Сообщение wldev »

Nick писал(а):"Fr% 4.1f-% 4.1f Ps% 4.1f-% 4.1f\nPrint % 4.1f min"
т.е. вместо каждого %d - % 4.1f - это значит выдить float, с 1 знаком после запятой, на все число потратить ровно 4 символа и заполнить передние пустые символы пробелами.
или так ... только пробелы не забудь м/у % и 4.

Оффтоп.
А какая максимальная частота выдачи сигнала в дискретный порт у таких устройств?
Новости: https://t.me/wldevruch
Обсуждения: https://t.me/wldevgr
Аватара пользователя
ukr-sasha
Мастер
Сообщения: 3401
Зарегистрирован: 21 мар 2011, 07:47
Репутация: 2181
Настоящее имя: Украинец Александр Григорьевич
Откуда: Киев, Украина
Контактная информация:

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

Сообщение ukr-sasha »

Александр, вот тут простым языком руководство по С: http://www.helloworld.ru/texts/comp/lang/c/c6/index.htm
Аватара пользователя
Тима
Почётный участник
Почётный участник
Сообщения: 3162
Зарегистрирован: 01 мар 2012, 20:47
Репутация: 1089
Настоящее имя: Тимур
Откуда: КБР
Контактная информация:

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

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

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

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

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

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

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

Сообщение Serg »

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

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

Сообщение Serg »

aftaev писал(а):
Nick писал(а):Попробуй длину массива по больше сделать, например char s[40], или сколько там у тебя символов?
попробовал char s[150];
И вылезли циферки НО :attention: с косяками.
Выводит Fr23-23 Ps23-23# (выводит абракадабру)
Потом как выводить 23.3 :thinking:
попробуй в sprintf в конце строки формата дописать \0, чтоб вот так было:
"Fr%d-%d Ps%d-%d\nPrint %d min\0"
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

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

Сообщение aftaev »

ukr-sasha писал(а):Александр, вот тут простым языком руководство по С: http://www.helloworld.ru/texts/comp/lang/c/c6/index.htm
мне это руководство больше нравиться http://arduino.ru/Reference
Тима писал(а):Умножаем число на 10, отделяем целую часть, делим его на 10 и выводим на экран. Но это немного грамостко получится, но тоже вариант.
Через з..у я тож мог сделать например тупо забить знакоместо пробелом :) Хочется же грамотно :)
UAVpilot писал(а):Зачем? Мне почему-то показалось, что ты хочешь научиться писать программы на C, а не просто копипастить текст...
Так должно заработать, и после этого разобраться что и как.
Сам разобрался с кнопками, ds18b20, принтером, меню с настройками и почти уже все написал, а вот printf незадался :)
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Аватара пользователя
Serg
Мастер
Сообщения: 21923
Зарегистрирован: 17 апр 2012, 14:58
Репутация: 5183
Заслуга: c781c134843e0c1a3de9
Настоящее имя: Сергей
Откуда: Москва
Контактная информация:

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

Сообщение Serg »

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

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

Сообщение 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
:thinking:
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Impartial
Мастер
Сообщения: 953
Зарегистрирован: 23 фев 2011, 01:50
Репутация: 36
Контактная информация:

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

Сообщение Impartial »

aftaev писал(а):sprintf(s,"Print %d min\0", Pos_min);
Это же только вывод в строку.
Теперь не экран нужно вывести. \0 лишнее.
Impartial
Мастер
Сообщения: 953
Зарегистрирован: 23 фев 2011, 01:50
Репутация: 36
Контактная информация:

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

Сообщение Impartial »

aftaev писал(а):lcd.setCursor(0, 0);
Кстати эта запись не от С а от С++, означает вызов метода setCursor статического класса lcd, либо вообще все что угодно или придумано ардуино.
Компилятор какой?
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

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

Сообщение aftaev »

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

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

Сообщение Serg »

Impartial писал(а):
aftaev писал(а):lcd.setCursor(0, 0);
Кстати эта запись не от С а от С++, означает вызов метода setCursor статического класса lcd, либо вообще все что угодно или придумано ардуино.
Компилятор какой?
C++ тут никаким боком. Обычный C позволяет объявить структуру, членом которой может быть указатель на функцию.
Я не Христос, рыбу не раздаю, но могу научить, как сделать удочку...
Impartial
Мастер
Сообщения: 953
Зарегистрирован: 23 фев 2011, 01:50
Репутация: 36
Контактная информация:

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

Сообщение Impartial »

aftaev писал(а):Все что знаю Ардуино 1.0.1 http://arduino.ru/Arduino_environment
С этим нужно разбираться, что то похожее на С++. Раз делают так, значит кому то это нужно.
aftaev
Зачётный участник
Зачётный участник
Сообщения: 34042
Зарегистрирован: 04 апр 2010, 19:22
Репутация: 6194
Откуда: Казахстан.
Контактная информация:

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

Сообщение aftaev »

кто на русский язык переведет.

Если вместо переменной S хочу использовать var например как будет выглядеть?
sprintf(s,"Print %d min\0", Pos_min);
Дилетанту сложные вещи кажутся очень простыми, и только профессионал понимает насколько сложна самая простая вещь
Кто хочет - ищет возможности, кто не хочет - ищет оправдание.
Найди работу по душе и тебе не придется работать.
Impartial
Мастер
Сообщения: 953
Зарегистрирован: 23 фев 2011, 01:50
Репутация: 36
Контактная информация:

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

Сообщение Impartial »

UAVpilot писал(а):C++ тут никаким боком. Обычный C позволяет объявить структуру, членом которой может быть указатель на функцию.
Ну тогда почитайте то, что по ссылке.
Объявит можно, передать параметры проблематично. Это обеспечивается однозначно механизмом полиформизма С++.
Ответить

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