2.4 TFT экран для Arduino

Тема в разделе "Arduino & Shields", создана пользователем Kadetov, 13 фев 2015.

  1. Kadetov

    Kadetov Нуб

    Добрый вечер. Приобрёл вот такой экран в виде шилда: http://ru.aliexpress.com/item/Free-...ino-UNO-R3/2034511569.html?recommendVersion=2
    Как проверить работоспособность?
    Использовал библиотеки TFTLCD, TouchScreenLibrary. И какую-то библиотеку которая позволяет определить драйвер, к сожалению определить программа не смогла...
     
  2. скорее всего там SPFD5408
     
    Kadetov нравится это.
  3. Kadetov

    Kadetov Нуб

    9e28ca
    hc245
    9h47747
    Ux0003E

    ams1117
    h1418

    Все цифры что нашёл там на плате
     
  4. Kadetov

    Kadetov Нуб

    Попробовал библиотеку Touch-Screen-Library-master - не работает, просто белый экран. В ком порт выводит только что стартовал тест...
    http://playground.arduino.cc/Main/TouchscreenPiano
     
  5. зачем покупать неизвестно что?.

    я бы взял библиотеку UTFT, отыскал бы схему модуля, подключил бы в библиотеке драйвер для SPFD5408 и указал контакты сверяясь со схемой модуля.
     
  6. Kadetov

    Kadetov Нуб

    Инициализирую вот такой строкой: UTFT myGLCD(SPFD5408A,A2,A1,A3,A4);
    Экран белый... Пины на шилде и аналоговые пины а0-а4 подключены в соответствии...
     
  7. jonik22sm

    jonik22sm Нуб

    Приседеняюсь такая же проблемка
     
  8. vlrpv.999

    vlrpv.999 Нуб

    Здравствуйте! У меня такие же цифры на шилде и так же не могу подружить с мегой. Вот вы пишите что пины подключены в соответствии. А как определить это соответствие и как как поменять пины в самой библиотеке при случае?
     
  9. mike124

    mike124 Нерд

    Вот описание на очень похожий экранчик - возможно он и есть: http://ru.aliexpress.com/item/10pcs...-Arduino-UNO-R3-Free-Shipping/1662169657.html

    Мораль - не гоняйтесь за дешивизной, как тот поп. Смотрите описание дорогих аналогов. Думаю, в дорогом лоте и все схемы имеются, в т.ч. и как подключать.
     
  10. cheloveki

    cheloveki Нуб

    Добрый вечер.

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

    Вопрос.
    Почему на экране не отображается синий квадрат? Но если закомментировать lecturaPanel(); то отображает.

    Код (Text):
    void setup() {

      Serial.begin(9600);

      tft.reset();

      tft.initDisplay();
      tft.fillScreen(WHITE);
    }

    void loop() {
    lecturaPanel();

    tft.fillRect(20, 165, 60, 60, BLUE);
    }

    void lecturaPanel()
    {
    TSPoint p = ts.getPoint();
    X = map(p.x, TS_MAXX, TS_MINX, tft.width(), 0); Serial.print("X = "); Serial.print(X);
    Y = map(p.y, TS_MAXY, TS_MINY, tft.height(), 0);Serial.print("\tY = "); Serial.print(Y);

    Z = p.z; Serial.print("\tPressure = "); Serial.println(p.z);
    }
     
  11. cheloveki

    cheloveki Нуб

    Вопрос выше решил.

    Появился другой: как управлять подсветкой экрана?
     
  12. Ну кто не разобрался давайте по порядку.
    1. Качаем библиотеку https://drive.google.com/open?id=0B3xOiLI-dTbqS3BtdHBvWGlidms;
    2. Запускаем Arduino IDE;
    3. Вставляем этот код :

    Код (C++):
    #include <Adafruit_TFTLCD.h> // Hardware-specific library

    // The control pins for the LCD can be assigned to any digital or
    // analog pins...but we'll use the analog pins as this allows us to
    // double up the pins with the touch screen (see the TFT paint example).
    #define LCD_CS A3 // Chip Select goes to Analog 3
    #define LCD_CD A2 // Command/Data goes to Analog 2
    #define LCD_WR A1 // LCD Write goes to Analog 1
    #define LCD_RD A0 // LCD Read goes to Analog 0
    #define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin
    // Assign human-readable names to some common 16-bit color values:
    #define    BLACK   0x0000
    #define    BLUE    0x001F
    #define    RED     0xF800
    #define    GREEN   0x07E0
    #define CYAN    0x07FF
    #define MAGENTA 0xF81F
    #define YELLOW  0xFFE0
    #define WHITE   0xFFFF


    Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);
    // If using the shield, all control and data lines are fixed, and
    // a simpler declaration can optionally be used:
    // Adafruit_TFTLCD tft;

    void setup(void) {
      Serial.begin(9600);

      tft.reset();

      //0x9488, 0x0154, 0x8357, 0x9341, 0x7575, 0x9328, 0x9327
      tft.begin(0x9488);

      Serial.println(F("Benchmark                Time (microseconds)"));

      Serial.print(F("Screen fill              "));
      Serial.println(testFillScreen());
      delay(500);

      Serial.print(F("Text                     "));
      Serial.println(testText());
      delay(3000);

      Serial.print(F("Lines                    "));
      Serial.println(testLines(CYAN));
      delay(500);

      Serial.print(F("Horiz/Vert Lines         "));
      Serial.println(testFastLines(RED, BLUE));
      delay(500);

      Serial.print(F("Rectangles (outline)     "));
      Serial.println(testRects(GREEN));
      delay(500);

      Serial.print(F("Rectangles (filled)      "));
      Serial.println(testFilledRects(YELLOW, MAGENTA));
      delay(500);

      Serial.print(F("Circles (filled)         "));
      Serial.println(testFilledCircles(10, MAGENTA));

      Serial.print(F("Circles (outline)        "));
      Serial.println(testCircles(10, WHITE));
      delay(500);

      Serial.print(F("Triangles (outline)      "));
      Serial.println(testTriangles());
      delay(500);

      Serial.print(F("Triangles (filled)       "));
      Serial.println(testFilledTriangles());
      delay(500);

      Serial.print(F("Rounded rects (outline)  "));
      Serial.println(testRoundRects());
      delay(500);

      Serial.print(F("Rounded rects (filled)   "));
      Serial.println(testFilledRoundRects());
      delay(500);

      Serial.println(F("Done!"));
    }

    void loop(void) {
      for(uint8_t rotation=0; rotation<4; rotation++) {
        tft.setRotation(rotation);
        testText();
        delay(2000);
      }
    }

    unsigned long testFillScreen() {
      unsigned long start = micros();
      tft.fillScreen(BLACK);
      tft.fillScreen(RED);
      tft.fillScreen(GREEN);
      tft.fillScreen(BLUE);
      tft.fillScreen(BLACK);
      return micros() - start;
    }

    unsigned long testText() {
      tft.fillScreen(BLACK);
      unsigned long start = micros();
      tft.setCursor(0, 0);
      tft.setTextColor(WHITE);  tft.setTextSize(1);
      tft.println("Hello World!");
      tft.setTextColor(YELLOW); tft.setTextSize(2);
      tft.println(1234.56);
      tft.setTextColor(RED);    tft.setTextSize(3);
      tft.println(0xDEADBEEF, HEX);
      tft.println();
      tft.setTextColor(GREEN);
      tft.setTextSize(5);
      tft.println("Groop");
      tft.setTextSize(2);
      tft.println("I implore thee,");
      tft.setTextSize(1);
      tft.println("my foonting turlingdromes.");
      tft.println("And hooptiously drangle me");
      tft.println("with crinkly bindlewurdles,");
      tft.println("Or I will rend thee");
      tft.println("in the gobberwarts");
      tft.println("with my blurglecruncheon,");
      tft.println("see if I don't!");
      return micros() - start;
    }

    unsigned long testLines(uint16_t color) {
      unsigned long start, t;
      int           x1, y1, x2, y2,
                    w = tft.width(),
                    h = tft.height();

      tft.fillScreen(BLACK);

      x1 = y1 = 0;
      y2    = h - 1;
      start = micros();
      for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
      x2    = w - 1;
      for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
      t     = micros() - start; // fillScreen doesn't count against timing

      tft.fillScreen(BLACK);

      x1    = w - 1;
      y1    = 0;
      y2    = h - 1;
      start = micros();
      for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
      x2    = 0;
      for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
      t    += micros() - start;

      tft.fillScreen(BLACK);

      x1    = 0;
      y1    = h - 1;
      y2    = 0;
      start = micros();
      for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
      x2    = w - 1;
      for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);
      t    += micros() - start;

      tft.fillScreen(BLACK);

      x1    = w - 1;
      y1    = h - 1;
      y2    = 0;
      start = micros();
      for(x2=0; x2<w; x2+=6) tft.drawLine(x1, y1, x2, y2, color);
      x2    = 0;
      for(y2=0; y2<h; y2+=6) tft.drawLine(x1, y1, x2, y2, color);

      return micros() - start;
    }

    unsigned long testFastLines(uint16_t color1, uint16_t color2) {
      unsigned long start;
      int           x, y, w = tft.width(), h = tft.height();

      tft.fillScreen(BLACK);
      start = micros();
      for(y=0; y<h; y+=5) tft.drawFastHLine(0, y, w, color1);
      for(x=0; x<w; x+=5) tft.drawFastVLine(x, 0, h, color2);

      return micros() - start;
    }

    unsigned long testRects(uint16_t color) {
      unsigned long start;
      int           n, i, i2,
                    cx = tft.width()  / 2,
                    cy = tft.height() / 2;

      tft.fillScreen(BLACK);
      n     = min(tft.width(), tft.height());
      start = micros();
      for(i=2; i<n; i+=6) {
        i2 = i / 2;
        tft.drawRect(cx-i2, cy-i2, i, i, color);
      }

      return micros() - start;
    }

    unsigned long testFilledRects(uint16_t color1, uint16_t color2) {
      unsigned long start, t = 0;
      int           n, i, i2,
                    cx = tft.width()  / 2 - 1,
                    cy = tft.height() / 2 - 1;

      tft.fillScreen(BLACK);
      n = min(tft.width(), tft.height());
      for(i=n; i>0; i-=6) {
        i2    = i / 2;
        start = micros();
        tft.fillRect(cx-i2, cy-i2, i, i, color1);
        t    += micros() - start;
        // Outlines are not included in timing results
        tft.drawRect(cx-i2, cy-i2, i, i, color2);
      }

      return t;
    }

    unsigned long testFilledCircles(uint8_t radius, uint16_t color) {
      unsigned long start;
      int x, y, w = tft.width(), h = tft.height(), r2 = radius * 2;

      tft.fillScreen(BLACK);
      start = micros();
      for(x=radius; x<w; x+=r2) {
        for(y=radius; y<h; y+=r2) {
          tft.fillCircle(x, y, radius, color);
        }
      }

      return micros() - start;
    }

    unsigned long testCircles(uint8_t radius, uint16_t color) {
      unsigned long start;
      int           x, y, r2 = radius * 2,
                    w = tft.width()  + radius,
                    h = tft.height() + radius;

      // Screen is not cleared for this one -- this is
      // intentional and does not affect the reported time.
      start = micros();
      for(x=0; x<w; x+=r2) {
        for(y=0; y<h; y+=r2) {
          tft.drawCircle(x, y, radius, color);
        }
      }

      return micros() - start;
    }

    unsigned long testTriangles() {
      unsigned long start;
      int           n, i, cx = tft.width()  / 2 - 1,
                          cy = tft.height() / 2 - 1;

      tft.fillScreen(BLACK);
      n     = min(cx, cy);
      start = micros();
      for(i=0; i<n; i+=5) {
        tft.drawTriangle(
          cx    , cy - i, // peak
          cx - i, cy + i, // bottom left
          cx + i, cy + i, // bottom right
          tft.color565(0, 0, i));
      }

      return micros() - start;
    }

    unsigned long testFilledTriangles() {
      unsigned long start, t = 0;
      int           i, cx = tft.width()  / 2 - 1,
                       cy = tft.height() / 2 - 1;

      tft.fillScreen(BLACK);
      start = micros();
      for(i=min(cx,cy); i>10; i-=5) {
        start = micros();
        tft.fillTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
          tft.color565(0, i, i));
        t += micros() - start;
        tft.drawTriangle(cx, cy - i, cx - i, cy + i, cx + i, cy + i,
          tft.color565(i, i, 0));
      }

      return t;
    }

    unsigned long testRoundRects() {
      unsigned long start;
      int           w, i, i2,
                    cx = tft.width()  / 2 - 1,
                    cy = tft.height() / 2 - 1;

      tft.fillScreen(BLACK);
      w     = min(tft.width(), tft.height());
      start = micros();
      for(i=0; i<w; i+=6) {
        i2 = i / 2;
        tft.drawRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(i, 0, 0));
      }

      return micros() - start;
    }

    unsigned long testFilledRoundRects() {
      unsigned long start;
      int           i, i2,
                    cx = tft.width()  / 2 - 1,
                    cy = tft.height() / 2 - 1;

      tft.fillScreen(BLACK);
      start = micros();
      for(i=min(tft.width(), tft.height()); i>20; i-=6) {
        i2 = i / 2;
        tft.fillRoundRect(cx-i2, cy-i2, i, i, i/8, tft.color565(0, i, 0));
      }

      return micros() - start;
    }
    А дальше проводим такие махинации, находим две строки:
    Код (C++):
      //0x9488, 0x0154, 0x8357, 0x9341, 0x7575, 0x9328, 0x9327
      tft.begin(0x9488);
    И по очереди берем коды: "0x9488, 0x0154, 0x8357, 0x9341, 0x7575, 0x9328, 0x9327"
    вставляем в tft.begin(0x9488) и шьем ардуино.
    Проблема в том что в этих экранах не читается инфа чипа, а таким образом мы перебираем по очереди все возможные чипы пока не заработает наш екран в режиме теста.
    И ещё в этой библиотеке по умолчанию стояло разрешение 320х480 которое я изменил на 320х240;

    А ещё в этого дисплея такая беда, и дисплей и сенсор используют одни и те же пины A2, A3; Если кто не разобрался как задействовать их по очереди пишите, помогу.
     
    Последнее редактирование: 14 ноя 2016
  13. user999

    user999 Гик

    Этот дисплей занимает все пины на UNO? Для датчиков места не останется?
     
  14. Midnight

    Midnight Нерд

    остается
     
  15. user999

    user999 Гик

    только аналоговые?
     
  16. Midnight

    Midnight Нерд

    Еще и цифровые) Вам интересен этот дисплей только как экран или еще и сенсор? ,
    #define LCD_CS A3 // Chip Select goes to Analog 3
    #define LCD_CD A2 // Command/Data goes to Analog 2
    #define LCD_WR A1 // LCD Write goes to Analog 1
    #define LCD_RD A0 // LCD Read goes to Analog 0
    #define LCD_RESET A4 // Can alternately just connect to Arduino's reset pin
    Эти вот занятые, а все остальные по-идеи свободны)
     
  17. user999

    user999 Гик

    Как сенсор тоже. Не хочется дополнительные кнопки или джойстики лепить
     
  18. Не задействованными остаются пины (А5, 0, 1) если не использовать тачь то кажись и (9). А если не использовать SD то плюс пины (10, 11, 12, 13).
    А вообще ребятки дела такие.
    Вот например как совместить сенсор с дисплеем, ведь они висят на одних пинах А2 и А3.
    Только для работы дисплея эти пины должны принять значение
    Код (C++):
    pinMode(A2, OUTPUT);
    pinMode(A3, OUTPUT);
    а для сенсора
    Код (C++):
    pinMode(A2, INPUT);
    pinMode(A3, INPUT);
    Так вот здесь и творим абра-кадабру.
    Нужен дисплей переназначили пины
    Код (C++):
    pinMode(A2, OUTPUT);
    pinMode(A3, OUTPUT);
    нужен сенсор и снова переназначили их
    Код (C++):
    pinMode(A2, INPUT);
    pinMode(A3, INPUT);
    Нужно датчик прицепить нашли еще пин, узнали как его дисплей использует, как вход или выход (а он то у нас почти все использует как выход).
    И по прежнему сценарию.
    Нужно прочитать с пина? назначили его "INPUT"
    Нужно записать в пин? назначили его "OUTPUT"
    И всё это в любом месте кода.
    И проблема с нехваткой пинов решена(на сколько это возможно и без конфликтов устройств).
     
    Последнее редактирование: 9 дек 2016
    user999 нравится это.