Помогите с дисплеем tft 2.0

Тема в разделе "Arduino & Shields", создана пользователем Егор Сергеевич, 22 мар 2022.

  1. Здравствуйте. Есть дисплей TFT 2.0 (фото прилагаю). Не могу вывести на него текст. Ранее выводил информацию на другие TFT дисплеи, всё было замечательно. Из того, что нашел в сети, хоть как -то работает этот (выводит на четверть экрана - фото прилагаю):
    Код (C++):
    #include <TFT.h>                
    #include <SPI.h>                
    #define cs   10                  
    #define dc   9                  
    #define rst  8                  
    TFT TFTscreen = TFT(cs, dc, rst);

    void setup()
    {
      TFTscreen.begin();
      TFTscreen.background(0, 0, 0);
      TFTscreen.setTextSize(2);    
    }

    void loop()
    {
      TFTscreen.background ( 0 , 0 , 0 );
      TFTscreen.stroke(255, 0, 0);
      TFTscreen.text("Hello, World!", 20, 47);
      TFTscreen.text("RobotChip", 30, 67);
      delay(500);
    }
    [​IMG]

    [​IMG]

    Подключаю:
    GND-GND
    VCC-5V
    SCL-13
    SDA-11
    RST-8
    DC-9
    CS-10

    Что делаю не так? Как заполнить весь экран?
     
  2. Ariadna-on-Line

    Ariadna-on-Line Гуру

    Модель GMT020-02. То есть на одну четвертину все выводится как положено ?
    Явно видно что в библе расчет на вдвое меньший экран. Тут или искать команду задания размера, или команду выбора модели экрана, или лезть править библиотеку. Этих библиотек море. Выложите сюды вашу - может гуру разберутся.
     
    Последнее редактирование: 22 мар 2022
  3. mmmikle

    mmmikle Нуб

    Библиотека TFT.h для данного дисплея не подходит, данный дисплей имеет разрешение 240х320, а в библиотека может работать в пределе с 240х240 (переменные относящиеся к настройкам разрешения определены как uint8_t). Для тех кому данный дисплей попадет в руки следует отметить, что он SPI хотя маркировка контактов I2C. Контроллер дисплея IC ST7789V, подключить дисплей удалось с помощью библиотек Adafruit_GFX.h и Adafruit_ST7789.h. Ниже скетч, сразу говорю не мой, но с настройками разрешения изображение занимает полностью весь экран.

    Код (C++):
    /*
    * Interfacing Arduino with ST7789 TFT display (240x240 pixel).
    * Graphics test example.
    * This is a free software with NO WARRANTY.
    * https://simple-circuit.com/
    */

    /**************************************************************************
      This is a library for several Adafruit displays based on ST77* drivers.
      Works with the Adafruit 1.8" TFT Breakout w/SD card
        ----> http://www.adafruit.com/products/358
      The 1.8" TFT shield
        ----> https://www.adafruit.com/product/802
      The 1.44" TFT breakout
        ----> https://www.adafruit.com/product/2088
      as well as Adafruit raw 1.8" TFT display
        ----> http://www.adafruit.com/products/618
      Check out the links above for our tutorials and wiring diagrams.
      These displays use SPI to communicate, 4 or 5 pins are required to
      interface (RST is optional).
      Adafruit invests time and resources providing this open source code,
      please support Adafruit and open-source hardware by purchasing
      products from Adafruit!
      Written by Limor Fried/Ladyada for Adafruit Industries.
      MIT license, all text above must be included in any redistribution
    **************************************************************************/

    #include <Adafruit_GFX.h>    // Core graphics library
    #include <Adafruit_ST7789.h> // Hardware-specific library for ST7789
    #include <SPI.h>             // Arduino SPI library
    // ST7789 TFT module connections
    #define TFT_CS    10  // define chip select pin
    #define TFT_DC     9  // define data/command pin
    #define TFT_RST    8  // define reset pin, or set to -1 and connect to Arduino RESET pin
    // Initialize Adafruit ST7789 TFT library
    Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
    float p = 3.1415926;
    void setup(void) {
      Serial.begin(9600);
      Serial.print(F("Hello! ST77xx TFT Test"));
      // if the display has CS pin try with SPI_MODE0
      tft.init(240, 320, SPI_MODE2);    // Init ST7789 display 240x320 pixel
      // if the screen is flipped, remove this command
      tft.setRotation(2);
      Serial.println(F("Initialized"));
      uint16_t time = millis();
      tft.fillScreen(ST77XX_BLACK);
      time = millis() - time;
      Serial.println(time, DEC);
      delay(500);
      // large block of text
      tft.fillScreen(ST77XX_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. ", ST77XX_WHITE);
      delay(1000);
      // tft print function!
      tftPrintTest();
      delay(4000);
      // a single pixel
      tft.drawPixel(tft.width()/2, tft.height()/2, ST77XX_GREEN);
      delay(500);
      // line draw test
      testlines(ST77XX_YELLOW);
      delay(500);
      // optimized lines
      testfastlines(ST77XX_RED, ST77XX_BLUE);
      delay(500);
      testdrawrects(ST77XX_GREEN);
      delay(500);
      testfillrects(ST77XX_YELLOW, ST77XX_MAGENTA);
      delay(500);
      tft.fillScreen(ST77XX_BLACK);
      testfillcircles(10, ST77XX_BLUE);
      testdrawcircles(10, ST77XX_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(ST77XX_BLACK);
      for (int16_t x=0; x < tft.width(); x+=6) {
        tft.drawLine(0, 0, x, tft.height()-1, color);
        delay(0);
      }
      for (int16_t y=0; y < tft.height(); y+=6) {
        tft.drawLine(0, 0, tft.width()-1, y, color);
        delay(0);
      }
      tft.fillScreen(ST77XX_BLACK);
      for (int16_t x=0; x < tft.width(); x+=6) {
        tft.drawLine(tft.width()-1, 0, x, tft.height()-1, color);
        delay(0);
      }
      for (int16_t y=0; y < tft.height(); y+=6) {
        tft.drawLine(tft.width()-1, 0, 0, y, color);
        delay(0);
      }
      tft.fillScreen(ST77XX_BLACK);
      for (int16_t x=0; x < tft.width(); x+=6) {
        tft.drawLine(0, tft.height()-1, x, 0, color);
        delay(0);
      }
      for (int16_t y=0; y < tft.height(); y+=6) {
        tft.drawLine(0, tft.height()-1, tft.width()-1, y, color);
        delay(0);
      }
      tft.fillScreen(ST77XX_BLACK);
      for (int16_t x=0; x < tft.width(); x+=6) {
        tft.drawLine(tft.width()-1, tft.height()-1, x, 0, color);
        delay(0);
      }
      for (int16_t y=0; y < tft.height(); y+=6) {
        tft.drawLine(tft.width()-1, tft.height()-1, 0, y, color);
        delay(0);
      }
    }
    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(ST77XX_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(ST77XX_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(ST77XX_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(ST77XX_BLACK);
      int color = 0xF800;
      int t;
      int w = tft.width()/2;
      int x = tft.height()-1;
      int y = 0;
      int z = tft.width();
      for(t = 0 ; t <= 15; t++) {
        tft.drawTriangle(w, y, y, x, z, x, color);
        x-=4;
        y+=4;
        z-=4;
        color+=100;
      }
    }
    void testroundrects() {
      tft.fillScreen(ST77XX_BLACK);
      int color = 100;
      int i;
      int t;
      for(t = 0 ; t <= 4; t+=1) {
        int x = 0;
        int y = 0;
        int w = tft.width()-2;
        int h = tft.height()-2;
        for(i = 0 ; i <= 16; 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(ST77XX_BLACK);
      tft.setCursor(0, 30);
      tft.setTextColor(ST77XX_RED);
      tft.setTextSize(1);
      tft.println("Hello World!");
      tft.setTextColor(ST77XX_YELLOW);
      tft.setTextSize(2);
      tft.println("Hello World!");
      tft.setTextColor(ST77XX_GREEN);
      tft.setTextSize(3);
      tft.println("Hello World!");
      tft.setTextColor(ST77XX_BLUE);
      tft.setTextSize(4);
      tft.print(1234.567);
      delay(1500);
      tft.setCursor(0, 0);
      tft.fillScreen(ST77XX_BLACK);
      tft.setTextColor(ST77XX_WHITE);
      tft.setTextSize(0);
      tft.println("Hello World!");
      tft.setTextSize(1);
      tft.setTextColor(ST77XX_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(ST77XX_WHITE);
      tft.println("Sketch has been");
      tft.println("running for: ");
      tft.setTextColor(ST77XX_MAGENTA);
      tft.print(millis() / 1000);
      tft.setTextColor(ST77XX_WHITE);
      tft.print(" seconds.");
    }
    void mediabuttons() {
      // play
      tft.fillScreen(ST77XX_BLACK);
      tft.fillRoundRect(25, 10, 78, 60, 8, ST77XX_WHITE);
      tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_RED);
      delay(500);
      // pause
      tft.fillRoundRect(25, 90, 78, 60, 8, ST77XX_WHITE);
      tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_GREEN);
      tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_GREEN);
      delay(500);
      // play color
      tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_BLUE);
      delay(50);
      // pause color
      tft.fillRoundRect(39, 98, 20, 45, 5, ST77XX_RED);
      tft.fillRoundRect(69, 98, 20, 45, 5, ST77XX_RED);
      // play color
      tft.fillTriangle(42, 20, 42, 60, 90, 40, ST77XX_GREEN);
    }
     
     
    Последнее редактирование: 3 окт 2022
  4. Андрей_711

    Андрей_711 Нерд

    Подскажите, а как подключить такой экран к ES8266 (NopeMCU) ? Нигде не могу найти информацию по этому поводу. Приведенный код запускается и отрабатывает до конца, но на экране ничего не отображается.
     
  5. parovoZZ

    parovoZZ Гуру

    На ESP8266 есть же SPI? Вот к нему и подключается. Про SPI инфы в инете просто валом.
     
  6. Андрей_711

    Андрей_711 Нерд

    paravoZZ, честно, было бы полезнее просто перечислить подключения, чем давать ссылку на мануалы. На экране кроме питания 5 информационных линий SCL, SDA, RST, DC, CS Как их распределить по NodeMCU? С учетом что в коде упоминаются только 3 из них?
     
    Рокки1945 нравится это.
  7. Андрей_711

    Андрей_711 Нерд

    Может кому потребуется

    #define TFT_CS D2 // define chip select pin
    #define TFT_DC D1 // define data/command pin
    #define TFT_RST D0 // define reset pin, or set to -1 and connect to Arduino RESET pin
    /* Остальные контакты
    TFT NODEMCU
    GND - GND
    VCC - VCC
    SDL - D5 (HSCLK)
    SDA - D7 (HMOSI)
     
    Рокки1945 нравится это.
  8. gorby777

    gorby777 Нуб

    У меня дисплей завелся когда изменил строку
    tft.init(240, 320, SPI_MODE0); // Init ST7789 display 240x320 pixel
     
  9. IURIJ

    IURIJ Нуб

    У меня не большая проблемка мне нужно изменить скетч на дисплей 2004 i2c если не трудно прошу помощи так как сам не очень понимаю в этом

    #include <LiquidCrystal.h> // Подключаем стандартную библиотеку для LCD-дисплея

    // Инициализация LCD-дисплея (RS, E, D4, D5, D6, D7)
    LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

    // Пины для HC-SR04
    const int trigPin = 3;
    const int echoPin = 2;

    // Пины для RGB светодиода
    const int redPin = 4;
    const int greenPin = 5;
    const int bluePin = 6;

    // Пин для пьезо-пищалки
    const int buzzerPin = 13;

    // Переменные для хранения времени и расстояния
    long duration;
    int distance;

    void setup() {
    // Настройка пинов для HC-SR04
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);

    // Настройка пинов для RGB светодиода
    pinMode(redPin, OUTPUT);
    pinMode(greenPin, OUTPUT);
    pinMode(bluePin, OUTPUT);

    // Настройка пина для пьезо-пищалки
    pinMode(buzzerPin, OUTPUT);

    // Инициализация LCD-дисплея 16x2
    lcd.begin(16, 2);
    lcd.print("Dist:"); // Печатаем начальный текст
    }

    void loop() {
    // Генерация ультразвукового импульса
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);
    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);
    digitalWrite(trigPin, LOW);

    // Чтение импульса Echo и расчет расстояния
    duration = pulseIn(echoPin, HIGH);
    distance = duration * 0.034 / 2; // Расчет расстояния в сантиметрах

    // Отображение расстояния на LCD-дисплее
    lcd.setCursor(6, 0); // Устанавливаем курсор после "Dist:"
    lcd.print(" "); // Очищаем предыдущие цифры
    lcd.setCursor(6, 0); // Снова устанавливаем курсор
    lcd.print(distance); // Печатаем новое значение

    // Логика изменения цвета RGB светодиода и звуковых сигналов
    if (distance > 100) {
    // Если препятствий нет (дальше 100 см) — синий цвет, звук выключен
    setColor(255, 0, 0); // Синий
    noTone(buzzerPin); // Отключаем звук
    } else if (distance > 50 && distance <= 100) {
    // Препятствие далеко (50–100 см) — зеленый цвет, один короткий сигнал
    setColor(0, 255, 0); // Зеленый
    playBeep(1);
    } else if (distance > 30 && distance <= 50) {
    // Препятствие приближается (30–50 см) — желтый цвет, два коротких сигнала
    setColor(0, 200, 200); // Желтый
    playBeep(2);
    } else if (distance > 20 && distance <= 30) {
    // Препятствие близко (20–30 см) — оранжевый цвет, три коротких сигнала
    setColor(0, 100, 255); // Оранжевый
    playBeep(3);
    } else if (distance <= 15) {
    // Препятствие очень близко (меньше 15 см) — красный цвет, постоянный звук
    setColor(0, 0, 255); // Красный
    tone(buzzerPin, 1000); // Постоянный звук
    }

    delay(500); // Задержка перед следующим измерением
    }

    // Функция установки цвета на RGB светодиоде
    void setColor(int red, int green, int blue) {
    analogWrite(redPin, red);
    analogWrite(greenPin, green);
    analogWrite(bluePin, blue);
    }

    // Функция для проигрывания звуковых сигналов
    void playBeep(int count) {
    for (int i = 0; i < count; i++) {
    tone(buzzerPin, 1000); // Включаем звук с частотой 1000 Гц
    delay(100); // Задержка для короткого сигнала
    noTone(buzzerPin); // Отключаем звук
    delay(100); // Задержка между сигналами
    }
    }
     

    Вложения:

    Последнее редактирование: 1 янв 2025 в 13:52
  10. parovoZZ

    parovoZZ Гуру

    здесь обсуждаем дисплей tft, а не 2004
     
  11. Airbus

    Airbus Радиохулиган Модератор

    [​IMG]