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
 
Может быть я что то не так подключил, а может быть библиотека не та.
 
Пожалуйста помогите мне решить этот вопрос.
 
Вот код программы:
 
001#define sclk 4
002#define mosi 5
003#define cs   6
004#define dc   7
005#define rst  8  // you can also connect this to the Arduino reset
006 
007#include <Adafruit_GFX.h>    // Core graphics library
008#include <Adafruit_ST7735.h> // Hardware-specific library
009#include <SPI.h>
010 
011// Option 1: use any pins but a little slower
012Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, mosi, sclk, rst);
013 
014// Option 2: must use the hardware SPI pins
015// (for UNO thats sclk = 13 and sid = 11) and pin 10 must be
016// an output. This is much faster - also required if you want
017// to use the microSD card (see the image drawing example)
018//Adafruit_ST7735 tft = Adafruit_ST7735(cs, dc, rst);
019float p = 3.1415926;
020 
021void setup(void) {
022  Serial.begin(9600);
023  Serial.print("hello!");
024 
025  // Our supplier changed the 1.8" display slightly after Jan 10, 2012
026  // so that the alignment of the TFT had to be shifted by a few pixels
027  // this just means the init code is slightly different. Check the
028  // color of the tab to see which init code to try. If the display is
029  // cut off or has extra 'random' pixels on the top & left, try the
030  // other option!
031  // If you are seeing red and green color inversion, use Black Tab
032 
033  // If your TFT's plastic wrap has a Black Tab, use the following:
034  tft.initR(INITR_BLACKTAB);   // initialize a ST7735S chip, black tab
035  // If your TFT's plastic wrap has a Red Tab, use the following:
036  //tft.initR(INITR_REDTAB);   // initialize a ST7735R chip, red tab
037  // If your TFT's plastic wrap has a Green Tab, use the following:
038  //tft.initR(INITR_GREENTAB); // initialize a ST7735R chip, green tab
039 
040  Serial.println("init");
041 
042  uint16_t time = millis();
043  tft.fillScreen(ST7735_BLACK);
044  time = millis() - time;
045 
046  Serial.println(time, DEC);
047  delay(500);
048 
049  // large block of text
050  tft.fillScreen(ST7735_BLACK);
051  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);
052  delay(1000);
053 
054  // tft print function!
055  tftPrintTest();
056  delay(4000);
057 
058  // a single pixel
059  tft.drawPixel(tft.width()/2, tft.height()/2, ST7735_GREEN);
060  delay(500);
061 
062  // line draw test
063  testlines(ST7735_YELLOW);
064  delay(500);
065 
066  // optimized lines
067  testfastlines(ST7735_RED, ST7735_BLUE);
068  delay(500);
069 
070  testdrawrects(ST7735_GREEN);
071  delay(500);
072 
073  testfillrects(ST7735_YELLOW, ST7735_MAGENTA);
074  delay(500);
075 
076  tft.fillScreen(ST7735_BLACK);
077  testfillcircles(10, ST7735_BLUE);
078  testdrawcircles(10, ST7735_WHITE);
079  delay(500);
080 
081  testroundrects();
082  delay(500);
083 
084  testtriangles();
085  delay(500);
086 
087  mediabuttons();
088  delay(500);
089 
090  Serial.println("done");
091  delay(1000);
092}
093 
094void loop() {
095  tft.invertDisplay(true);
096  delay(500);
097  tft.invertDisplay(false);
098  delay(500);
099}
100 
101void testlines(uint16_t color) {
102  tft.fillScreen(ST7735_BLACK);
103  for (int16_t x=0; x < tft.width(); x+=6) {
104    tft.drawLine(0, 0, x, tft.height()-1, color);
105  }
106  for (int16_t y=0; y < tft.height(); y+=6) {
107    tft.drawLine(0, 0, tft.width()-1, y, color);
108  }
109 
110  tft.fillScreen(ST7735_BLACK);
111  for (int16_t x=0; x < tft.width(); x+=6) {
112    tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color);
113  }
114  for (int16_t y=0; y < tft.height(); y+=6) {
115    tft.drawLine(tft.width()-1, 0, 0, y, color);
116  }
117 
118  tft.fillScreen(ST7735_BLACK);
119  for (int16_t x=0; x < tft.width(); x+=6) {
120    tft.drawLine(0, tft.height()-1, x, 0, color);
121  }
122  for (int16_t y=0; y < tft.height(); y+=6) {
123    tft.drawLine(0, tft.height()-1, tft.width()-1, y, color);
124  }
125 
126  tft.fillScreen(ST7735_BLACK);
127  for (int16_t x=0; x < tft.width(); x+=6) {
128    tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color);
129  }
130  for (int16_t y=0; y < tft.height(); y+=6) {
131    tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color);
132  }
133}
134 
135void testdrawtext(char *text, uint16_t color) {
136  tft.setCursor(0, 0);
137  tft.setTextColor(color);
138  tft.setTextWrap(true);
139  tft.print(text);
140}
141 
142void testfastlines(uint16_t color1, uint16_t color2) {
143  tft.fillScreen(ST7735_BLACK);
144  for (int16_t y=0; y < tft.height(); y+=5) {
145    tft.drawFastHLine(0, y, tft.width(), color1);
146  }
147  for (int16_t x=0; x < tft.width(); x+=5) {
148    tft.drawFastVLine(x, 0, tft.height(), color2);
149  }
150}
151 
152void testdrawrects(uint16_t color) {
153  tft.fillScreen(ST7735_BLACK);
154  for (int16_t x=0; x < tft.width(); x+=6) {
155    tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color);
156  }
157}
158 
159void testfillrects(uint16_t color1, uint16_t color2) {
160  tft.fillScreen(ST7735_BLACK);
161  for (int16_t x=tft.width()-1; x > 6; x-=6) {
162    tft.fillRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color1);
163    tft.drawRect(tft.width()/2 -x/2, tft.height()/2 -x/2 , x, x, color2);
164  }
165}
166 
167void testfillcircles(uint8_t radius, uint16_t color) {
168  for (int16_t x=radius; x < tft.width(); x+=radius*2) {
169    for (int16_t y=radius; y < tft.height(); y+=radius*2) {
170      tft.fillCircle(x, y, radius, color);
171    }
172  }
173}
174 
175void testdrawcircles(uint8_t radius, uint16_t color) {
176  for (int16_t x=0; x < tft.width()+radius; x+=radius*2) {
177    for (int16_t y=0; y < tft.height()+radius; y+=radius*2) {
178      tft.drawCircle(x, y, radius, color);
179    }
180  }
181}
182 
183void testtriangles() {
184  tft.fillScreen(ST7735_BLACK);
185  int color = 0xF800;
186  int t;
187  int w = 63;
188  int x = 159;
189  int y = 0;
190  int z = 127;
191  for(t = 0 ; t <= 15; t+=1) {
192    tft.drawTriangle(w, y, y, x, z, x, color);
193    x-=4;
194    y+=4;
195    z-=4;
196    color+=100;
197  }
198}
199 
200void testroundrects() {
201  tft.fillScreen(ST7735_BLACK);
202  int color = 100;
203  int i;
204  int t;
205  for(t = 0 ; t <= 4; t+=1) {
206    int x = 0;
207    int y = 0;
208    int w = 127;
209    int h = 159;
210    for(i = 0 ; i <= 24; i+=1) {
211      tft.drawRoundRect(x, y, w, h, 5, color);
212      x+=2;
213      y+=3;
214      w-=4;
215      h-=6;
216      color+=1100;
217    }
218    color+=100;
219  }
220}
221 
222void tftPrintTest() {
223  tft.setTextWrap(false);
224  tft.fillScreen(ST7735_BLACK);
225  tft.setCursor(0, 30);
226  tft.setTextColor(ST7735_RED);
227  tft.setTextSize(1);
228  tft.println("Hello World!");
229  tft.setTextColor(ST7735_YELLOW);
230  tft.setTextSize(2);
231  tft.println("Hello World!");
232  tft.setTextColor(ST7735_GREEN);
233  tft.setTextSize(3);
234  tft.println("Hello World!");
235  tft.setTextColor(ST7735_BLUE);
236  tft.setTextSize(4);
237  tft.print(1234.567);
238  delay(1500);
239  tft.setCursor(0, 0);
240  tft.fillScreen(ST7735_BLACK);
241  tft.setTextColor(ST7735_WHITE);
242  tft.setTextSize(0);
243  tft.println("Hello World!");
244  tft.setTextSize(1);
245  tft.setTextColor(ST7735_GREEN);
246  tft.print(p, 6);
247  tft.println(" Want pi?");
248  tft.println(" ");
249  tft.print(8675309, HEX); // print 8,675,309 out in HEX!
250  tft.println(" Print HEX!");
251  tft.println(" ");
252  tft.setTextColor(ST7735_WHITE);
253  tft.println("Sketch has been");
254  tft.println("running for: ");
255  tft.setTextColor(ST7735_MAGENTA);
256  tft.print(millis() / 1000);
257  tft.setTextColor(ST7735_WHITE);
258  tft.print(" seconds.");
259}
260 
261void mediabuttons() {
262  // play
263  tft.fillScreen(ST7735_BLACK);
264  tft.fillRoundRect(25, 10, 78, 60, 8, ST7735_WHITE);
265  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_RED);
266  delay(500);
267  // pause
268  tft.fillRoundRect(25, 90, 78, 60, 8, ST7735_WHITE);
269  tft.fillRoundRect(39, 98, 20, 45, 5, ST7735_GREEN);
270  tft.fillRoundRect(69, 98, 20, 45, 5, ST7735_GREEN);
271  delay(500);
272  // play color
273  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_BLUE);
274  delay(50);
275  // pause color
276  tft.fillRoundRect(39, 98, 20, 45, 5, ST7735_RED);
277  tft.fillRoundRect(69, 98, 20, 45, 5, ST7735_RED);
278  // play color
279  tft.fillTriangle(42, 20, 42, 60, 90, 40, ST7735_GREEN);
280}

 

 

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 

 

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 взять)