Dzień dobry bardzo wszystkim.
Od kilku dni próbuję zrozumieć jak rozmawiać z wyświetlaczem TFT.
Egzemplarz jaki posiadam to GMT020-02 VER 1.1 2.0" podłączony pod Arduino Duo.
Jako, że nie lubię pisać bezsensownego kodu założyłem sobie za projekt stworzyć stoper.
Kod jaki napisałem prezentuje się następująco:
Kod:
#include <Adafruit_GFX.h>
#include <Adafruit_ST7789.h>
#include <SPI.h>
#define TFT_CS 10
#define TFT_RST 9
#define TFT_DC 8
byte stan = 0;
byte minuty = 30;
byte sekundy = 00;
unsigned long czasSekundy = 0;
Adafruit_ST7789 tft = Adafruit_ST7789(TFT_CS, TFT_DC, TFT_RST);
void setup(void) {
pinMode(7 ,INPUT_PULLUP);
pinMode(4 ,INPUT_PULLUP);
pinMode(2 ,INPUT_PULLUP);
tft.init(240, 320);
tft.setRotation(1);
tft.fillScreen(ST77XX_INVOFF);
}
void loop() {
ekranPoczatkowy();
menuPoczatkowe();
przyciskCentralny();
odliczanie();
}
void ekranPoczatkowy() {
if(stan == 0){
tft.setTextSize(5);
tft.setTextColor(ST77XX_RED);
tft.setCursor(45, 30);
tft.println("Ruszamy?");
}
}
void menuPoczatkowe() {
if(stan == 0){
tft.setTextSize(2);
tft.setCursor(5, 218);
tft.setTextColor(ST77XX_WHITE);
tft.println("<STAT");
tft.setTextSize(5);
tft.setCursor(130, 200);
tft.setTextColor(ST77XX_RED);
tft.println("GO!");
tft.setTextSize(2);
tft.setCursor(265, 218);
tft.setTextColor(ST77XX_WHITE);
tft.println("SET>");
}
}
void przyciskCentralny() {
if(digitalRead(4) == LOW) {
if(stan == 2) {
stan = 0;
}
if(stan == 1) {
tft.fillScreen(ST77XX_INVOFF);
tft.setTextSize(5);
tft.setTextColor(ST77XX_RED);
tft.setCursor(60, 30);
tft.println("Przerwa");
tft.setTextSize(5);
tft.setCursor(90, 200);
tft.setTextColor(ST77XX_RED);
tft.println("Wznow");
tft.setTextSize(2);
tft.setCursor(265, 218);
tft.setTextColor(ST77XX_WHITE);
tft.println("END>");
stan = 2;
}
if(stan == 0) {
tft.fillScreen(ST77XX_INVOFF);
tft.fillRoundRect(5, 5, 310, 90, 0, ST77XX_BLACK);
tft.fillRoundRect(10, 10, 120, 80, 4, ST77XX_INVOFF);
tft.fillRoundRect(190, 10, 120, 80, 4, ST77XX_INVOFF);
tft.setTextSize(5);
tft.setCursor(102, 200);
tft.setTextColor(ST77XX_RED);
tft.println("STOP");
stan = 1;
}
}
}
void odliczanie() {
if(stan == 1) {
tft.setTextSize(10);
tft.setTextColor(ST77XX_WHITE);
tft.setCursor(15, 15);
if(minuty < 10) { tft.print(F("0")); }
tft.print(minuty);
tft.setCursor(135, 15);
tft.setTextColor(ST77XX_WHITE);
tft.println(":");
tft.setTextColor(ST77XX_WHITE);
tft.setCursor(195, 15);
if(sekundy < 10) { tft.print(F("0")); }
tft.println(sekundy);
if(minuty > 0) {
if(sekundy <= 0) {
sekundy = 59;
minuty--;
tft.fillRoundRect(10, 10, 120, 80, 4, ST77XX_INVOFF);
tft.fillRoundRect(190, 10, 120, 80, 4, ST77XX_INVOFF);
} else {
if(czasSekundy == 0){
czasSekundy = millis();
} else {
if(millis() >= (czasSekundy + 1000)){
czasSekundy = 0;
sekundy--;
tft.fillRoundRect(190, 10, 120, 80, 4, ST77XX_INVOFF);
}
}
}
} else {
if(sekundy > 0) {
sekundy--;
tft.fillRoundRect(190, 10, 120, 80, 4, ST77XX_INVOFF);
} else {
tft.fillRoundRect(5, 5, 310, 90, 0, ST77XX_BLACK);
stan = 0;
}
}
}
}
Po wgraniu niby wszystko działa, niby stoper odmierza czas, ale co pewną randomową chwilę zaczyna rysować niewłaściwie. Na pewnym etapie chciałem dodać miganie dwukropkiem za pomocą funkcji millis() jednak wtedy pojawił się problem rysowania liczb niewłaściwym i nigdzie nie zdefiniowanym kolorem. Długo z tym walczyłem i finalnie się poddałem przez co powyższy kod pozbawiony jest tej funkcji. Jednak nachodzenie na siebie znaków to już za duża abstrakcja. Podsyłam wideo pokazujące problem (problem od 1:13):
Czy są jakieś funkcje dla wyświetlaczy, których nie użyłem i stąd problem?
Ponadto czy są jakieś funkcje dzięki którym mogę wyłączyć wyświetlacz lub samo podświetlenie, tak aby później bez problemu móc go wybudzić? Albo jakaś funkcja czyszcząca ekran zamiast zamalowywania go? Definiowanie ciągle rysowania kwadratów w tle jest w mojej ocenie słabe bo dużo pamięci na to idzie - może powinienem wykonywać to czymś innym?