TFT 3,5" и Ардуино

asvitich
Offline
Зарегистрирован: 10.06.2016

прошу прощения первый опыт, нашел в интернете нечто подобное .... что за индикатор... хотя бы на одном примере показали... пытаюсь из него переделать под tft

#include <Wire.h>        // Добавляем необходимые библиотеки
#include <LiquidCrystal_I2C.h>
#include <dht11.h>
dht11 DHT;               // Объявление переменной класса dht11
#define DHT11_PIN 4      // Датчик DHT11 подключен к цифровому пину номер 4

byte degree[8] =         // Битовая маска символа градуса
{
  B00111,
  B00101,
  B00111,
  B00000,
  B00000,
  B00000,
  B00000,
};    
 
LiquidCrystal_I2C lcd(0x27,16,2);   // Задаем адрес и размерность дисплея

void setup()
{
  lcd.init();                       // Инициализация lcd             
  lcd.backlight();                  // Включаем подсветку
  lcd.createChar(1, degree);        // Создаем символ под номером 1
}

void loop()
{
  // Выводим показания влажности и температуры
  lcd.setCursor(0, 0);              // Устанавливаем курсор в начало 1 строки
  lcd.print("Humidity =    % ");     // Выводим текст
  lcd.setCursor(11, 0); 
  lcd.print(DHT.humidity, 1);
  lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
  lcd.print("Temp     =   \1C ");    // Выводим текст, \1 - значок градуса
  lcd.setCursor(11, 1);             
  lcd.print(DHT.temperature,1);  

  int chk;    
  ; // Мониторинг ошибок
  chk = DHT.read(DHT11_PIN);    // Чтение данных
  switch (chk){
  case DHTLIB_OK:  
    break;
  case DHTLIB_ERROR_CHECKSUM:  
    lcd.clear(); 
    lcd.print("Checksum error");  
    break;
  case DHTLIB_ERROR_TIMEOUT:
    lcd.clear(); 
    lcd.print("Time out error");
    break;
  default:
    lcd.clear(); 
    lcd.print("Unknown error");
    break;
  }
  delay(1000);                     
}

 

diger67
Offline
Зарегистрирован: 25.07.2015

Первое, надо знать какой чип управляет матрицей TFT. Второе, правильно опредилить протокол обмена, SPI, 16 бит, 8 бит, I2C. Правильно инициализировать индикаор. После этих действий все просто, смотрим функции библиотеки, получаем желаемый рзультат. Смотрите предыдущий...

URkA
Offline
Зарегистрирован: 21.03.2014

http://arduinolab.pw/index.php/2015/12/01/meteostanciya-na-arduino/ Стандартная задача решенная в 1000 различных  вариантов. Писать надо подробно,что есть,что делал,а не дайте мне готовое решение. Даже в стандартных примерах ардуино ,есть вывод на TFTдисплей (и не только) в нескольких вариантах. Всю тему замусорили,какое отночение это имеет к данной теме,а никакого. Вот берите и делайте. Люди которые хотят вам помочь, вынуждены из вас все тянуть.

smotritel
Offline
Зарегистрирован: 26.03.2016

У меня такойже. Особо разбираться времени нет, месяц уже лежит :-( Проверял когда получил. Работает и с uno и с due, но либы adafruitgfx. (due подключать проводками по распиновке из примера) определяется как ili9488. 

asvitich
Offline
Зарегистрирован: 10.06.2016

Подскажите на дисплее TFT_HX8357 http://ru.aliexpress.com/item/Free-shipping-3-2-inch-TFT-LCD-screen-module-Ultra-HD-320X480-for-Arduino-MEGA-2560/32555113223.html можно сделать русские надписи?

arduinec
Offline
Зарегистрирован: 01.09.2015

asvitich пишет:

Подскажите на дисплее TFT_HX8357 можно сделать русские надписи?

Маркёром запросто (шутка конечно) :)

Разумеется, на графическом диплее можно нарисовать любые шрифты, в том числе и русские.

Если для отображения на нём вы используете библиотеку Adafruit, то её руссификация описана здесь: http://arduino.ru/forum/programmirovanie/rusifikatsiya-biblioteki-adafru...

Дядя Вова
Дядя Вова аватар
Offline
Зарегистрирован: 31.07.2014

Извиняюсь, что поднимаю старое. Но нашел в своем посте ошибку. При таком изменении происходит сброс свободных портов.

Дядя Вова пишет:

В этой библе в файле \UTFT\hardware\avr\HW_ATmega328P.h заменил код функциии

скорость отричовки шрифтов увеличилась в 6 - 9 раз
[Arduino uno R3 + TFTLCD 3.5" ili9723 8бит ]

void UTFT::LCD_Writ_Bus(char VH,char VL, byte mode)
{  
    
//// 30.07.14
//// Заменено на:
  PORTB = VL & 0x3;  // очистить биты с 2 по 7
  PORTD = VL & 0xFD;  // очистить биты с 0 по 1,
  pulse_low(P_WR, B_WR);

}

Не уверен, что прав, но с реле работает такое исправление:

void UTFT::LCD_Writ_Bus(char VH,char VL, byte mode)
{   
// 16.06.16 Сохранить порты
  byte B=PORTB; 
  byte D=PORTD; 
//// 30.07.14
//// Заменено на:
  PORTB = VL & 0x3;  // очистить биты с 2 по 7, оставить биты  0 и 1 неизмененными (xx & 11 == xx)
  PORTD = VL & 0xFD;  // очистить биты с 0 по 1,
  pulse_low(P_WR, B_WR);//#define pulse_low(reg, bitmask) cbi(reg, bitmask); sbi(reg, bitmask);

// 16.06.16 восстановить порты
  PORTB=B;PORTD=D;}

Предложите pls код для правильной, маскированной записи порта.

diger67
Offline
Зарегистрирован: 25.07.2015

Посидел тут на досуге, посмотрел разные библиотеки для tft и родилась вот такая функция.

void setTextCenter(char *st)
{
 uint16_t stl = strlen(st);
 
 text_poz = ((_width + 1) - (stl * textsize*6))/2;
}

Она дает возможность не сидеть с калькулятором высчитывая позицию первого символо, если надо расположить строку ровно по середине. Проверено пока под C. Будет время добавлю в библиотеку Adafruit С++. 

slider
Offline
Зарегистрирован: 17.06.2014

Дык, это решение в UTFT уже было, и называется оно CENTER , в любом ихнем примере чуть-ли не первой строчкой вывода строки на экран 

 myGLCD.print("* Universal Color TFT Display Library *", CENTER, 1);

...

myGLCD.print("<http://electronics.henningkarlsen.com>", CENTER, 227);

...

 

diakin
diakin аватар
Offline
Зарегистрирован: 04.06.2016

slider пишет:

[ сделать просто , дёшево и повторяемо.  

А так для не большой скорости вывода, но с огромным количеством пикселей, для большого количества графиков и инфы, как-то думал сделать "народный" вариант (просто,дёшево,повторяемо), 
(cut....)

 Ещё видел в инете фабричную платку, сделан видеоконтроллер сразу LVDS  на ПЛИС ( Spartan 3E 250K FPGA ) и обычной памяти SRAM .  Т.к. амеровский , то будет стоить невероятно дорого. Разрешение 1366x768 , что гораздо лучше шилда Gameduino .
(cut..)

Видел предложение использовать в качестве дисплея планшет под Андроид, инфу с Ардуино гнать через Serial.
Цена 7'' в районе 2000 руб. Ну так там все есть.
 

K_L
Offline
Зарегистрирован: 30.06.2016

Добрый день!

Кто встречал такого зверя http://www.aliexpress.com/item-img/Free-shipping-LCD-module-TFT-3-5-inch-TFT-LCD-screen-for-Arduino-MEGA2560-Board/1681818932.html?spm=2114.10010208.0.52.HsHwAN

Как его запустить в связке с Arduino mega 2560?

slider
Offline
Зарегистрирован: 17.06.2014

K_L пишет:

Добрый день!

Кто встречал такого зверя http://www.aliexpress.com/item-img/Free-shipping-LCD-module-TFT-3-5-inch-TFT-LCD-screen-for-Arduino-MEGA2560-Board/1681818932.html?spm=2114.10010208.0.52.HsHwAN

Как его запустить в связке с Arduino mega 2560?

может попастся какой угодно дисп, но это не проблема, возможно это решение в соседней ветке  поможет, по разрешению нет а по разводке совпадает :  http://arduino.ru/forum/apparatnye-voprosy/35-tft-lcd-krasnyi-megovskii-mega-2560-r3-resheno-kak-reshit-drugie#comment-204256 , если не хотеите греть голову , читайте отзывы на странице товара, иногда народ пишет что им подошло.

tokima
Offline
Зарегистрирован: 29.08.2015

GamS пишет:

Большое спасибо за помощь, дисплей запустился, подошло вот это:

 

Не могли бы Вы более подробно описать чего надо редактировать , а то у меня точно такой же дисплей( один в один) и ни как не могу запустить. Редактирую файл UTFT\hardware\avr\HW_ATmega1280.h - все равно белый экран. Видимо чего то не доделываю. 

diger67
Offline
Зарегистрирован: 25.07.2015

Доброго времени суток. На новизну функции вывода строки ориентированной по центру строки TFT не претендую, к томуже это рыба, ее нужно дописывать под ратацию разных чипов. Немного доработал функцию drawChar. Теперь можно переписывать символ в указанной позиции без предварительного зарисовывания его прямоугольникомю Очень удобно при выводе показаний в заданную область, например секунды, вольтметер, частотомер и т.д.. Для Adafruit выглядит это так

void Adafruit_GFX::drawChar(int16_t x, int16_t y, unsigned char c, uint16_t color, uint16_t bg, uint8_t size)
{
 int8_t i, j;
  if((x >= _width)            || // Clip right
     (y >= _height)           || // Clip bottom
     ((x + 6 * size - 1) < 0) || // Clip left
     ((y + 8 * size - 1) < 0))   // Clip top
    return;

  if(!_cp437 && (c >= 176)) c++; // Handle 'classic' charset behavior

  for (i=0; i<6; i++ )
  {
    uint8_t line;
    if (i == 5)
      line = 0x0;
    else
      line = pgm_read_byte(font+(c*5)+i);
    for (j = 0; j<8; j++)
    {
      if (line & 0x1)
      {
        if (size == 1) // default size
          drawPixel(x+i, y+j, color);
        else {  // big size
          fillRect(x+(i*size), y+(j*size), size, size, color);
        }
      } else if (bg != color) {
        if (size == 1) // default size
          drawPixel(x+i, y+j, bg);
        else {  // big size
          fillRect(x+i*size, y+j*size, size, size, bg);
        }
      }//добавленный кусок функции позволяющий напрямую переписывать символ
   if (line & 0)
   {
    if (size == 1)
     drawPixel(x+i, y+j, bg);
    else {  // big size
          fillRect(x+(i*size), y+(j*size), size, size, bg);
        }
   }
      line >>= 1;
    }
  }
}

При этом практически незаметно мерцание текста, естественно перед этим нужно использовать функцию установки цвета текста и фона, так как в библиотеке Adafruit их две. С одним и двумя аргументами.

void Adafruit_GFX::setTextColor(uint16_t c) {
  // For 'transparent' background, we'll set the bg 
  // to the same as fg instead of using a flag
  textcolor = textbgcolor = c;
}

void Adafruit_GFX::setTextColor(uint16_t c, uint16_t b) {
  textcolor   = c;
  textbgcolor = b; 
}

Пробуйте, ругайте если что...... :-))

K_L
Offline
Зарегистрирован: 30.06.2016

slider пишет:

может попастся какой угодно дисп, но это не проблема, возможно это решение в соседней ветке  поможет, по разрешению нет а по разводке совпадает :  http://arduino.ru/forum/apparatnye-voprosy/35-tft-lcd-krasnyi-megovskii-mega-2560-r3-resheno-kak-reshit-drugie#comment-204256 , если не хотеите греть голову , читайте отзывы на странице товара, иногда народ пишет что им подошло.

Спасибо!

varvik85
Offline
Зарегистрирован: 28.01.2013

Отчаянное сообщение!!!Купил таких http://ru.aliexpress.com/item/3-5-inch-TFT-Touch-LCD-Screen-Display-Modu... вот два дисплея. Повелся на отзыв одного из покупателей,о том, что купленные им дисплеи прекрасно работат с библиотекой MCUFRIEND_kbv У меня оба дисплея не работают,пепепробовал все разрешения которые есть в вышеупомянутой библиотке,со всеми примерно одно и то-же.Пробовал кучу других библиотек,ничего не работает блин ((( Мужики,может кто-то как и я стал счастливым обладателем таких дисплеев и смог в них разобраться?Помогите а?Я пробую пока их на ардуино uno

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

В первую очередь я бы задал такой вопрос продавцу.

Естественно, не по версии конкретной библиотеки для конкретного дисплея, а вообще насчет любой библиотеки, с котоой бы работал дисплей.

Обычно это приводит к желаемому результату. Правда, помнится, продавец дал мне такой линк, который я Файрфоксом за ~15-20 попыток выкачать так и не смог, пришлось прибегнуть к wget'у.

varvik85
Offline
Зарегистрирован: 28.01.2013

Здравствуйте.Спасибо!Да я писал продавцу,он прислал мне вот такой код

//_9481uno
#define LCD_RD   A0
#define LCD_WR   A1     
#define LCD_RS   A2        
#define LCD_CS   A3       
#define LCD_REST A4

void Lcd_Writ_Bus(unsigned char VH)
{
  unsigned int i,temp,data; 
  data=VH;
  for(i=8;i<=9;i++)
  {
    temp=(data&0x01);
    if(temp)
      digitalWrite(i,HIGH);
    else
      digitalWrite(i,LOW);
    data=data>>1;
  }	
  for(i=2;i<=7;i++)
  {
    temp=(data&0x01);
    if(temp)
      digitalWrite(i,HIGH);
    else
      digitalWrite(i,LOW);
    data=data>>1;
  }	 

  digitalWrite(LCD_WR,LOW);
  digitalWrite(LCD_WR,HIGH);
}


void Lcd_Write_Com(unsigned char VH)  
{   
  digitalWrite(LCD_RS,LOW);
  Lcd_Writ_Bus(VH);
}

void Lcd_Write_Data(unsigned char VH)
{
  digitalWrite(LCD_RS,HIGH);
  Lcd_Writ_Bus(VH);
}

void Lcd_Write_Com_Data(unsigned char com,unsigned char dat)
{
  Lcd_Write_Com(com);
Lcd_Write_Data(dat);
}

void Address_set(unsigned int x1,unsigned int y1,unsigned int x2,unsigned int y2)
{
	Lcd_Write_Com_Data(0x2a,x1>>8);
	Lcd_Write_Com_Data(0x2a,x1);
	Lcd_Write_Com_Data(0x2a,x2>>8);
	Lcd_Write_Com_Data(0x2a,x2);
	Lcd_Write_Com_Data(0x2b,y1>>8);
	Lcd_Write_Com_Data(0x2b,y1);
	Lcd_Write_Com_Data(0x2b,y2>>8);
	Lcd_Write_Com_Data(0x2b,y2);
	Lcd_Write_Com(0x2c); 							 
}

void Lcd_Init(void)
{
  digitalWrite(LCD_REST,HIGH);
  delay(5); 
  digitalWrite(LCD_REST,LOW);
  delay(15);
  digitalWrite(LCD_REST,HIGH);
  delay(15);

  digitalWrite(LCD_CS,HIGH);
  digitalWrite(LCD_WR,HIGH);
  digitalWrite(LCD_CS,LOW);  //CS

	Lcd_Write_Com(0x11);
	delay(20);
	Lcd_Write_Com(0xD0);
	Lcd_Write_Data(0x07);
	Lcd_Write_Data(0x42);
	Lcd_Write_Data(0x18);

	Lcd_Write_Com(0xD1);
	Lcd_Write_Data(0x00);
	Lcd_Write_Data(0x07);
	Lcd_Write_Data(0x10);

	Lcd_Write_Com(0xD2);
	Lcd_Write_Data(0x01);
	Lcd_Write_Data(0x02);

	Lcd_Write_Com(0xC0);
	Lcd_Write_Data(0x10);
	Lcd_Write_Data(0x3B);
	Lcd_Write_Data(0x00);
	Lcd_Write_Data(0x02);
	Lcd_Write_Data(0x11);

	Lcd_Write_Com(0xC5);
	Lcd_Write_Data(0x03);

	Lcd_Write_Com(0xC8);
	Lcd_Write_Data(0x00);
	Lcd_Write_Data(0x32);
	Lcd_Write_Data(0x36);
	Lcd_Write_Data(0x45);
	Lcd_Write_Data(0x06);
	Lcd_Write_Data(0x16);
	Lcd_Write_Data(0x37);
	Lcd_Write_Data(0x75);
	Lcd_Write_Data(0x77);
	Lcd_Write_Data(0x54);
	Lcd_Write_Data(0x0C);
	Lcd_Write_Data(0x00);

	Lcd_Write_Com(0x36);
	Lcd_Write_Data(0x0A);


	Lcd_Write_Com(0x3A);
	Lcd_Write_Data(0x55);

	Lcd_Write_Com(0x2A);
	Lcd_Write_Data(0x00);
	Lcd_Write_Data(0x00);
	Lcd_Write_Data(0x01);
	Lcd_Write_Data(0x3F);

	Lcd_Write_Com(0x2B);
	Lcd_Write_Data(0x00);
	Lcd_Write_Data(0x00);
	Lcd_Write_Data(0x01);
	Lcd_Write_Data(0xE0);
	delay(120);
	Lcd_Write_Com(0x29);;

}

void H_line(unsigned int x, unsigned int y, unsigned int l, unsigned int c)                   
{	
  unsigned int i,j;
  Lcd_Write_Com(0x02c); //write_memory_start
  digitalWrite(LCD_RS,HIGH);
  digitalWrite(LCD_CS,LOW);
  l=l+x;
  Address_set(x,y,l,y);
  j=l*2;
  for(i=1;i<=j;i++)
  {
   Lcd_Write_Data(c);
  }
  digitalWrite(LCD_CS,HIGH);   
}

void V_line(unsigned int x, unsigned int y, unsigned int l, unsigned int c)                   
{	
  unsigned int i,j;
  Lcd_Write_Com(0x02c); //write_memory_start
  digitalWrite(LCD_RS,HIGH);
  digitalWrite(LCD_CS,LOW);
  l=l+y;
  Address_set(x,y,x,l);
  j=l*2;
  for(i=1;i<=j;i++)
  { 
    Lcd_Write_Data(c);
  }
  digitalWrite(LCD_CS,HIGH);   
}

void Rect(unsigned int x,unsigned int y,unsigned int w,unsigned int h,unsigned int c)
{
  H_line(x  , y  , w, c);
  H_line(x  , y+h, w, c);
  V_line(x  , y  , h, c);
  V_line(x+w, y  , h, c);
}

void Rectf(unsigned int x,unsigned int y,unsigned int w,unsigned int h,unsigned int c)
{
  unsigned int i;
  for(i=0;i<h;i++)
  {
    H_line(x  , y  , w, c);
    H_line(x  , y+i, w, c);
  }
}
int RGB(int r,int g,int b)
{return r << 16 | g << 8 | b;
}
void LCD_Clear(unsigned int j)                   
{	
  unsigned int i,m;
 Address_set(0,0,480,320);
  Lcd_Write_Com(0x02c); //write_memory_start
  digitalWrite(LCD_RS,HIGH);
  digitalWrite(LCD_CS,LOW);


  for(i=0;i<480;i++)
    for(m=0;m<320;m++)
    {
      Lcd_Write_Data(j>>8);
      Lcd_Write_Data(j);

    }
  digitalWrite(LCD_CS,HIGH);   
}

void setup()
{
  for(int p=2;p<10;p++)
  {
    pinMode(p,OUTPUT);
  }
  pinMode(A0,OUTPUT);
  pinMode(A1,OUTPUT);
  pinMode(A2,OUTPUT);
  pinMode(A3,OUTPUT);
  pinMode(A4,OUTPUT);
  digitalWrite(A0, HIGH);
  digitalWrite(A1, HIGH);
  digitalWrite(A2, HIGH);
  digitalWrite(A3, HIGH);
  digitalWrite(A4, HIGH);
  Lcd_Init();
  LCD_Clear(0xf800);
  
}

void loop()
{  

  for(int i=0;i<1000;i++)
  {
    Rect(random(300),random(300),random(300),random(300),random(65535)); // rectangle at x, y, with, hight, color
  }
  
//  LCD_Clear(0xf800);
}

 

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

varvik85 пишет:

Здравствуйте.Спасибо!Да я писал продавцу,он прислал мне вот такой код

И зачем Вы нам об этом сообщаете?

У нас ведь все равно нет Вашего дисплея, чтобы узнать, работает ли присланный продавцом код.

varvik85
Offline
Зарегистрирован: 28.01.2013

varvik85 пишет:

Здравствуйте.Спасибо!Да я писал продавцу,он прислал мне вот такой код

Пытался подредактировать сообщение,но что то не получилось.В общем с его кодом дисплей заливает красным и вверху маленькая строка в несколько пикселей,в которой видно выполнение остальной части программы.Написал продавцу,что код мол не тот,а он пишет что так и должно быть,что заливает все красным а если дальше хотите чтоб дисплей работал пишите свой код.Вот такая печаль беда...Мужики,кто поможет подобрать подходящую рабочую библиотеку,тому отправлю почтой за свой счет один дисплей!

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Вообще-то код должен не заливать красным, а рисовать 1000 прямоугольнико случайных размеров и цвета.

Снимите видео, вышлите продавцу и потребуйте обратно деньги.

diger67
Offline
Зарегистрирован: 25.07.2015

​varvik85 , в примере продовца есть основеое массив инициализации. Если вы дружите с програмированием, то все абсолютно просто. Попробуйте из Loop удалить  записанную там строку и записать туда что то типа

H_line(160, 0, 480, 0x0000);
V_line(0, 240, 320, 0x0000);
//это отрисует крест  белого цвета
Rect(135, 215, 50, 50, 0xFFE0);
//должен отрисоваться квадрат по середине экрана.

Если ​ эти функции сделают то что описано в комментарии, останеться только добавить файл инициализации в UTFT подредактировать некоторые строки в файле UTFT.c и UTFT.h. Вуаля......

P.S. Сам то откуда, если все срастется с выше предложенным примером то и с библой решим. 

diger67
Offline
Зарегистрирован: 25.07.2015

andriano пишет:

Вообще-то код должен не заливать красным, а рисовать 1000 прямоугольнико случайных размеров и цвета.

Снимите видео, вышлите продавцу и потребуйте обратно деньги.

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

diger67 пишет:

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

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

diger67
Offline
Зарегистрирован: 25.07.2015

andriano пишет:

По словам varvik85 экран заливается красным........

Правильно, так и должно быть. Об этом говорит строчка

LCD_Clear(0xf800);

Если посмотреть тело данной функции, то видно что она закрашивает экран красным. Просто автор назвал ее Clear , а не FillScreen.... Вот небольшой список дефайнов основных цветов.

#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
//#define ROZ     0xFD20
#define ROZ     0xFBE0
#define GRI     0xBDF7

#define NAVY 0x000F
#define DGREEN 0x03E0
#define DCYAN 0x03EF
#define MAROON 0x7800
#define PURPLE 0x780F
#define OLIVE 0x7BE0
#define GREY 0xF7DE
#define LGRAY 0xC618
#define DGRAY 0x7BEF

Я так понимаю вы не глубоко знаете работу TFT.

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

diger67 пишет:

andriano пишет:

По словам varvik85 экран заливается красным........

Правильно, так и должно быть. Об этом говорит строчка

LCD_Clear(0xf800);

 

Я так понимаю вы не глубоко знаете работу TFT.

Я так понимаю, что кто-то невнимательно смотрит на код. В приведённом коде строчка LCD_Clear(0xf800); закомментирована. Т.е. заливать красным ничего не должно, и andriano тут абсолютно прав.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

diger67 пишет:

Я так понимаю вы не глубоко знаете работу TFT.

А я ее вообще не знаю.

Но я знаю, что если на экран 480х320 вывести 1000 прямоугольников по случайным координатам, то от цвета заливки там уже мало что останется. И, кстати, я сильно сомневаюсь, чтобы этот факт мог как-то измениться от того, если вместо TFT была бы, скажем, CRT.

diger67
Offline
Зарегистрирован: 25.07.2015

DIYMan пишет:

Я так понимаю, что кто-то невнимательно смотрит на код. В приведённом коде строчка LCD_Clear(0xf800); закомментирована. Т.е. заливать красным ничего не должно, и andriano тут абсолютно прав.

Ну если этой функции нет в секции setup, тогда да. А так Вам надо текст скетча внимательней читать. Специально для пользователей библиотек привел как пример соответствие цветов к 16 бит значению. Там четко видно что 0хF800 - это RЕD т.е. красный.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

diger67 пишет:

Ну если этой функции нет в секции setup, тогда да.

Так оттуда она исполняется 1 раз. А из loop - каждый проход по 1000 раз. Останется после этого на экране красный?

Цитата:
Специально для пользователей библиотек привел как пример соответствие цветов к 16 бит значению. Там четко видно что 0хF800 - это RЕD т.е. красный.

Как раз это можно было бы не приводить:

- известно, что обычно такие дисплеи работают с 16-18 битным цветом (с Ардуино, понятное дело, предпочтительнее 16),

- если глубина цвета 16, значит, на красный (равно как и на синой) должно приходиться 5 разрядов,

- 0xF800 - это как раз 5 разрядов с краю, т.е. либо красный, либо синий.

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

 

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

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

diger67 пишет:

DIYMan пишет:

Я так понимаю, что кто-то невнимательно смотрит на код. В приведённом коде строчка LCD_Clear(0xf800); закомментирована. Т.е. заливать красным ничего не должно, и andriano тут абсолютно прав.

Ну если этой функции нет в секции setup, тогда да. А так Вам надо текст скетча внимательней читать. Специально для пользователей библиотек привел как пример соответствие цветов к 16 бит значению. Там четко видно что 0хF800 - это RЕD т.е. красный.

Точняк, в setup вызов проглядел. А за определение цветов - не надо так волноваться, 0xF800 - это не красный, чисто красный - это 0xFF0000, если что. Я знаю, как кодируется RGB, а также, как кодируется ARGB, CMYK и прочие хрени. Вопрос-то поднят не про красный цвет, однако ;)

diger67
Offline
Зарегистрирован: 25.07.2015

DIYMan пишет:

Вопрос-то поднят не про красный цвет, однако ;)

Включаем логику, если экран заливает красным фоном, значит он проинициализирован правильно, а следовательно исправен. То что рисует 1000 мелких прямоугольников гдето в углу, тоже говорит в пользу исправности TFT. Вывод, читаем даташит на чип TFT, разбираемся с работой библиотек, корректируем под свои нужды. Вот я действительно прилип с последним экранчиком, мало того что пришол с трещиной на таче. так еще и припаяли экран а разводка на шиде через одно место сделана. Продован обещал в течении недели выслать новый. Буду перепаивать на макетку для TFT и запускать от STM , без буфферов. Благо  что не привязан к библиотекам и понимаю протокол обмена камня с экранчиком.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

DIYMan пишет:

0xF800 - это не красный, чисто красный - это 0xFF0000, если что.

Если что, то красный это (1.0, 0.0, 0.0).

)))))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

diger67 пишет:

Включаем логику, если экран заливает красным фоном, значит он проинициализирован правильно, а следовательно исправен.

Отнюдь.

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

Цитата:
То что рисует 1000 мелких прямоугольников гдето в углу, тоже говорит в пользу исправности TFT.

Отнюдь.

Прямоугольники согласно коду должны рисоваться в пределах координат от 0 до 598 по каждой из осей, что для экрана 480х320 покрывает всю площадь экрана.

Если все изменения происходят в одном углу, это, наоборот, говорит о неисправности.

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

diger67
Offline
Зарегистрирован: 25.07.2015

​andriano, ну не полинитесь, откройте даташит на ili9481. Или просто прочитайте ветку. При неправильной инициализации или несоответствии битов в шине данных он будет работать как фонарик или криво выводить графику. TFT это не OLED.  Думаю varvik85 уже разобрался и тихонько молчит, боясь выглядеть нубом. Но это не так, всего знать невозможно. По поводу цветов, вы говорите о кодировке 888, но есть еще и 565 и много других. К стати, если в UTFT добавитьфункцию записи цвета без преобразования 888 в 565 можно немного ускорить вывод скрина, ведь такое преобразование нужно только при выводе BMP.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

diger67 пишет:

​andriano, ну не полинитесь, откройте даташит на ili9481. Или просто прочитайте ветку. При неправильной инициализации или несоответствии битов в шине данных он будет работать как фонарик или криво выводить графику.

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

И, не забываем: кроме кривой инициализации есть еще вероятность аппаратной неисправности.

Цитата:
Думаю varvik85 уже разобрался и тихонько молчит, боясь выглядеть нубом.

Вот это прохоже на правду.

Цитата:
По поводу цветов, вы говорите о кодировке 888, но есть еще и 565 и много других.

Вы перед тем, как что-то утверждать, перечитали бы сообщения.

Я прекрасно понял, что Вы говорите о 565 (rrrrrggggggbbbbb), и из моего ответного поста также прекратно видно, что я говорю о ней же. О 888 упомянул DIYMan.

14441mmm
Offline
Зарегистрирован: 16.08.2016

Всем привет! Я подключил экран TFTLCD 3.95" к Ардуино Уно и использовал библиотеку Mcufriend_kvb. И у меня получилось!

diger67
Offline
Зарегистрирован: 25.07.2015

А вы ожидали чего то другого. На этом шилде стоит TFT с ili9488 , а он полностью соместим по регистрам и инициализации с ili9341. Только у первого больше разрешение  320х480.

diger67
Offline
Зарегистрирован: 25.07.2015

Привет, вот и пришло время печали. Получил шилд. Раньше с таким вариантом не встречался. Самое интересное что он инициализируется, но потом глухо серенький экран, если его инициализировать как ili9327 8 бит. Если инициализировать как il932x то появляется ели заметное изображение. Шлейф cdx350-29 v1.1, в интернете нашел только с 19 и 26 и походу это индикатор от sony. Но пока победить не удалось. Все прозвонил, распиновка вроде вся правильная. Вывел пин RD, попытался считать ID. Тщетно выдает ерунду.

varvik85
Offline
Зарегистрирован: 28.01.2013

Здравствуйте.Извините,были проблемы,не до дисплеев было дело .Дигер67 спасибо!Буду пробовать,отпишусь по результатам.Если все получится,то как и обещал,один дисплей отправлю.Еще вопрос,подскажите у кого есть архив который выкладывает бублик  в посту http://arduino.ru/forum/apparatnye-voprosy/tft-35-i-arduino?page=1#comme... ?  в которой он переделал из 16 бит в 8, у меня не качается,на форуме больше не нашешел дублей.

James
Offline
Зарегистрирован: 26.02.2016

 помогите пожалуйста, как поменять частоту? 0xb1 это я понял, а где его менять? в какой строке?

James
Offline
Зарегистрирован: 26.02.2016
#include <Adafruit_GFX.h>
#include <UTFTGLUE.h>              // class methods are in here
UTFTGLUE myGLCD(0x9328,A2,A1,A3,A4,A0);

// Declare which fonts we will be using
#if !defined(SmallFont)
extern uint8_t SmallFont[];    //.kbv GLUE defines as GFXFont ref
#endif

void setup()
{
  digitalWrite(A0, HIGH);
  pinMode(A0, OUTPUT);
   pinMode(A14, INPUT);
    pinMode(A15, INPUT);
  myGLCD.InitLCD();


  myGLCD.setRotation(LANDSCAPE);
  myGLCD.setFont(BigFont);
  myGLCD.clrScr();
}




void loop()
{
  int val = analogRead(A15);
  int val1 = analogRead(A14);
  val = map(val, 0, 1023, 0, 319);
  val1 = map(val1, 0, 1023, 0, 319);




  myGLCD.setColor(25, 25, 255);
  myGLCD.setBackColor(25, 25, 255);
  myGLCD.fillRect( 0, 0, val, 20); //  //(x1,y1,x2,y2)
  myGLCD.fillRect( 0, 20, val, 40);
  myGLCD.fillRect( 0, 40, val, 60);
  myGLCD.fillRect( 0, 60, val, 80);
  
  myGLCD.setColor(0, 0, 0);
  myGLCD.setBackColor(0, 0, 0);
  myGLCD.fillRect( 319, 0, val, 20);
  myGLCD.fillRect( 319, 20, val, 40);
  myGLCD.fillRect( 319, 40, val, 60);
  myGLCD.fillRect( 319, 60, val, 80);


  myGLCD.setColor(25, 25, 255);
  myGLCD.setBackColor(25, 25, 255);
  myGLCD.fillRect( 0, 205, val1, 239 ); //  //(x1,y1,x2,y2)
  myGLCD.fillRect( 0, 190, val1, 205 );
  myGLCD.fillRect( 0, 175, val1, 190 );
  myGLCD.fillRect( 0, 160, val1, 175);
  myGLCD.setColor(0, 0, 0);
  myGLCD.setBackColor(0, 0, 0);
  myGLCD.fillRect( 319, 205, val1, 239);
  myGLCD.fillRect( 319, 190, val1, 205);
  myGLCD.fillRect( 319, 175, val1, 190);
  myGLCD.fillRect( 319, 160, val1, 175);


}
вот код

 

James
Offline
Зарегистрирован: 26.02.2016

.

diger67
Offline
Зарегистрирован: 25.07.2015

James пишет:

 помогите пожалуйста, как поменять частоту? 0xb1 это я понял, а где его менять? в какой строке?

Смотрим даташит, там есть регистр где можно сменить частоту опроса матрици. О каком TFT идет речь, регистр может отличаться по адресу. Меняется в ините TFT.

James
Offline
Зарегистрирован: 26.02.2016

ili9328,  в ините т.е. в файле в библиотеке?

#include <Adafruit_GFX.h>
#include <UTFTGLUE.h>     
вот библиотеке, ткните плиз конкретно где поменять, а то 3 сутки уже долбаюсь:(
James
Offline
Зарегистрирован: 26.02.2016

Frame Rate and Color Control (R2Bh) значит, у меня будет 0x2B. а как выставить? FRS[3;0] 1101 4’hD FRAME Rate 93 вот что хочу.
 

LCD_Write_COM(0x00,0x2B);

LCD_Write_DATA(0x00,0x0D); 

так правильно?

diger67
Offline
Зарегистрирован: 25.07.2015

James пишет:

Frame Rate and Color Control (R2Bh) значит, у меня будет 0x2B. а как выставить? FRS[3;0] 1101 4’hD FRAME Rate 93 вот что хочу.
 

LCD_Write_COM(0x00,0x2B);

LCD_Write_DATA(0x00,0x0D); 

так правильно?

Ну можно и в секции setup() скетча прописать это, но после инициализации TFT. Иначе запишется то значение которое прописано в ините.

James
Offline
Зарегистрирован: 26.02.2016

в секции setup() не получилось оно компилится, но если вывести значение 2b в порт, то выводит 0x00b

James
Offline
Зарегистрирован: 26.02.2016

нашел в ините, 

     0x0013, 0x1200,     // VDV[4:0] for VCOM amplitude
            0x0029, 0x003e,     // 04  VCM[5:0] for VCOMH
            0x002B, 0xE,     // Set Frame Rate

но при изменении, ничего не меняется

James
Offline
Зарегистрирован: 26.02.2016

.

slider
Offline
Зарегистрирован: 17.06.2014

James пишет:

в секции setup() не получилось оно компилится, но если вывести значение 2b в порт, то выводит 0x00b

Это как так? т.е. вы через порт ардуине посылаете 2b и она выводит 00b ? . Что-то не встречал такого примера из библиотек . В общем в ваших постах море неизвестных (какой шилд - нет фото,.. библиотека,..., что овечает библиотека на ваш дисп,..как мельчешит видео можно было на ютуб кинуть) , и зачем вам понадобилось frame менять. не обессудьте , про наличие экстрасенсов не буду говорить.
и Не все регистры доступны для чтения , только для записи. 

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

//

James пишет:

нашел в ините, 

     0x0013, 0x1200,     // VDV[4:0] for VCOM amplitude
            0x0029, 0x003e,     // 04  VCM[5:0] for VCOMH
            0x002B, 0xE,     // Set Frame Rate

но при изменении, ничего не меняется

при изменении чего на что? это что было или уже что стало? что было и что стало? Что именно не изменяется? по вашему вывод в порт или всё же мерцание?

по даташиту на ili9328 0x0e это последнее значение , попробуйте самое первое.

 

// James, и еще раз скажу, приложите видео. большие прямоугольники в вашем скетче и должны долго прорисовываться, frame тут не причем, он отвечает за частоту обновления матрицы на стекле из ВидеоОЗУ в контроллере дисплея, а не скорость передачи данных от ардуино к контроллеру дисплея.

 Самое медленное в вашем проекте это ардуино, потом уже большие закрашенные прямоугольники, опрос аналогового входа, 8ми битная шина данных дисплея (против 16ти)
   можете в ютубе видео просмотреть по дисплеям с ардуинами, как и что там с какой скоростью прорисовывается. и на каком железе stm32,  esp8266,...