TFT HX3847D вывод переменных и очистка экрана

leftmails
Offline
Зарегистрирован: 19.09.2019

Добрый день.

На arduino MEga (так же ранее на UNO тестировал) поставил шилд 2.8inc TFT Touch Shield

Пробовал на разных драйверах но запустилось только на этом

Хотел вывести переменную, но не получается через void TFT::lcd_display_string

Обычный вывод:

Tft.lcd_display_string(60, 120, (const uint8_t *)"1Hello, world !", FONT_1608, RED);

А вот с 

String str1="asdf";

Tft.lcd_display_string(60, 120, str1, world !", FONT_1608, RED);

Не получается.

Пожалуйста помогите разобраться с этими драйверами, что бы нормально работать с этим экраном.

PS: Гуглил. Пытался запустить на других библиотеках, но не получилось - белый экран

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

1. Вас не смущает незакрытая кавычка во втором примере? А вот компилятор она, наверняка, смущает.

2. Ничего, что в первом примере методу lcd_display_string передаётся пять параметров, а во втором примере - шесть?

leftmails
Offline
Зарегистрирован: 19.09.2019

ЕвгенийП пишет:

1. Вас не смущает незакрытая кавычка во втором примере? А вот компилятор она, наверняка, смущает.

2. Ничего, что в первом примере методу lcd_display_string передаётся пять параметров, а во втором примере - шесть?

Странно очень скопировалось, в первом посте это неправильное копирование 

String as="asd";
Tft.lcd_display_string(60, 152, "HELLO!", FONT_1608, RED); // Нормально
Tft.lcd_display_string(60, 132, as, FONT_1608, RED); // ошибка

Вот что выдает компилятор:


\Arduino\libraries\HX8347D/LCD.h:175:7: note: initializing argument 3 of 'void TFT::lcd_display_string(uint16_t, uint16_t, const uint8_t*, uint8_t, uint16_t)'

  void lcd_display_string(uint16_t hwXpos, //specify x position.

       ^
242: error: no matching function for call to 'TFT::lcd_display_string(int, int, String&, int, unsigned int)'

242:51: note: candidate is:

:16:0:

\Arduino\libraries\HX8347D/LCD.h:175:7: note: void TFT::lcd_display_string(uint16_t, uint16_t, const uint8_t*, uint8_t, uint16_t)

  void lcd_display_string(uint16_t hwXpos, //specify x position.

       ^

\Arduino\libraries\HX8347D/LCD.h:175:7: note:   no known conversion for argument 3 from 'String' to 'const uint8_t* {aka const unsigned char*}'

exit status 1
no matching function for call to 'TFT::lcd_display_string(int, int, String&, int, unsigned int)'

Вот вырезка из библиотеки LCD.cpp

//display a string at the specified position on lcd.
void TFT::lcd_display_string(uint16_t hwXpos, //specify x position.
                         uint16_t hwYpos,   //specify y position.
                         const uint8_t *pchString,  //a pointer to string
                         uint8_t chSize,    // the size of the string 
                         uint16_t hwColor)  // specify the color of the string 
{

	if (hwXpos >= LCD_WIDTH || hwYpos >= LCD_HEIGHT) {
		return;
	}
	
    while (*pchString != '\0') {       
        if (hwXpos > (LCD_WIDTH - chSize / 2)) {
			hwXpos = 0;
			hwYpos += chSize;
			if (hwYpos > (LCD_HEIGHT - chSize)) {
				hwYpos = hwXpos = 0;
				lcd_clear_screen(0x00);
			}
		}
		
        lcd_display_char(hwXpos, hwYpos, (uint8_t)*pchString, chSize, hwColor);
        hwXpos += chSize / 2;
        pchString ++;
    } 
}

 

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

дак он тебе и говорит, что 

const uint8_t *pchString,

и String &   

это совсем-совсем, с его точки зрения, разные типы

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

объяви вместо

String as="asd";

const char *as = "asd";

и ты удивишься. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

leftmails пишет:

Вот что выдает компилятор:

И что Вас смущает? Функция ожидает типа "const uint8_t*" а Вы ей пихаете "String&". Вот она и не понимает что ей делать. Передавайте ей константный указатель на uint8_t, и будет Вам счастье. Ну или добавьте метод, принимающий String&, и тогда передавайте что хотите.

leftmails
Offline
Зарегистрирован: 19.09.2019

DetSimen пишет:

объяви вместо

String as="asd";

const char *as = "asd";

и ты удивишься. 

Спасибо! удивился!

А как можно вывести переменную типа int? и с плавающей точкой?  

 

 

ЕвгенийП пишет:

И что Вас смущает? Функция ожидает типа "const uint8_t*" а Вы ей пихаете "String&". Вот она и не понимает что ей делать. Передавайте ей константный указатель на uint8_t, и будет Вам счастье. Ну или добавьте метод, принимающий String&, и тогда передавайте что хотите.

А как это сделать?

ua6em
ua6em аватар
Онлайн
Зарегистрирован: 17.08.2016

DetSimen пишет:

объяви вместо

String as="asd";

const char *as = "asd";

и ты удивишься. 

Строковые константы, записанные в "двойных кавычка" интерпретируются компилятором как массив символов, а не объект класса String.

leftmails
Offline
Зарегистрирован: 19.09.2019

Я сделал чтоб можно было выводить численную переменную

int a=2019;
String str;
str=String(a);
str.toCharArray(as,20);
Tft.lcd_display_string(60, 132, as, FONT_1608, RED);

 

Хотел вывести русскими буквами, а кодировка не поддерживается, может кто подскажет каким образом можно руссифицировать? Очистку экрана тоже не нашел

Tft.lcd_display_string(60, 152, "Привет", FONT_1608, RED); // Нормально

 

b707
Offline
Зарегистрирован: 26.05.2017

leftmails пишет:

ЕвгенийП пишет:

И что Вас смущает? Функция ожидает типа "const uint8_t*" а Вы ей пихаете "String&". Вот она и не понимает что ей делать. Передавайте ей константный указатель на uint8_t, и будет Вам счастье. Ну или добавьте метод, принимающий String&, и тогда передавайте что хотите.

А как это сделать?

как передать указатель на uint8_t - показал DetSimen на пару сообщений выше. А как добавить метод - вам пока обьяснить будет не проще, чем обьяснить блондинке, как перебрать коробку передач лексуса :)

читайте учебники и начните с чего-нибудь простого.

b707
Offline
Зарегистрирован: 26.05.2017

leftmails пишет:

Я сделал чтоб можно было выводить численную переменную

Хотел вывести русскими буквами, а кодировка не поддерживается

что именно вы хотели вывести русскими буквами в числовой переменной? :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

leftmails пишет:

А как можно вывести переменную типа int? и с плавающей точкой?  

А библиотеку открывали? Смотрели? Название функции "lcd_display_num" ничего не навеяло?

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

leftmails пишет:
может кто подскажет каким образом можно руссифицировать?
Надо шрифт заменить.

Но Вы же сейчас спросите "а как?". Ответ простой, запостить запрос в разделе "Ищу исполнителя", заплатить и Вам сделают.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ua6em пишет:

Строковые константы, записанные в "двойных кавычка" интерпретируются компилятором как массив символов, а не объект класса String.

ты тоже удивишься, но тут неявно вызывается конструктор String с параметром const char *

leftmails
Offline
Зарегистрирован: 19.09.2019

Помогите пожалуйста очистить экран

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

жидкость купи для очистки экранов, стоит недорого.  

ну, или найди функцию clear() или clrscr() в своей библиотеке

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

leftmails пишет:

Помогите пожалуйста очистить экран

Простите, Вы издеваетесь и троллите всех? В посте #11 я Вас спросил

ЕвгенийП пишет:

А библиотеку открывали? Смотрели? 

Неужели даже после этого Вы не открыли и не посмотрели её? А если смотрели, то как Вы умудрились не заметить там метода "void lcd_clear_screen(uint16_t hwColor)"?

nik182
Offline
Зарегистрирован: 04.05.2015

Выведи прямоугольник залитый нужным цветом.

b707
Offline
Зарегистрирован: 26.05.2017

leftmails пишет:

Помогите пожалуйста очистить экран

блин, ну откройте уже библиотеку и почитайте названия функций! Ведь так и назыывается - "очистка экрана". только по ангельски

leftmails
Offline
Зарегистрирован: 19.09.2019

ЕвгенийП пишет:

leftmails пишет:

Помогите пожалуйста очистить экран

Простите, Вы издеваетесь и троллите всех? В посте #11 я Вас спросил

ЕвгенийП пишет:

А библиотеку открывали? Смотрели? 

Неужели даже после этого Вы не открыли и не посмотрели её? А если смотрели, то как Вы умудрились не заметить там метода "void lcd_clear_screen(uint16_t hwColor)"?

Прошу прощение если сморозил глупость или что то еще по незнанке

Я пробовал

lcd_clear_screen(WHITE);

Выдавал ошибку что ненайдена функция.

Сейчас сделал 

Tft.lcd_clear_screen(WHITE);

И все ГУД.

 

Спасибо большое за информацию!!

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

leftmails пишет:

Помогите пожалуйста очистить экран

А мы уже думали вылетать на помощь.  Ключевое слово прозвучало 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

leftmails пишет:

Я пробовал

lcd_clear_screen(WHITE);

Выдавал ошибку что ненайдена функция.

Сейчас сделал 

Tft.lcd_clear_screen(WHITE);

И все ГУД.

Я так понял, программирование выполняется методом тыка. Никакого понимания что означает "lcd." нет.

При таком подходе у Вас будут возникать проблемы на каждом шагу. А самое страшное, открою Вам большой секрет, нередко бывает, что компилятор всё съедает и не ругается, а программа  работает совсем не так, как хотелось.

Хотите нормально жить, возьмите всё же хорошую книжку по языку и изучите.

leftmails
Offline
Зарегистрирован: 19.09.2019

ЕвгенийП пишет:

мите всё же хорошую книжку по языку и изучите.

Хорошо, буду изучать!

 

Прошу подсказать, в данной библиотеке не нашел поворот экрана, это нужно изучать документацию на чип экрана?

Ворота
Ворота аватар
Offline
Зарегистрирован: 10.01.2016

Кончайте придираться к начинающим. Тут вон великие профи запросы памяти методом тыка вставляют, по принципу "только бы скомпилировать, а там хоть всю память засри", а вы на новичка наезжаете.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

leftmails пишет:

Прошу подсказать, в данной библиотеке не нашел поворот экрана, это нужно изучать документацию на чип экрана?

должен быть метод, содержащий "rotate" в названии.  Ищи. 

leftmails
Offline
Зарегистрирован: 19.09.2019

DetSimen пишет:

должен быть метод, содержащий "rotate" в названии.  Ищи. 

К сожалению его нету, несколько раз просмотрел библиотеку *.h и *.cpp

Приложил бы к приложению, но не знаю как, а полностью код если выложу боюсь меня тут вообще линчуют)

 

b707
Offline
Зарегистрирован: 26.05.2017

leftmails пишет:

К сожалению его нету, несколько раз просмотрел библиотеку *.h и *.cpp

 

В этой библиотеке вывод производится по одной точке за раз, то есть для поворота достаточно поменять height и width дисплея и х и у точки в паре мест

leftmails
Offline
Зарегистрирован: 19.09.2019

b707 пишет:

В этой библиотеке вывод производится по одной точке за раз, то есть для поворота достаточно поменять height и width дисплея и х и у точки в паре мест

Пожалуйста подскажите подробнее

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

leftmails пишет:
К сожалению его нету, несколько раз просмотрел библиотеку *.h и *.cpp

Ну, я же Вам сказал, начните с чтения книжки. Вы плюёте на советы и отсюда у Вас проблемы не ровном месте.

В библиотеке есть запись в регистры. А регистрами настраивается всё, в том числе и поворот изображения (причём даже не всего, а можно по частям.

Как именно настраивается и что писать в какие регистры написано в даташите в разделе 6. Там даже картинки есть лежащих на боку и перевёрнутых букв.

Но Вы это не реализуете пока у Вас проблема функции нормальный типа передать.

Начните с учёбы, а не со сложного проекта. Наоборот не работает. Даже если кто и подскажет как написать букву А, у Вас тут же новый вопрос появится про букву Б (как в этой теме - "надо вывести строку, ой - и число, ой - и повернуть, ой ...) . В итоге, Вас просто начнут посылать.

b707
Offline
Зарегистрирован: 26.05.2017

leftmails пишет:

b707 пишет:

В этой библиотеке вывод производится по одной точке за раз, то есть для поворота достаточно поменять height и width дисплея и х и у точки в паре мест

Пожалуйста подскажите подробнее

в библиотеке есть метод, который рисует на экране одну точку с координатами х и у, называется, по-моему, draw_pixel(). Попробуйте в этой функции просто поменять х и у местами, сохраните ее в библиотеке и выведите на экран како-нить текст. Если я не ошибаюсь - текст выведется в вертикальном направлении, правда отзеркаленный по оси у. Если получится - можно будет дальше думать, как оформить поворот экрана в виде удобной функции.

Все это я пишу только потому, что считаю некрасивым сказать А и не сказать Б, раз уж начал. А так в принципе я полностью согласен с Евгением - без базовых знаний никакие подсказки типа этой не помогут вам довести проект до конца.