Экран 1.8" 128*160 (st7735) - скорость обновления информации

Тема в разделе "Arduino & Shields", создана пользователем makc014, 27 янв 2015.

  1. makc014

    makc014 Нуб

    Подскажите как реализовать скетч обновления информации на экране 1.8" 128*160 (st7735) с максимальной частотой.
    Используется Arduino UNO, библиотека Adafruit-ST7735, хардварный SPI и библиотека CyberLib.h
    При использовании команды tft.fillScreen(ST7735_BLACK) - экран мерцает.
    Вычитал на форумах, чтоне обязательно очищать полностью экран, а затирать старую информацию "пробелами".
    Пробелами у меня не получилось и пришлось затирать командами:
    Код (Text):
    tft.fillScreen(ST7735_BLACK);
    tft.setCursor(70,32);
    tft.println("\x08\x08\x08\x08");
    tft.setCursor(70,32);
    tft.println("\x07\x07\x07\x07");
    Помогите оптимизировать скетч чтобы на экране информация не мерцала. Может есть возможность ограничить количество цветов до 2 (черный-белый).
    Код (Text):
    void setup() {
    tft.initR(INITR_BLACKTAB);  // initialize a ST7735S chip, black tab
    StartSPI(0, 2, 1);
    tft.fillScreen(ST7735_BLACK);
    tft.setTextSize(2);
    tft.setCursor(0,0);
    tft.setTextColor(ST7735_RED);
    tft.println("TEMP");
    tft.setCursor(0,16);
    tft.setTextColor(ST7735_YELLOW);
    tft.println("TEMP2");
    tft.setCursor(0,32);
    tft.setTextColor(ST7735_GREEN);
    tft.println("TEMP3");
    tft.setTextColor(ST7735_BLUE);
    tft.setCursor(0,48);
    display.println("TEMP4");
    }

    void loop() {
    tft.setTextSize(2);
    tft.setTextColor(ST7735_BLACK);
    /////затираю числа на экране
    tft.setCursor(70,0);
    tft.println("\x08\x08\x08\x08");
    tft.setCursor(70,0);
    tft.println("\x07\x07\x07\x07");
    tft.setCursor(70,16);
    tft.println("\x08\x08\x08\x08");
    tft.setCursor(70,16);
    tft.println("\x07\x07\x07\x07");
    tft.setCursor(70,32);
    tft.println("\x08\x08\x08\x08");
    tft.setCursor(70,32);
    tft.println("\x07\x07\x07\x07");
    tft.setCursor(70,48);
    tft.println("\x08\x08\x08\x08");
    tft.setCursor(70,48);
    tft.println("\x07\x07\x07\x07");
    ///////////////////

    tft.setTextColor(ST7735_RED);
    tft.setCursor(70,0);
    tft.println(A0_Read);

    tft.setTextColor(ST7735_YELLOW);
    tft.setCursor(70,16);
    tft.println(A1_Read);

    tft.setTextColor(ST7735_YELLOW);
    tft.setCursor(70,32);
    tft.println(A2_Read;);

    tft.setTextColor(ST7735_GREEN);
    tft.setCursor(70,48);
    tft.println(A3_Read);
     
     
  2. Un_ka

    Un_ka Гуру

    А человеку так и не ответили...
     
  3. vvr

    vvr Инженерище

    Так форумы устроены.
    Значит или тема никому не интересна или никто с этим дисплеем на тот момент не возился или не попалась на глаза тема челу, который с удовольствием бы ответил)))))
     
  4. asam

    asam Гик

    Можно попробовать увеличить частоту на которой работает SPI
     
  5. ELITE

    ELITE Гик

    не надо использовать очистку всего экрана - это долго...
    у меня тоже подобный экран (128*128 только) и тоже надо было текстовку обновлять
    в библиотеке есть команды на рисование прямоугольника по координатам и размерам - так вот, если надо обновить информацию на экране - то перед выводом новой, просто на месте старой рисуйте прямоугольник в цвет фона
    Это значительно быстрее и хоть мерцание остается, но уже куда в меньшей степени

    Код (C++):
    tft.fillRoundRect(10, 10,  85, 220, 7, 0xFF76);
    (от левого края, от верха, ширина, высота, радиус углов скругления, цвет RGB656)
     
  6. ELITE

    ELITE Гик

    а да, если надо кирилицей писать
    Код (C++):
    char *utf8rus(char *source)
    {
      int i,j,k;
      unsigned char n;
      char m[2] = { '0', '\0' };

      strcpy(target, ""); k = strlen(source); i = j = 0;

      while (i < k) {
        n = source[i]; i++;

        if (n >= 0xC0) {
          switch (n) {
            case 0xD0: {
              n = source[i]; i++;
              if (n == 0x81) { n = 0xA8; break; }
              if (n >= 0x90 && n <= 0xBF) n = n + 0x30;
              break;
            }
            case 0xD1: {
              n = source[i]; i++;
              if (n == 0x91) { n = 0xB8; break; }
              if (n >= 0x80 && n <= 0x8F) n = n + 0x70;
              break;
            }
          }
        }

        m[0] = n; strcat(target, m);
        j++; if (j >= maxString) break;
      }
      return target;
    }
    и вот так вызывать
    Код (C++):
    tft.println(utf8rus("МОРОЗИЛЬНАЯ КАМЕРА"));
     
  7. ELITE

    ELITE Гик

    а нафига вы тему 15 года подняли?