1.8 TFT Подключение Проблема. Помогите

sanion93
Offline
Зарегистрирован: 20.10.2014

Всех приветствую из солнечного Баку.

 

Недавно купил себе 1.8 ТФТ 128х160 скрин из Китая. 

Короче, китаец не ответил на вопрос что за библиотека для него нужна и т.д. У меня проблема вот такая. 

Значит ножки модуля такие:

 

16- Led -

15 Led +

14-

13MOSI

12 MISO

11CLK

10 CS

9SCK

8SDA

7RS 

6 RST

5-

4 - это для яркости

3- 

2-VCC

1-GND

Подключил к ардуино уно как в тест программе:

#define sclk 4
#define mosi 5
#define cs   6
#define dc   7
#define rst  8 
 
Модуль  //// UNO
10 (CS)      ------ 6
9  (SCK)    ------ 4
8  (SDA)--------------5
7      (RS)--------7 
6  (RST)  - --- --- 8
 
Может быть я что то не так подключил, а может быть библиотека не та.
 
Пожалуйста помогите мне решить этот вопрос.
 
Вот код программы:
 
#define sclk 4
#define mosi 5
#define cs   6
#define dc   7
#define rst  8  // you can also connect this to the Arduino reset

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>

// Option 1: use any pins but a little slower
Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, mosi, sclk, rst);

// Option 2: must use the hardware SPI pins
// (for UNO thats sclk = 13 and sid = 11) and pin 10 must be
// an output. This is much faster - also required if you want
// to use the microSD card (see the image drawing example)
//Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);
float p = 3.1415926;

void setup(void) {
  Serial.begin(9600);
  Serial.print("hello!");

  // Our supplier changed the 1.8" display slightly after Jan 10, 2012
  // so that the alignment of the TFT had to be shifted by a few pixels
  // this just means the init code is slightly different. Check the
  // color of the tab to see which init code to try. If the display is
  // cut off or has extra 'random' pixels on the top & left, try the
  // other option!
  // If you are seeing red and green color inversion, use Black Tab

  // If your TFT's plastic wrap has a Black Tab, use the following:
  tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
  // If your TFT's plastic wrap has a Red Tab, use the following:
  //tft.initR(INITR_REDTAB);   // initialize a ST7735R chip, red tab
  // If your TFT's plastic wrap has a Green Tab, use the following:
  //tft.initR(INITR_GREENTAB); // initialize a ST7735R chip, green tab

  Serial.println("init");

  uint16_t time = millis();
  tft.fillScreen(ST7735_BLACK);
  time = millis() - time;

  Serial.println(time, DEC);
  delay(500);

  // large block of text
  tft.fillScreen(ST7735_BLACK);
  testdrawtext("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Curabitur adipiscing ante sed nibh tincidunt feugiat. Maecenas enim massa, fringilla sed malesuada et, malesuada sit amet turpis. Sed porttitor neque ut ante pretium vitae malesuada nunc bibendum. Nullam aliquet ultrices massa eu hendrerit. Ut sed nisi lorem. In vestibulum purus a tortor imperdiet posuere. ", ST7735_WHITE);
  delay(1000);

  // tft print function!
  tftPrintTest();
  delay(4000);

  // a single pixel
  tft.drawPixel(tft.width()/2, tft.height()/2, ST7735_GREEN);
  delay(500);

  // line draw test
  testlines(ST7735_YELLOW);
  delay(500);

  // optimized lines
  testfastlines(ST7735_RED, ST7735_BLUE);
  delay(500);

  testdrawrects(ST7735_GREEN);
  delay(500);

  testfillrects(ST7735_YELLOW, ST7735_MAGENTA);
  delay(500);

  tft.fillScreen(ST7735_BLACK);
  testfillcircles(10, ST7735_BLUE);
  testdrawcircles(10, ST7735_WHITE);
  delay(500);

  testroundrects();
  delay(500);

  testtriangles();
  delay(500);

  mediabuttons();
  delay(500);

  Serial.println("done");
  delay(1000);
}

void loop() {
  tft.invertDisplay(true);
  delay(500);
  tft.invertDisplay(false);
  delay(500);
}

void testlines(uint16_t color) {
  tft.fillScreen(ST7735_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawLine(0, 0, x, tft.height()-1, color);
  }
  for (int16_t y=0; y < tft.height(); y+=6) {
    tft.drawLine(0, 0, tft.width()-1, y, color);
  }

  tft.fillScreen(ST7735_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color);
  }
  for (int16_t y=0; y < tft.height(); y+=6) {
    tft.drawLine(tft.width()-1, 0, 0, y, color);
  }

  tft.fillScreen(ST7735_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawLine(0, tft.height()-1, x, 0, color);
  }
  for (int16_t y=0; y < tft.height(); y+=6) {
    tft.drawLine(0, tft.height()-1, tft.width()-1, y, color);
  }

  tft.fillScreen(ST7735_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color);
  }
  for (int16_t y=0; y < tft.height(); y+=6) {
    tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color);
  }
}

void testdrawtext(char *text, uint16_t color) {
  tft.setCursor(0, 0);
  tft.setTextColor(color);
  tft.setTextWrap(true);
  tft.print(text);
}

void testfastlines(uint16_t color1, uint16_t color2) {
  tft.fillScreen(ST7735_BLACK);
  for (int16_t y=0; y < tft.height(); y+=5) {
    tft.drawFastHLine(0, y, tft.width(), color1);
  }
  for (int16_t x=0; x < tft.width(); x+=5) {
    tft.drawFastVLine(x, 0, tft.height(), color2);
  }
}

void testdrawrects(uint16_t color) {
  tft.fillScreen(ST7735_BLACK);
  for (int16_t x=0; x < tft.width(); x+=6) {
    tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color);
  }
}

void testfillrects(uint16_t color1, uint16_t color2) {
  tft.fillScreen(ST7735_BLACK);
  for (int16_t x=tft.width()-1; x > 6; x-=6) {
    tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1);
    tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2);
  }
}

void testfillcircles(uint8_t radius, uint16_t color) {
  for (int16_t x=radius; x < tft.width(); x+=radius*2) {
    for (int16_t y=radius; y < tft.height(); y+=radius*2) {
      tft.fillCircle(x, y, radius, color);
    }
  }
}

void testdrawcircles(uint8_t radius, uint16_t color) {
  for (int16_t x=0; x < tft.width()+radius; x+=radius*2) {
    for (int16_t y=0; y < tft.height()+radius; y+=radius*2) {
      tft.drawCircle(x, y, radius, color);
    }
  }
}

void testtriangles() {
  tft.fillScreen(ST7735_BLACK);
  int color = 0xF800;
  int t;
  int w = 63;
  int x = 159;
  int y = 0;
  int z = 127;
  for(t = 0 ; t <= 15; t+=1) {
    tft.drawTriangle(w, y, y, x, z, x, color);
    x-=4;
    y+=4;
    z-=4;
    color+=100;
  }
}

void testroundrects() {
  tft.fillScreen(ST7735_BLACK);
  int color = 100;
  int i;
  int t;
  for(t = 0 ; t <= 4; t+=1) {
    int x = 0;
    int y = 0;
    int w = 127;
    int h = 159;
    for(i = 0 ; i <= 24; i+=1) {
      tft.drawRoundRect(x, y, w, h, 5, color);
      x+=2;
      y+=3;
      w-=4;
      h-=6;
      color+=1100;
    }
    color+=100;
  }
}

void tftPrintTest() {
  tft.setTextWrap(false);
  tft.fillScreen(ST7735_BLACK);
  tft.setCursor(0, 30);
  tft.setTextColor(ST7735_RED);
  tft.setTextSize(1);
  tft.println("Hello World!");
  tft.setTextColor(ST7735_YELLOW);
  tft.setTextSize(2);
  tft.println("Hello World!");
  tft.setTextColor(ST7735_GREEN);
  tft.setTextSize(3);
  tft.println("Hello World!");
  tft.setTextColor(ST7735_BLUE);
  tft.setTextSize(4);
  tft.print(1234.567);
  delay(1500);
  tft.setCursor(0, 0);
  tft.fillScreen(ST7735_BLACK);
  tft.setTextColor(ST7735_WHITE);
  tft.setTextSize(0);
  tft.println("Hello World!");
  tft.setTextSize(1);
  tft.setTextColor(ST7735_GREEN);
  tft.print(p, 6);
  tft.println(" Want pi?");
  tft.println(" ");
  tft.print(8675309, HEX); // print 8,675,309 out in HEX!
  tft.println(" Print HEX!");
  tft.println(" ");
  tft.setTextColor(ST7735_WHITE);
  tft.println("Sketch has been");
  tft.println("running for: ");
  tft.setTextColor(ST7735_MAGENTA);
  tft.print(millis() / 1000);
  tft.setTextColor(ST7735_WHITE);
  tft.print(" seconds.");
}

void mediabuttons() {
  // play
  tft.fillScreen(ST7735_BLACK);
  tft.fillRoundRect(25, 10, 78, 60, 8, ST7735_WHITE);
  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_RED);
  delay(500);
  // pause
  tft.fillRoundRect(25, 90, 78, 60, 8, ST7735_WHITE);
  tft.fillRoundRect(39, 98, 20, 45, 5, ST7735_GREEN);
  tft.fillRoundRect(69, 98, 20, 45, 5, ST7735_GREEN);
  delay(500);
  // play color
  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_BLUE);
  delay(50);
  // pause color
  tft.fillRoundRect(39, 98, 20, 45, 5, ST7735_RED);
  tft.fillRoundRect(69, 98, 20, 45, 5, ST7735_RED);
  // play color
  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_GREEN);
}

 

 

pwal
Offline
Зарегистрирован: 17.04.2016

я пробовал этот http://ru.aliexpress.com/item/New-Stylish-1-8-inch-128-x-160-Pixels-For-Arduino-TFT-LCD-Display-Module-Breakout/32612697845.html запускать - нехрена не запускается (код брал из примеров к библиотеки) 

и uno  и mega2560  - результат один - белый экран((((

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

pwal пишет:
я пробовал этот http://ru.aliexpress.com/item/New-Stylish-1-8-inch-128-x-160-Pixels-For-Arduino-TFT-LCD-Display-Module-Breakout/32612697845.html запускать - нехрена не запускается (код брал из примеров к библиотеки) 

и uno  и mega2560  - результат один - белый экран((((

Ну на первой фотке экран у тебя не совсем белый. Для начала надо точно определиться какой именно контроллер дисплея установлен в твоем шилде. Как это сделать? Насколько я могу судить есть только три способа:

1. Отодрать экран от шилда и надеяться то на чипе есть какая-то надпись

2. С помощью хитрого скетча попытаться считать данные в порт Serial

3. Искать по всему форуму (а то и по всему инету) тему с таким же дисплеем.

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

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

Тоесть я вот что хочу сказать: мудохаться с подключением какого-то отдельновзятого дисплея может быть интересно только его владельцу. Диалог же может возникнуть только если еще у кого-то есть такой же дисплей или схожие проблемы при подключении. Я вот сейчас почти понимаю почему мне никто не отвечал: потому что где-то и когда-то это всё уже обсуждалось! И когда народ видит такие темы, думает примерно так: "Нет времени, желания и вообще: пусть сам разбирается! Я же разобрался? А то кто-то перерыл тонны инфы по этому вопросу, создал отдельную тему, всё разжевал и выложил. Осталось только найти, включить мозги и радоваться жизни и работающему дисплею! Так он и это ленится сам сделать - надо прити к нему домой и самому всё подключить. А когда ему надоест играться с этим дисплеем, он станет всех доставать с просьбой правильно подключить светодиод к 13-му пину..." Ну вот примерно такие ассоциации вызывают просьбы о помощи, в то время, когда буквально рядом это всё уже побеждалось и разжовывалось. Народ помогает чаще из любопытства чем из сострадания. Вот яркий тому пример.

P.S. Я всегда выбираю третий вариант: сбор информации. Потому что в первом варианте, остальные два уже могут не понадобиться, а второй вариант, лично мне - "помог" очень и очень условно.

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

 

pwal
Offline
Зарегистрирован: 17.04.2016

Я тоже собираю информацию, а не тупо ною помогите.

вот нарыл http://lesson.iarduino.ru/page/podklyuchaem-cvetnoy-displey-1-8-tft-ili9163-st7735r-sd-k-arduino/

сегодня попробую -посмотрим что получится

pwal
Offline
Зарегистрирован: 17.04.2016

Buzzer2010 пишет:

Ну на первой фотке экран у тебя не совсем белый.

это фото не моего экрана, а ТСа

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

pwal пишет:

Я тоже собираю информацию, а не тупо ною помогите.

вот нарыл http://lesson.iarduino.ru/page/podklyuchaem-cvetnoy-displey-1-8-tft-ili9163-st7735r-sd-k-arduino/

сегодня попробую -посмотрим что получится

Вот и модлодец! Как говорится: "Хочешь что бы что-то было сделано - сделай это сам" Я как никто это прочувствовал. Слава Богу не на этом форуме. Тут мне помогли на 101%.

Тебе еще простенький дисплей попался: 9 пинов всего подключить. Не то что мне: только 16 по шине. Афигеть.

pwal пишет:
это фото не моего экрана, а ТСа
Так свой пофоткай. А то меня тут часто ругали за то что я говорю непонятно о чём: нет ни фоток ни скетча, над которым корплю.

pwal
Offline
Зарегистрирован: 17.04.2016

Buzzer2010 пишет:

pwal пишет:

Я тоже собираю информацию, а не тупо ною помогите.

вот нарыл http://lesson.iarduino.ru/page/podklyuchaem-cvetnoy-displey-1-8-tft-ili9163-st7735r-sd-k-arduino/

сегодня попробую -посмотрим что получится

Вот и модлодец! Как говорится: "Хочешь что бы что-то было сделано - сделай это сам" Я как никто это прочувствовал. Слава Богу не на этом форуме. Тут мне помогли на 101%.

Тебе еще простенький дисплей попался: 9 пинов всего подключить. Не то что мне: только 16 по шине. Афигеть.

pwal пишет:
это фото не моего экрана, а ТСа
Так свой пофоткай. А то меня тут часто ругали за то что я говорю непонятно о чём: нет ни фоток ни скетча, над которым корплю.

фото вот по ссылке http://ru.aliexpress.com/item/New-Stylish-1-8-inch-128-x-160-Pixels-For-Arduino-TFT-LCD-Display-Module-Breakout/32612697845.html

согласно этого примера http://http://lesson.iarduino.ru/page/podklyuchaem-cvetnoy-displey-1-8-tft-ili9163-st7735r-sd-k-arduino/ поробовал - сильно мерцает дисплей (((( работает очень крайне криво((

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

гугл , яндекс , форум в поиск -   1.8" LCD TFT display module

Библиотек подходят несколько и Adafruit и UTFT.   одну из ссылок где народ расписал подключение уже здесь давали  lesson.iarduino.ru/page/podklyuchaem-cvetnoy-displey-1-8-tft-ili9163-st7735r-sd-k-arduino/  

попробуйте ещё http://arduino-tv.ru/catalog/id/1.8_-tft-lcd-display-module-st7735s-128x160-obzor

http://arduinolab.pw/index.php/2015/12/02/chasy-na-ds1302-i-18-tft-lcd-display-module-st7735s/

и если встречаете в примерах подключения - резисторы , инми не надо принебрегать, иначе дисп. уже утиль. (может повезти, если длинный слабый USB кабель и на нем получилось хорошее падение напряжения. Китайцы хитро извратились , лог уровни 5в от ардуино через внутренние защитные диоды в контроллере на дисплее должны завысить питание контроллера выше 3,3-3,6в и сжечь его, но не даёт параллельно пасаженная питанию -  подсветка (белые светодиоды), выполняя роль стабилитрона 3,0-3,3в. 

// попробуйте ещё UTFT , в её pdf описан вызов .

примеры из её стандартных с вашим разрешением с пометкой _serial 

// Usage: myGLCD(<model code>, SDA, SCL, CS, RST[, RS]);
//
// When using the DM-TFT18-101 and shield from DisplayModule you should use the following:
//         UTFT myGLCD(DMTFT18101,2,3,4,6,5);
//
// When using the TFT18SP shield from ElecFreaks you should use the following:
//         UTFT myGLCD(TFT18SHLD,7,6,5,3,4);
//
UTFT myGLCD(ITDB18SP,11,10,9,12,8);   // Remember to change the model parameter to suit your display module!

 

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

О как! Я так понял что в случае с ардуиной всегда приходится выбирать между скоростью и количеством занятых пинов. SPI и I2C - это: свободные пины, но жуткие тормоза, вследствие которых использовать графику на графическом дисплее - я не знаю... Хотя с другой стороны, ждать от 16-ти мегагерцового контроллера каких-то графических чудес и не приходится. У меня тоже есть UNO и 8-ми битный TFT к ней, так элемнтарно геометрические фигуры прорисовываются туго. Вывод текста еще - так себе... Для сравнения купил DUE и 16-ти битный 3.5". Сегодня, буквально, планирую переписать некоторые свои проекты под этот дисплей. Посмотрим насколько всё станет шустрее. Демки идут, конечно, гораздо бодрее.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

AVR не совсем предназначен для вывода изображений, посему тормоза могут быть. У большинства ATMega макс. частота (официально) = 20МГц. Минимальный делитель частоты для SPI = 2. Путём нехитрых подсчётов видим, что частота SPI (макс.) = 10МГц. Это если все данные уже посчитаны и данные просто льются на потоке, и то, такой частоты достигнуть нельзя, ибо надо ещё данные в буфер загружать и т.д. и т.п.

Нужен быстрый вывод графики - либо разгоняем AVR (https://geektimes.ru/post/258086/), либо берем контроллер помощнее, либо берём не контроллер вовсе, а ПЛИСину. Вот там раздол для графического творчества! У меня на STM32F030F4P6 SPI (по расчётам) разогнался до 48МГц (опять же, это макс. доп. частота, эффективная - чуть ниже). Считаем для экрана 128x128:

128*128 = 16384(пикселей)

Глубина цвета = 16бит (rrrrrggggggbbbbb)

16384 * 16 = 262144 (бит) - послать для заполнения экрана

48000000 / 262144 ≈ 183.105 (FPS)

Понятно, что ещё есть служебные команды, расчёт изображения, итого, ИМХО, около 80FPS у меня было.

P.S. Посчитал для AVR@20МГц (SPI 10МГц). Теоретическое кол-во FPS ≈ 38.15 . Фактическое - меньше 10.

Бум!)

А если использовать параллельный интерфейс, да ещё и через FSMC...так там сотни FPS будут) Но я пока играюсь с младшими STM, там такого нету.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

А Arduino DUE, это ж вроде ARM, он как с графикой - справляется? По моему - не очень как-то.

Yarik.Yar, вижу что ты с экранами чаще дело имел чем я, не подскажешь по этой теме? Посмотреть

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

1. ARM есмь общее зерно. Реализация от Atmel - не очень-то, на самом деле) Да и ардуина - зло.

2. По той теме - обычно контроллер поддерживает несколько интерфейсов. В параллельном режиме SDA, SCL и SCK будут выпонять другие функции.

А вообще, по дисплеям тут есть и более спецы, чем я, diger67, к примеру.

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Yarik.Yar пишет:
А вообще, по дисплеям тут есть и более спецы, чем я, diger67, к примеру.

Да они-то тут есть, но личка на форуме не предусмотрена. И как до них достучаться?

alex_r61
Offline
Зарегистрирован: 20.06.2012

А datasheet на чип кто нибудь пытался посмотреть? Нет там I2C, параллельный и SPI 3 или 4 проводной. Просто китайцы так подписали SDA  это обычно MOSI, SCL - SCK, A0 - DC и про RESET нельзя забывать.

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

Мм...я не дошёл до того уровня экстрасенсорной восприимчивости, когда, глядя на шину данных, понимаешь, какой контроллер внутре.

Посему поиск даташита был бы занятием эфемерным и не дал бы результата)

pwal
Offline
Зарегистрирован: 17.04.2016

alex_r61 пишет:

А datasheet на чип кто нибудь пытался посмотреть? 

еще бы точно знать на какой чип даташид искать((

ибо написать на дисплее что угодно можно((

надпись на шлейфе не дала гуглу шансов найти чтото

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

pwal пишет:

alex_r61 пишет:

А datasheet на чип кто нибудь пытался посмотреть? 

еще бы точно знать на какой чип даташид искать((

ибо написать на дисплее что угодно можно((

надпись на шлейфе не дала гуглу шансов найти чтото

Эммм... Смотри пункт первый из моего первого поста. В некотором смысле это тоже сбор информации. Только аккуратно!

Buzzer2010
Buzzer2010 аватар
Offline
Зарегистрирован: 10.03.2016

Yarik.Yar пишет:
2. По той теме - обычно контроллер поддерживает несколько интерфейсов. В параллельном режиме SDA, SCL и SCK будут выпонять другие функции.

Да я вот тоже задумался... Читал PDF по UTFT и заметил такую же фигню: 

Piccy.info - Free Image Hosting

И как ардуина будет знать что по каким пинам там должно идти? Или там как раз первая переменная и определяет что там на пинах надо ловить?

Sidorchuk
Offline
Зарегистрирован: 22.07.2016

Апну

pwal пишет:

и uno  и mega2560  - результат один - белый экран((((

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

Думаю 5110 взять)