Мерцание TFT LCD SPI 1.44'' 128x128

kserj
Offline
Зарегистрирован: 27.01.2016

Всем добрый день.

Кто сталкивался с такой проблемой!!!

Экран TFT LCD 1.44'' 128x128 V2.1, библиотека Adafruit_GFX, драйвер TFT_ILI9163C. Тип МК Arduino Uno R3. Тактовая частота МК 16Мг.

Чтобы обновить показания канала АЦП  на экране , нужно сначало  стереть старое число , а потом записать новое на его место. Так вот происходить мерцание выводимых символов.  Не пойму в чем дело.

Но меня гложет смутное сомение  , что не тянет сам TFT ?.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Поиск в ерхнем правом углу. Читать устанете, сколько тёрли

kserj
Offline
Зарегистрирован: 27.01.2016

Написано не много , толкового нет.

А вот если мозги поднапряч то ларчик просто открывается:

 if (Value != cons)   
    {  x=12;y=2;w=97;h=37; 
       display.fillRect(x,y,w,h,0x0000); //заливка цветом выделенной области (стирает старое показание)      
           display.setTextColor(GREEN);
              display.setTextSize(4);
                display.setCursor(14,5);
                 display.print(Value);  }                   // сюда выводится показания АЦП  
                  cons=Value;      
 
изюминка в том , что не надо выводить старое значение. Мерцание прекратилось.
если что-то хочешь сделать надо это делать самому.
Всем спасибо , кто прочитал мое сообщение.
ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

kserj пишет:

Написано не много , толкового нет.

Именно такое решение, как у Вас было описано темах в трёх, так искали.

kserj пишет:

если что-то хочешь сделать надо это делать самому.

 
Абсолютно точно! Скоро Вы дойдёте до следующего шага. Думать надо перед тем, как лезть на форум с вопросами, а не после. Тогда вопросов будет на порядок меньше.

 

kserj
Offline
Зарегистрирован: 27.01.2016

Полностью согласен.

Eugen_S
Offline
Зарегистрирован: 27.08.2016

Доброй ночи. А может кто второй пост разжевать. Я вот совсем новичёк в программировании, решил заняться этим, на 4 десятке. Экран у меня 7735. Выводит время с 1302. Время, дата, день. Обновление каждую секунду, старые показания закрашиваю прямоуголником. Пока учусь выводить время, даётся туго, ну совсем туго. Половину кода не понимаю, но пытаюсь, упорно. Мерцания секундные надоели, появилось огромное желание от них избавиться. Додумался что надо обновлять только те символы, которые меняются, а вот как это сделать... ну совсем даже не знаю с чего начать.

#include <Adafruit_ST7735.h>
#include <Adafruit_GFX.h>
#include <SPI.h>
#include <DS1302.h>

#define kCePin 9
#define kIoPin 8
#define kSclkPin 7


#define TFT_CS    10
#define TFT_DC    18
#define TFT_RST   0
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

DS1302 rtc(kCePin, kIoPin, kSclkPin);

void setup() {
tft.initR(INITR_BLACKTAB);
tft.setRotation (3);
tft.drawRoundRect (5, 0, 150, 26, 8,ST7735_GREEN);

}

String dayAsString(const Time::Day day) {
  switch (day) {
    case Time::kSunday: return "ВСКР";
    case Time::kMonday: return "ПНДК";
    case Time::kTuesday: return "ВТРК";
    case Time::kWednesday: return "СРЕД";
    case Time::kThursday: return "ЧТВГ";
    case Time::kFriday: return "ПТНЦ";
    case Time::kSaturday: return "СУБТ";
    }
  return "(unknown day)";
}

void loop() {
  Time t = rtc.time();

  const String Day = dayAsString(t.day);

  char time[9];
  char data[11];
  char day[10];
    
  snprintf(time, sizeof(time), "%02d:%02d:%02d",        
          t.hr, t.min, t.sec);
        
  snprintf(data, sizeof(data), "%02d/%02d/%02d",          
          t.date, t.mon, t.yr);
        
  snprintf(day, sizeof(day), "%s", Day.c_str());  
      
  tft.fillRect(20,5,120,18,ST7735_BLACK);
  tft.setTextSize(1);
  tft.setCursor(20, 5);
  tft.println(time);
   
  tft.setTextSize(1);
  tft.setCursor(80, 5);
  tft.println(data);

  tft.setTextSize(1);
  tft.setCursor(62, 15);
  tft.println(utf8rus(day));
  delay(1000);
}

 

di_mot
Offline
Зарегистрирован: 12.08.2016

Eugen_S пишет:

... ну совсем даже не знаю с чего начать.

Поискать, как решали другие. Для примера в тынц.

negavoid
Offline
Зарегистрирован: 09.07.2016

Eugen_S, не нужно постоянно очищать область экрана через tft.fillRect, из-за этого и мерцание; лучше задать цвет фона шрифта (чёрный) и выводить всегда одинаковое количество символов (чтобы новые затирали старые, с учётом фона). Первый параметр метода setTextColor задаёт цвет текста, второй - цвет фона.

tft.setTextColor(ST7735_WHITE, ST7735_BLACK);

Ещё, tft.setTextSize(1) постоянно вызывать перед каждым выводом текста не надо, достаточно всего один раз, можно даже внутри setup(), если не предполагаете выводить разные размеры шрифта.

Вот, как раз слева, у меня на аватарке, дисплей на ST7735, тексты выводятся именно таким способом, никакого мерцания нет и в помине.

Eugen_S
Offline
Зарегистрирован: 27.08.2016

Принял. Щас попробую

Eugen_S
Offline
Зарегистрирован: 27.08.2016

di_mot пишет:

Eugen_S пишет:

... ну совсем даже не знаю с чего начать.

Поискать, как решали другие. Для примера в тынц.

 

Этот документ я уже прочитал. И поверьте нихрена не понял. До этого уровня мне ещё далеко. Поэтому, если можно подскажите что попроще. Как я и говорил, в программировании я вообще с самого нуля только начинаю. И мозг у меня уже неожиданно туго всё воспринимает.

di_mot
Offline
Зарегистрирован: 12.08.2016

negavoid пишет:

Вот, как раз слева, у меня на аватарке, дисплей на ST7735, тексты выводятся именно таким способом, никакого мерцания нет и в помине.

При использовании моноширинных шрифтов(фонтов) - такие да.

А если шрифте знаки разной ширины и изменяем кол-ве знакомест при выводе на экран?

Мне, к примеру, не нравится шрифт, где точка, запятая, пробел и тп.,занимают столько же места, как и цифра 8.

Места и так не много на экране 240х320.

А про русские "Ж, Ш, Щ" - отдельная речь. :-)

Eugen_S
Offline
Зарегистрирован: 27.08.2016

negavoid пишет:

Eugen_S, не нужно постоянно очищать область экрана через tft.fillRect, из-за этого и мерцание; лучше задать цвет фона шрифта (чёрный) и выводить всегда одинаковое количество символов (чтобы новые затирали старые, с учётом фона). Первый параметр метода setTextColor задаёт цвет текста, второй - цвет фона.

tft.setTextColor(ST7735_WHITE, ST7735_BLACK);

Ещё, tft.setTextSize(1) постоянно вызывать перед каждым выводом текста не надо, достаточно всего один раз, можно даже внутри setup(), если не предполагаете выводить разные размеры шрифта.

Вот, как раз слева, у меня на аватарке, дисплей на ST7735, тексты выводятся именно таким способом, никакого мерцания нет и в помине.

Ух ты, как красиво заработало. Спасибо огромное. Идём дальше )))

Eugen_S
Offline
Зарегистрирован: 27.08.2016

Ещё один момент. У меня в углу в нижнем левом светится один пиксель. Я этому пикселю светиться никаких команд не давал, почему так происходит?

Eugen_S
Offline
Зарегистрирован: 27.08.2016

Ну вот и приехали. Убил ардуину ещё раз.

Как это получилось. Был залит скетч, который я выложил выше. У меня всё припаяно, 1302, 7735 через резисторы.

Далле ничего не отпаивая я заливаю вот такой скетч

#include <AccelStepper.h>
#define HALF4WIRE 8

#define motorPin1  6
#define motorPin2  7
#define motorPin3  8
#define motorPin4  9
int steps = Serial.parseInt();

AccelStepper stepper1 (HALF4WIRE, motorPin1, motorPin2, motorPin3, motorPin4, true);

void setup() 
{  
  while (!Serial);
  Serial.begin(9600);
  stepper1.setMaxSpeed(2000.0);
  stepper1.setAcceleration(5000.0);
  stepper1.moveTo(steps);
}

void loop()
{
if (Serial.available())
  stepper1.run();
  }

Всё. Ардуинка USB не определяется, компьютер на неё вообще никак не реагирует. Уже вторая сдохла (.

negavoid
Offline
Зарегистрирован: 09.07.2016

di_mot ну, рассчитывайте размеры через getTextBounds, закрашивайте :) Я не перфекционист, мне и курьер сойдёт, время==мани :)

Да и Eugen_S, полагаю, пока что не до тонкостей. Кстати, этот дисплей всего 128*160.

Eugen_S пишет:

Ещё один момент. У меня в углу в нижнем левом светится один пиксель. Я этому пикселю светиться никаких команд не давал, почему так происходит?

Судя по вашему скетчу - вроде не давали, не знаю :)

Eugen_S пишет:

Всё. Ардуинка USB не определяется, компьютер на неё вообще никак не реагирует. Уже вторая сдохла (.

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

Eugen_S
Offline
Зарегистрирован: 27.08.2016

Arduino Pro Micro.

Из скетча видно, что TFT сидит на 10 и 18 порту, всё остальное по распину, CLK - 15, MOSI - 16, RST - на RST. Время (1302) сидит на 7, 8, 9.

Управление шаговым двигателем сидело на 6, 7, 8, 9.

Получается мне шаговый скетч выдал серию импульсов в микруху часов 1302, а именно в пины CLK, DAT и RST.  Блин... взял последнюю, запасную плату, новую, рабочу, всё перепаял.... и нихрена не заработало, то ли часы подохли, то ли мне спать уже надо ))). Итог вечера: допиленный скетч и две сгоревших платы )))). Снова дорога на Али. 

Прозвонил ноги у 1302. Горелостей не обнаружил, по пинам замыканий нет, всё чисто, чего же случилось???

di_mot
Offline
Зарегистрирован: 12.08.2016

negavoid пишет:

di_mot ну, рассчитывайте размеры через getTextBounds, закрашивайте :) Я не перфекционист, мне и курьер сойдёт, время==мани :)

- Па-сип!

Не за зря я встрял в топик. :-)

Хотя в той либе, которую использую, именно такой функции нет, но направление вкурил, нарыл в Keywords.txt аналогчное и уже закодил. :-)

 

Eugen_S
Offline
Зарегистрирован: 27.08.2016

Господа, у меня три платы, и компьютер пишет Arduino Leonardo Bootloader (com14) при замыкании RST и GND, если держать замкнутыми, то этот бутлоадер пропадает, если перемкнуть и отпустить, то в ком портах сиди буквально секунды три, потом пропадает. Куда дальше копать? Кто подскажет

Eugen_S
Offline
Зарегистрирован: 27.08.2016

Добил. Все три Pro Micro оживил. С 1 Сентября всех!