Функция Print

intom33
Offline
Зарегистрирован: 26.11.2016

Доброго времени суток Всем !

Хочется сделать часики на дисплее 128Х128 ST7735, но столкнулся с проблемой вывода на экран при

помощи функции print ?? Почему то выводимые цифры накладываются друг на друга и получается что они все вместе выводятся на экран при этом не стираются предыдущие?? Вот пример небольшого кода:

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
#include <Fonts/FreeSansBold9pt7b.h>
#include <DS1307.h>
DS1307 rtc(A4, A5);
#define TFT_CS     10
#define TFT_RST    8  
#define TFT_DC     9
Time t;
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

#define TFT_SCLK 13   // set these to be whatever pins you like!
#define TFT_MOSI 11   // set these to be whatever pins you like!

void setup(void) {
  rtc.halt(false);
  tft.initR(INITR_REDTAB);   // initialize a ST7735S chip, black tab
  tft.fillScreen(ST7735_BLACK);
  tft.setRotation(1);
  tft.setFont(&FreeSansBold9pt7b);
  
 }
void loop() {
 t = rtc.getTime();
 tft.setCursor(15,50);
 tft.print(t.sec,DEC);
 delay(500);
}

Кто подскажет что делаю не так ?? За ране СПАСИБО !!

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

intom33 пишет:
Кто подскажет что делаю не так ??

Так Вы же сами себе всё и подсказали.

intom33 пишет:
не стираются предыдущие

Так стирайте! Кто не даёт-то? Выводите сначала пробелы, а потом на то же место новые цифры, например.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Нестандартный шрифт выводится без фона.

intom33
Offline
Зарегистрирован: 26.11.2016

Пробывал пробелами стирать тот же результат ?? Вот код:

void loop() {
 t = rtc.getTime();
 tft.setCursor(15,50);
 tft.print("       ");
 tft.setCursor(15,50);
 tft.print(t.sec,DEC);
 delay(500);
}

Не пойму что не так ????

intom33
Offline
Зарегистрирован: 26.11.2016

С стандартным шрифтом то же самое

#include <Adafruit_GFX.h>    // Core graphics library
#include <Adafruit_ST7735.h> // Hardware-specific library
#include <SPI.h>
//#include <Fonts/FreeSansBold9pt7b.h>
#include <DS1307.h>
DS1307 rtc(A4, A5);
#define TFT_CS     10
#define TFT_RST    8  
#define TFT_DC     9
Time t;
Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST);

#define TFT_SCLK 13   // set these to be whatever pins you like!
#define TFT_MOSI 11   // set these to be whatever pins you like!

void setup(void) {
  rtc.halt(false);
  tft.initR(INITR_REDTAB);   // initialize a ST7735S chip, black tab
  tft.fillScreen(ST7735_BLACK);
  tft.setRotation(1);
  tft.setFont();
  
 }
void loop() {
 t = rtc.getTime();
 tft.setCursor(15,50);
 tft.print("       ");
 tft.setCursor(15,50);
 tft.print(t.sec,DEC);
 delay(500);
}

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Пробел это тоже фон ... Вместо него ничего не выводится - просто происходит сдвиг позиции.

intom33
Offline
Зарегистрирован: 26.11.2016

Сдвиг не происходит потому как есть функция tft.setCursor(15,50);

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Видимо в новых версиях решили и стандартный шрифт без фона выводить ...

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

Kakmyc
Offline
Зарегистрирован: 15.01.2018

intom33 пишет:

Пробывал пробелами стирать тот же результат ?? Вот код:

void loop() {
 t = rtc.getTime();
 tft.setCursor(15,50);
 tft.print("       ");
 tft.setCursor(15,50);
 tft.print(t.sec,DEC);
 delay(500);
}

Не пойму что не так ????

Так тебе не пробелы нужно ставить , а выводить старые значения , но цветом фона

intom33
Offline
Зарегистрирован: 26.11.2016

Не пойму как но сейчас буду пробывать.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

http://arduino.ru/forum/proekty/bortovoi-kompyuter-dlya-opel-zafira?page=36#comment-471039

Вот тут я выкладывал правленую библиотеку - с полной прорисовкой символов !

intom33
Offline
Зарегистрирован: 26.11.2016

Почему то не работает функция  tft.setTextColor(0x001F,0x07E0); цвет шрифта меняет а фон нет, хоть она и прописана в библиотеке Adafruit_GFX_Library 

void setTextColor(uint16_t c, uint16_t bg) {
    textcolor = c;
    textbgcolor = bg;
  } 

 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Без правок библиотека не трогает фон СОВСЕМ !!!

Kakmyc
Offline
Зарегистрирован: 15.01.2018

Komandir пишет:

Без правок библиотека не трогает фон СОВСЕМ !!!

А фон то зачем трогать ?
Цвет шрифта менять достаточно

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Kakmyc ТС спрашивает чего это setTextColor не меняет цвет фона. Он никак не поймёт что мы ему тут на пальцах объясняем ...

intom33 фон надо нарисовать заранее !

intom33
Offline
Зарегистрирован: 26.11.2016

Поменял библиотеку Adafruit-GFX-Library-master  на Adafruit_GFX_Library-1.7.5  с стандартным шрифтом работает все нормально и затирает предыдущие цифры но с сторонним шрифтом не работает, видно в других шрифтах нет фона.

Попробывал как вы посоветовали "А фон то зачем трогать ? Цвет шрифта менять достаточно" работает нормально но надо

вставлять delay(1000); 

void loop() {
 t = rtc.getTime();
 tft.setCursor(15,50);
 tft.setTextColor(ST77XX_GREEN);
 tft.print(t.sec,DEC);
  delay(1000);
 tft.setCursor(15,50);
 tft.setTextColor(ST7735_RED);
 tft.print(t.sec,DEC);
 }

А бес delay моргает ((

intom33
Offline
Зарегистрирован: 26.11.2016

Значит надо рисовать новый шрифт с фоном

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

А зачем секунды выводить иначе как раз в секунду ???

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

Полный шрифт с фоном занимает ГОРАЗДО больше места. Так же вывод и фона и символа отнимает очень много ресурсов у процессора.

intom33
Offline
Зарегистрирован: 26.11.2016

Но с delay идет задержка по другим функциям, разве что секунды вызывать по каким то прерываниям например библиотекой MsTimer2

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Достаточно просто периодически проверять тикнула секунда или нет. И только если тикнула, то обновлять информацию на дисплее.

intom33
Offline
Зарегистрирован: 26.11.2016

Спасибо Всем наверно так и буду делать вызывать секунды по таймеру.

Может кто подскажет часики с этим дисплеем но с выводом цифр а не циферблата