2.4 TFT LCD Не могу заставить работать этот экран.

Тема в разделе "Arduino & Shields", создана пользователем krik, 9 ноя 2014.

  1. AlexVS

    AlexVS Гик

  2. cheloveki

    cheloveki Нуб

    Как правильно обновлять информацию на этом экране?
    Например я вывожу часы, как их обновить, что бы экран не моргал.
     
  3. AlexVS

    AlexVS Гик

    Просто обновить значение времени, остальное просто не трогать.
     
  4. cheloveki

    cheloveki Нуб

    Все верно так и делаю. Получается так



    Код

    Код (C++):
    void loop(void) {
     
      s=rtc.getTimeStr();

      tft.fillRect(0, 0, 240, 50, BLACK );
      tft.drawRect(0, 0, 240, 50, RED);

      tft.setCursor(3,5);  
      Serial.println(s);
      tft.setTextSize(5);
      tft.println(s);

    tft.setCursor(0,100);
    tft.setTextSize(5);
      tft.println("TEXT");
      delay(1000);
     
  5. AlexVS

    AlexVS Гик

    Попробуй так
    Код (C++):
    void setup
    {
      tft.fillRect(0, 0, 240, 50, BLACK );
      tft.drawRect(0, 0, 240, 50, RED);
    }
    void time2display(int x,int y)
    {
      s = rtc.getTimeStr();
      tft.setCursor(x, y);
      tft.setTextSize(5);
      tft.println(s);
      Serial.println(s);
    }
    void text2display(int x, int y)
    {
      tft.setCursor(x, y);
      tft.setTextSize(5);
      tft.println("TEXT");
    }

    void loop(void)
    {
      time2display(3,5);
      text2display(0,100);
    }
     
  6. cheloveki

    cheloveki Нуб

    Так время не моргает, но и перерисовывается поверх старого. Как экран обновить до вывода времени?

    Я перед выводом закрашивал сектор для обновления, но результат вы видели выше.

    Код (C++):
    tft.fillRect(0, 0, 240, 50, BLACK );
    tft.drawRect(0, 0, 240, 50, RED);
     
  7. vvr

    vvr Инженерище

    вы обновляйте не все параметры:) времени, а только то, что изменилось
    и моргать не будет
     
  8. AlexVS

    AlexVS Гик

    А используемая вами библиотека дисплея позволяет отображать не строку и число?
    Формируйте время из чисел:
    Код (C++):
     
    LCD.printNumI(hour(), x, y, 2, '0');
    LCD.printNumI(minute(), x+85, y, 2, '0');
    У меня функция вывода времени выглядит
    Код (C++):
    void time2display(int x, int y)
    {
      myGLCD.setFont(SevenSegNumFont);
      myGLCD.setColor(VGA_WHITE);
      myGLCD.printNumI(hour(), x, y, 2, '0');
      myGLCD.printNumI(minute(), x+85, y, 2, '0');
      // обеспечим "моргание" разделителя часов и минут
      if (second() % 2)  myGLCD.setColor(myGLCD.getBackColor());
      // поскольку в шрифте нет "двоеточия" для разделения часов и минут - нарисуем это сами //
      myGLCD.fillCircle(x+74, y+35, 4);
      myGLCD.fillCircle(x+74, y+14, 4);
      myGLCD.setColor(VGA_WHITE);
      myGLCD.setFont(BigFont);
    }
    но у меня дисплей другой, на другом контроллере.
     
  9. AlexVS

    AlexVS Гик

    У него моргает из-за того что он каждый раз закрашивает прямоугольник с временем черным цветом.
     
  10. cheloveki

    cheloveki Нуб

    Да может. Проблему с морганием решил путем сравнивая старое с новым. И соответственно перерисовываю только то что поменялось.

    Код (C++):
    void timeH(int h)
    {

      if(h!=h2)
      {
        tft.fillRect(10, 10, 50, 50, BLACK );
        tft.setCursor(10, 10);
        tft.setTextSize(5);
        tft.println(h);
        h2=h;
      }

    }
    Далее по мере изучения возникла следующая проблема.

    Код (C++):
    t = rtc.getTime();

      timeH(t.hour);
      timeM(t.min);
      timeSec(t.sec);


    //-- Добавил это
      TSPoint p = ts.getPoint();
      pinMode(XM, OUTPUT);
      pinMode(YP, OUTPUT);

      if (p.z > MINPRESSURE && p.z < MAXPRESSURE){
         p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width()); Serial.print("X = "); Serial.print(p.x);
         p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());Serial.print("\tY = "); Serial.print(p.y);
         Serial.print("\tPressure = "); Serial.println(p.z);  
      }  
    Если добавить обработку нажатия touchscreen, то время, например секунды перерисовываются через 2. Т.е. 1-3-5, как будто не успевает. Это как то поправить можно?
     
  11. AlexVS

    AlexVS Гик

    Тут я уже не помогу, нет такого дисплея под рукой.
    Возможно просто Ардуина не справляется, нужно смотреть весь код скетча и оптимизировать.
     
  12. cheloveki

    cheloveki Нуб

    Я как бы не напрашиваюсь, но гляньте свежим взглядом)))
    Тач работает от легкого прикосновения, это я вижу через монитор порта. Но время как бы через 2 секунды))

    Весь код (причем если попадает на четные секунды 2-4-6-8 и т.д. минуты обновляются, а если на оборот, то не обновляются. )
    Код (C++):
    #include "TFTLCD.h"
    #include "TouchScreen.h"

    #define YP A1
    #define XM A2
    #define YM 7
    #define XP 6

    #define TS_MINX 150
    #define TS_MINY 120
    #define TS_MAXX 850
    #define TS_MAXY 891

    TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

    #define LCD_CS A3
    #define LCD_CD A2
    #define LCD_WR A1
    #define LCD_RD A0

    #define LCD_RESET A4

    #define    BLACK           0x0000
    #define    BLUE            0x001F
    #define    RED             0xF800
    #define    GREEN           0x07E0
    #define CYAN            0x07FF
    #define MAGENTA         0xF81F
    #define YELLOW          0xFFE0
    #define WHITE           0xFFFF

    TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

    #define BOXSIZE_X 230
    #define BOXSIZE_Y 61

    #define MINPRESSURE 10
    #define MAXPRESSURE 1000

    //clock
    #include "DS1302.h" // часы
    DS1302 rtc(11,12,13);  //инициализация платы DS1302

    Time t;

    int sec2=0;
    int h2=0;
    int m2=0;
    void setup() {

      Serial.begin(9600);

      tft.reset();
      tft.initDisplay();
      tft.fillScreen(BLACK);
     
      rtc.halt(false);
      rtc.writeProtect(false);

    }

    void timeH(int h)
    {  
      if(h!=h2)
      {
        tft.fillRect(10, 10, 50, 50, BLACK );
        tft.setCursor(10, 10);
        tft.setTextSize(5);
        tft.println(h);
        h2=h;
      }
    }

    void timeM(int m)
    {  
      if(m!=m2)
      {
        tft.fillRect(80, 10, 50, 50, BLACK );
        tft.setCursor(80, 10);
        tft.setTextSize(5);
        tft.println(m);
        m2=m;
      }
    }

    void timeSec(int sec1)
    {
      if(sec1!=sec2)
      {
        tft.fillRect(150, 10, 60, 60, BLACK );
        tft.setCursor(150, 10);
        tft.setTextSize(5);
        tft.println(sec1);
        sec2=sec1;
      }
    }

    void loop()
    {
      t = rtc.getTime();

      timeH(t.hour);
      timeM(t.min);
      timeSec(t.sec);

      TSPoint p = ts.getPoint();
      pinMode(XM, OUTPUT);
      pinMode(YP, OUTPUT);

      if (p.z > MINPRESSURE && p.z < MAXPRESSURE){
         p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width()); Serial.print("X = "); Serial.print(p.x);
         p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());Serial.print("\tY = "); Serial.print(p.y);
         Serial.print("\tPressure = "); Serial.println(p.z);  
      }

    }
     
  13. AlexVS

    AlexVS Гик

    Я вам предложил выводить время используя соответствующие методы(функции) библиотеки, но вы избрали свой путь, используете строковую переменную. В оставшейся части кода явных тормозов не вижу, может более опытные товарищи помогут.
    PS что бы не испытывать подобных проблем, я отказался от вывода секунд, испульзую просто мигающее двоеточие.
     
  14. molkomso

    molkomso Нуб

  15. KellaKilla

    KellaKilla Нерд

    НЕ хотел плодить темы, поэтому отпишусь тут.
    Стал обладателем подобного шилда. Размер экрана 2,4 дюйма. Решил проверить тестовым скетчем. Тест выдал, что контроллером экрана является HX8357. При загрузке пробного скетча- все выводимые слова были зеркально отображены. Как оказалось такое происходит из за того, что тестовый скетч неправильно определяет тип контроллера экрана, стоило в скетче указать экран с контроллером 9341, все заработало.
     
  16. REm

    REm Гик

    у меня появился
    2.8 tft lcd shield 61505v
    но в сети, нет библиотеки на него. Зашёл на сайт производителя, там тоже не особо понятно. Подскажите, какая библиотека подойдёт?
     
  17. KellaKilla

    KellaKilla Нерд

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

    Либы- на GitHab лежать. Будут вопросы- спрашивайте, постараюсь ответить.

    Код (C++):
    #include <Adafruit_GFX.h> // Libreria de graficos
    #include <Adafruit_TFTLCD.h> // Libreria de LCD

    // Pines de conexion del LCD
    #define LCD_CS A3       // Chip Select - Pin analogico 3
    #define LCD_CD A2       // Command/Data - Pin Analogico 2
    #define LCD_WR A1      // LCD Write - Pin Analogico 1
    #define LCD_RD A0      // LCD Read - Pin Analogico 0
    #define LCD_RESET A4 // LCD Reset - Pin Analogico 4

    Adafruit_TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET); // Instancia del LCD

    #define BLACK 0x0000          // Определим цвета, чтобы обратиться к ним с вашим именем
    #define RED 0xF800             // вместо того чтобы использовать шестнадцатеричный код.
    #define GREEN 0x07E0
    #define WHITE 0xFFFF
    #define BLUE 0x001F
    #define CYAN 0x07FF
    #define YELLOW 0xFFE0
    #define MAGENTA 0xF81F

    void setup(void)
    {
    // Вот тут надо заострить внимание, так как контроллеры у экрана бывают разные и по
    // этому у некоторых при выполнении скетча ничего не происходит или экран горит белым
    // это говорит о том что инициализации контроллера прошла не правильно.
    // Для этого в строке  tft.begin(0x0154);  меняет адреса которые есть ниже в коментах
    // и заново загружаем скетч в ардуино пока не покажется картинка. Ошибка не должна
    // выводиться даже при не правильным инициализации контроллера экрана.

    tft.begin(0x0154);      // Инициализация адреса контроллера
    // Адреса контролеров: 0x9325, 0x9328,0x7575, 0x9341, 0x8357,
    // 0x0154,0x9488

    tft.fillScreen(BLACK);    // Очистка в черный цвет экран
    }

    void loop(void)
    {
    // этот блок функций будет крутиться постоянно

    tft.setRotation(0);            // Установка положения экрана по вертикали или горизонтали ( даном положении вертикально "0"

    tft.setCursor(40, 10);      // Поместим курсор в нужное место дисплея (X,Y),
    // где X ширина (240 точек макс.) И Y высокий (320 точек макс.)

    tft.setTextSize(2);          // Определим размер текста. (Испытано размеры от 1 до 10)

    tft.setTextColor(CYAN);   // Определяем цвет текста

    tft.println("my-buka");

    // Дальше функции повторяются для наглядности их изменений в, положении экрана, точки курсора, размера текста,
    // цвета текста

    tft.setRotation(1);
    tft.setCursor(40, 10);
    tft.setTextSize(2);
    tft.setTextColor(CYAN);
    tft.println("my-buka");

    tft.setRotation(2);
    tft.setCursor(40, 10);
    tft.setTextSize(2);
    tft.setTextColor(CYAN);
    tft.println("my-buka");

    tft.setRotation(3);
    tft.setCursor(40, 10);
    tft.setTextSize(2);
    tft.setTextColor(CYAN);
    tft.println("my-buka");

    tft.setRotation(0);
    tft.setCursor(80, 41);
    tft.setTextSize(5);
    tft.setTextColor(RED);
    tft.println("RED");

    tft.setRotation(0);
    tft.setCursor(65, 82);
    tft.setTextSize(4);
    tft.setTextColor(GREEN);
    tft.println("GREEN");

    tft.setRotation(0);
    tft.setCursor(75, 116);
    tft.setTextSize(3);
    tft.setTextColor(WHITE);
    tft.println("WHITE");

    tft.setRotation(0);
    tft.setCursor(78, 143);
    tft.setTextSize(2);
    tft.setTextColor(MAGENTA);
    tft.println("MAGENTA");

    tft.setRotation(0);
    tft.setCursor(80, 162);
    tft.setTextSize(3);
    tft.setTextColor(CYAN);
    tft.println("CYAN");

    tft.setRotation(0);
    tft.setCursor(45, 190);
    tft.setTextSize(4);
    tft.setTextColor(YELLOW);
    tft.println("YELLOW");

    tft.setRotation(0);
    tft.setCursor(58, 224);
    tft.setTextSize(5);
    tft.setTextColor(BLUE);
    tft.println("BLUE");

    delay(10000); // Пауза 10 секунд
    }
     
     
  18. shpock

    shpock Гик

    Вот неплохая библиотека https://forum.arduino.cc/index.php?topic=366304.0 , должна подойти, поддерживает большинство контроллеров.
     
  19. REm

    REm Гик

    KellaKilla,
    shpock
    спасибо вам!
    попробую на выходных.
     
  20. NikitOS

    NikitOS Король шутов Администратор

    Да м
    Да!? Мне только сегодня такой пришел