Вывод на LCD текста и данных в одной строке
- Войдите на сайт для отправки комментариев
Вс, 16/02/2014 - 15:24
Добрый день! Возникла неприятная мелочь - в функции lcd.print() не получается объединить строковый и числовой типы, т.е. вот так не получается:
lcd.print("температура" + h_temp);
Из-за этого приходится городить целую гору лишних вызовов этой функции и фунции, перемещающей курсор. Есть какой-нибудь выход?
Добрый день! Возникла неприятная мелочь - в функции lcd.print() не получается объединить строковый и числовой типы, т.е. вот так не получается:
lcd.print("температура" + h_temp);Из-за этого приходится городить целую гору лишних вызовов этой функции и фунции, перемещающей курсор. Есть какой-нибудь выход?
Сначала делаешь вывод в строку командой sprintf(), затем получившуюся строку выводишь командой
lcd.print.
эмм, всмысле данные и текст в одну строку запихать, а потом ее выводить на ЖКИ? Или как? Что-то не пойму что здесь делает spritf();
lcd.write(("Indoor Temp. = ")+(value)); // так получится только с двумя аргументамиНо лучше так:
String message = String("Indoor temp. = " + value + " C"); // любое количество аргументов lcd.print(message); Serial.print(message);эмм, всмысле данные и текст в одну строку запихать, а потом ее выводить на ЖКИ? Или как? Что-то не пойму что здесь делает spritf();
String message = String("Indoor temp. = " + value + " C"); // любое количество аргументов // ... Serial.print(message);А у меня так вообще не получается. Ошибки при компиляции...
Test_String_function.ino: In function 'void loop()':
Test_String_function:14: error: call of overloaded 'String(float)' is ambiguous
arduino\hardware\arduino\cores\arduino/WString.h:70: note: candidates are: String::String(long unsigned int, unsigned char)
arduino\hardware\arduino\cores\arduino/WString.h:69: note: String::String(long int, unsigned char)
arduino\hardware\arduino\cores\arduino/WString.h:68: note: String::String(unsigned int, unsigned char)
int a; char b; float c; String output_string; // void setup(){ Serial.begin(4800); } void loop(){ a = 3; b = '-'; c = 3,14; output_string = String (a + b + c); Serial.println(output_string); delay (1000); }юзайте пример с sprintf который msg31 бросил, там не так все сложно и намного больше возможностей чем с использованием String
Всё равно ничего не выходит :-(
Ошибки.
Test_String_function.ino: In function 'void loop()':
Test_String_function:11: error: invalid conversion from 'int' to 'const char*'
Test_String_function:11: error: initializing argument 2 of 'int sprintf(char*, const char*, ...)'
int a = 3; char b = '-'; float c = 3.14; char output_string[16]; // void setup(){ Serial.begin(4800); } void loop(){ sprintf(output_string, a, b, c); Serial.println(output_string); delay (1000); }Всё равно ничего не выходит :-(
http://www.chitay.org/c/13/sprintf.htm и особенно http://www.chitay.org/c/13/printf.htm
Супер! Теперь вышло.
Супер! Теперь вышло.
Покажите пожалуйста, в каком виде все это получилось, чет читаю и ничего не пойму!!
Супер! Теперь вышло.
Покажите пожалуйста, в каком виде все это получилось, чет читаю и ничего не пойму!!
Ты посмотри как функцию printf использовать. Просто погугли. Найдешь кучу примеров и ссылок на книжки всякие. Начни с азов "Hello World", это самое первое, что на Си изучают.
Супер! Теперь вышло.
Покажите пожалуйста, в каком виде все это получилось, чет читаю и ничего не пойму!!
Вот мой тестовый вариант.
int a = 3; char b = '-'; float c = 3.14; char output_string[16]; // void setup(){ Serial.begin(4800); } void loop(){ sprintf ( output_string, "%02i %2c %4.2f", a, b, c ); // output_string - куда выводить, массив char // "%02i %2c %4.3f" формат вывода аргументов: // %02(два поля - сначала нули)i(int) // %2(два поля)c(char) // %4(4 поля всего).2(после запятой)f(float) // про форматы - htp://www.chitay.org/c/13/printf.htm Serial.println(output_string); delay (1000); }Воспользовался советом из данной темы, вот что получается:
char sdate[10]; char stime[8]; void loop() { lcd.setCursor(0,0); lcd.print("Date: "); sprintf(sdate, "%04d.%02d.%02d", RTC.get(DS1307_YR,false), RTC.get(DS1307_MTH,false), RTC.get(DS1307_DATE,false)); lcd.print(sdate); lcd.setCursor(0,1); lcd.print("Time: "); sprintf(stime, "%02d:%02d:%02d", RTC.get(DS1307_HR,false), RTC.get(DS1307_MIN,false), RTC.get(DS1307_SEC,false)); lcd.print(stime); }Почему-то дата и время перестают обновляться.
В то же время с таким кодом данные даты и времени обновляются из модуля часов реального времени:
void loop() { lcd.setCursor(0,0); lcd.print("Date: "); lcd.print(RTC.get(DS1307_MTH,false)); lcd.print("."); lcd.print(RTC.get(DS1307_DATE,false)); lcd.setCursor(0,1); lcd.print("Time: "); lcd.print(RTC.get(DS1307_HR,true)); lcd.print(":"); lcd.print(RTC.get(DS1307_MIN,false)); lcd.print(":"); lcd.print(RTC.get(DS1307_SEC,false)); }Из-за чего может быть проблема?
Из-за чего может быть проблема?
Попробуй сначала считать данные из датчика, а затем выводить. А вообще объяви массивы раза в два больше на всякий случай. Ну или хотя бы предусмотри место для завершающего символа 0, то есть массивы объяви хотя бы.
charsdate[11];02charstime[9];Супер! Теперь вышло.
Покажите пожалуйста, в каком виде все это получилось, чет читаю и ничего не пойму!!
Вот мой тестовый вариант.
int a = 3; char b = '-'; float c = 3.14; char output_string[16]; // void setup(){ Serial.begin(4800); } void loop(){ sprintf ( output_string, "%02i %2c %4.2f", a, b, c ); // output_string - куда выводить, массив char // "%02i %2c %4.3f" формат вывода аргументов: // %02(два поля - сначала нули)i(int) // %2(два поля)c(char) // %4(4 поля всего).2(после запятой)f(float) // про форматы - htp://www.chitay.org/c/13/printf.htm Serial.println(output_string); delay (1000); }Теперь все гораздо прозрачнее! Ну по крайней мере для меняя! Я не знал того что под каждый тип переменной надо в функции sprintf задавать так называемые "границы" Вообще крайне удобная вещь когда на LCD в строчке приходится выводить несколько переменных типа int+char/ А если переменная будет меньше размера поля, ну допустим
будет выведено число
Теперь все гораздо прозрачнее! Ну по крайней мере для меняя! Я не знал того что под каждый тип переменной надо в функции sprintf задавать так называемые "границы"
не надо. это опционально
Воспользовался советом из данной темы, вот что получается:
char sdate[10]; char stime[8]; void loop() { lcd.setCursor(0,0); lcd.print("Date: "); sprintf(sdate, "%04d.%02d.%02d", RTC.get(DS1307_YR,false), RTC.get(DS1307_MTH,false), RTC.get(DS1307_DATE,false)); lcd.print(sdate); lcd.setCursor(0,1); lcd.print("Time: "); sprintf(stime, "%02d:%02d:%02d", RTC.get(DS1307_HR,false), RTC.get(DS1307_MIN,false), RTC.get(DS1307_SEC,false)); lcd.print(stime); }Почему-то дата и время перестают обновляться.
В то же время с таким кодом данные даты и времени обновляются из модуля часов реального времени:
void loop() { lcd.setCursor(0,0); lcd.print("Date: "); lcd.print(RTC.get(DS1307_MTH,false)); lcd.print("."); lcd.print(RTC.get(DS1307_DATE,false)); lcd.setCursor(0,1); lcd.print("Time: "); lcd.print(RTC.get(DS1307_HR,true)); lcd.print(":"); lcd.print(RTC.get(DS1307_MIN,false)); lcd.print(":"); lcd.print(RTC.get(DS1307_SEC,false)); }Из-за чего может быть проблема?
char sdate[10]; char stime[8]; void loop() { lcd.setCursor(0,0); lcd.print("Date: "); sprintf(sdate, "%04d.%02d.%02d", RTC.get(DS1307_YR,true), RTC.get(DS1307_MTH,false), RTC.get(DS1307_DATE,false)); lcd.print(sdate); lcd.setCursor(0,1); lcd.print("Time: "); sprintf(stime, "%02d:%02d:%02d", RTC.get(DS1307_HR,false), RTC.get(DS1307_MIN,false), RTC.get(DS1307_SEC,false)); lcd.print(stime); }char sdate[10]; char stime[8]; void loop() { lcd.setCursor(0,0); lcd.print("Date: "); sprintf(sdate, "%04d.%02d.%02d", RTC.get(DS1307_YR,true), RTC.get(DS1307_MTH,false), RTC.get(DS1307_DATE,false)); lcd.print(sdate); lcd.setCursor(0,1); lcd.print("Time: "); sprintf(stime, "%02d:%02d:%02d", RTC.get(DS1307_HR,false), RTC.get(DS1307_MIN,false), RTC.get(DS1307_SEC,false)); lcd.print(stime); }Максим, благодарю! Теперь работает, только почему Ваш код заработал, а мой нет я не понял.. разница ведь только в true/false в начале, но в чем разница между этими значениями нигде информации не нашел...
Вижу, ты так и не увеличил размер массива. У тебя запихивается в массив sdate 10 символов, а надо еще место под завершающий символ с кодом 0. Также и в stime. Увеличь размер, а то запись пойдет неизвестно куда.
Да кстати, не обратил внимание на эту красоту:
charsdate[11];02charstime[9];Дело вам говорят, нужны еще по одному символу в массивах
Иначе не равен час впишется этот ноль куда нибудь туда, куда не надо или наоборот затрется и будет вам экран показывать содержимое ОЗУ.
msg31, maksim
да, да. Спасибо.
туда тоже добавил по дополнительному элементу. Пока вроде больше загвоздок не появилось.
PS: Пытаюсь сделать 4х канальный таймер для аквариума, а то китайские одноканальные периодически скидывают время и места много занимают...
Надо будет и себе попробовать
Супер! Теперь вышло.
Покажите пожалуйста, в каком виде все это получилось, чет читаю и ничего не пойму!!
Вот мой тестовый вариант.
int a = 3; char b = '-'; float c = 3.14; char output_string[16]; // void setup(){ Serial.begin(4800); } void loop(){ sprintf ( output_string, "%02i %2c %4.2f", a, b, c ); // output_string - куда выводить, массив char // "%02i %2c %4.3f" формат вывода аргументов: // %02(два поля - сначала нули)i(int) // %2(два поля)c(char) // %4(4 поля всего).2(после запятой)f(float) // про форматы - htp://www.chitay.org/c/13/printf.htm Serial.println(output_string); delay (1000); }У меня Ваш пример не выводит переменую типа float.
и не выведет. %f в указателях формата работать не будет, особенности платформы. примите это как данность. если хочется вывести вещественное число, то выводите отдельно целую часть, затем запятую как символ, и затем дробную часть
ап
я вообще не понял сути заморочек - делал бы так и не парился бы:
lcd.print("температура: "); lcd.print(h_temp);Мне нужно засунуть в стринг число с точкой например 12.33 или 4.26.
Через %f это не получается.
и не выведет. %f в указателях формата работать не будет, особенности платформы. примите это как данность. если хочется вывести вещественное число, то выводите отдельно целую часть, затем запятую как символ, и затем дробную часть
хм...
Serial.begin(9600); char buf[10]; char sbuf[50]; float f = 10.25; int i = 256; char* s = "String"; dtostrf(f,10,3,buf); sprintf_P(sbuf,PSTR("testing float %s and int %d plus %s"),buf,i,s); Serial.println(sbuf);Я вижу доминацию гена лени над желанием и интелектом. За 15 минут решил ...
Если будут помогать такие люди как Вы, то глупые вопросы рано или позно кончаться... ну, я хочу в это верить.
а в чем разница между sprintf_P и sprintf?
Строка формата берётся из Флеша, а не из озу
Пиши lcd.init();
Вместо lcd.begin();
А по поводу темы топика - я такие вещи вот так выводу
lcd.print(F("значение: ") + (String)intVal + " %");
Это уже чудеса какие-то. Кто говорит? Что за ошибка?
А если перенести всё из loop в setup?
неа смайла всё равно нет (я перенёс функции в setup)
а другие символы (стандартные) - выводит?
yes
da
Попробуй создать и вывести не нулевой знак, а первый, чота помнится, у меня тоже с нулевым символом проблемы были (но это неточно)
пробовал неполучилось ( если что версия ардю 1.0.6)
Ты б еще на 0.0.1b запустить пытался
а чего не так?