1.8 inç TFT Ekran ile Analog saat yapımı

Merhaba arkadaşlar,

Renkli tft ekran elime ulaştığından beri bu renkli ekranın neler yapabileceğini test ettim. Bu yazımda da sadece TFT ekran ile analog saat yapımını anlatacağım.

Bu projemizde kullanılan sadece ST7735 çipli renkli ekran gerisi programlama ile hallediliyor. Projemizin bağlantısını yaptıktan sonra programlama ile saatinizin her tarafını değiştirmenize imkan tanıyor . Renkleri değiştirerek daha farklı güzel görünümlü saatler yapabilirsiniz.

Bu proje deneme amaçlı yapılmıştır, projemizde normalde RTC modülüne ihtiyacımız var ama kullanılmadığından dolayı program ilk yüklenirken program bilgisayardan saat bilgisini girmektedir. Daha sonra eğer enerji kesilir ve sonra tekrar bağlanırsa saat ilk yüklenilen zamana dönecektir.

Bağlantı şekli

1.8 inç ST7735  NodeMCU ESP8266-12E
VCC 3.3 V
GND GND
CS D0
RESET D2
A0 D1
SDA D7
SCK D5
LED 3.3 V

GPIO6 ise butona bağlanmalıdır. Butona basıldığında saat dijital olarak görünür.

Bağlantımız şekildeki gibi olacak


//// arduino uno spi pinleri
///// MOSI:  11
///// MISO:  12
///// SCK:   13
 //// www.arduinom.org sitesinde yayinlanmistir.
// kütüphaneler
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_ST7735.h> 
 
// renkler
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF
#define DarkCyan        0x03EF
#define Olive           0x7BE0      
 
const byte pinSwitch1 = 6;  /// 6 numaralı pine bir adet buton bağlanmıştır
 
#define TFT_CS     16
#define TFT_RST    4  
#define TFT_DC     5

Adafruit_ST7735 tft = Adafruit_ST7735(TFT_CS,  TFT_DC, TFT_RST); 
int t=12;
uint16_t ccenterx,ccentery; //ekranın merkez noktalarının tutulduğu değişkenler
const uint16_t cradius = 63; //analog saatin çapı
const float scosConst = 0.0174532925;   //// 1 DERECE NİN radyan cinsinden karşılığı
float sx = 0, sy = 1, mx = 1, my = 0, hx = -1, hy = 0;
float sdeg=0, mdeg=0, hdeg=0;
uint16_t osx,osy,omx,omy,ohx,ohy;
uint16_t x0 = 0, x1 = 0, yy0 = 0, yy1 = 0;
uint32_t targetTime = 0;// 1 sn lik dilimi tutan değişken
uint8_t hh,mm,ss;  //zaman bilgilerinin tutulacağı değişken
boolean state = {false};
void drawClockFace(){
  tft.fillRect(ccenterx-30, ccentery, ccenterx+30,ccentery, BLACK);
  tft.drawCircle(ccenterx, ccentery, cradius, YELLOW);   //// MERKEZ NOKTALARI TFT NİN ORTASI OLARAK BELİRLENEN ÇAPI 63 OLAN MAVİ RENKLİ DAİRE ÇİİZLİYOR

  t=12;
 
  //// saatin çizgileri ve ilgili yazılar yazılıyor
  for(int i = 0; i<360; i+= 30) { sx = cos((i-90)*scosConst); sy = sin((i-90)*scosConst); x0 = sx*(cradius-4)+ccenterx; yy0 = sy*(cradius-4)+ccentery; x1 = sx*(cradius-11)+ccenterx; yy1 = sy*(cradius-11)+ccentery; tft.drawLine(x0, yy0, x1, yy1, BLUE); tft.setCursor(x1,yy1-3); tft.setTextSize(1); tft.setTextColor(DarkCyan); tft.print(t); t++; if(t>12) t = 1;
 
  }
}
 
static uint8_t conv2d(const char* p) {   /// rtc kodu
  uint8_t v = 0;
  if ('0' <= *p && *p <= '9') v = *p - '0'; return 10 * v + *++p - '0'; } void setup(void) { tft.initR(INITR_BLACKTAB); //ST7735 Ekranı aktif eder. tft.fillScreen(ST7735_BLACK); tft.setTextColor(WHITE, BLACK); ccenterx = tft.width()/2; ccentery = tft.height()/2; osx = ccenterx; osy = ccentery; omx = ccenterx; omy = ccentery; ohx = ccenterx; ohy = ccentery; hh = conv2d(__TIME__); mm = conv2d(__TIME__+3); ss = conv2d(__TIME__+6); targetTime = millis() + 1000; } void drawClockHands(uint8_t h,uint8_t m,uint8_t s){ // pointerın sn için 1 derece aralıklarla, dakika için 6.1 derece aralıklarla, saat için ise 32.7 derece aralıklarla hareket etmei sağlanır sdeg = s * 6; // 0-59 -> 0-354
  mdeg = m * 6 + sdeg * 0.01666667;  // 0-59 -> 0-360 - includes seconds
  hdeg = h * 30 + mdeg * 0.0833333;  // 0-11 -> 0-360 - includes minutes and seconds
  hx = cos((hdeg-90)*scosConst);
  hy = sin((hdeg-90)*scosConst);
  mx = cos((mdeg-90)*scosConst);
  my = sin((mdeg-90)*scosConst);
  sx = cos((sdeg-90)*scosConst);
  sy = sin((sdeg-90)*scosConst);
 
  // pointerın bir önceki konumu silinr
  tft.drawLine(ohx, ohy, ccenterx+1, ccentery+1, BLACK);
  tft.drawLine(omx, omy, ccenterx+1, ccentery+1, BLACK);
  tft.drawLine(osx, osy, ccenterx+1, ccentery+1, BLACK);
  // pointerın yeni konumu çizilir
  tft.drawLine(hx*(cradius-28)+ccenterx+1, hy*(cradius-28)+ccentery+1, ccenterx+1, ccentery+1, WHITE);
  tft.drawLine(mx*(cradius-17)+ccenterx+1, my*(cradius-17)+ccentery+1, ccenterx+1, ccentery+1, WHITE);
  tft.drawLine(sx*(cradius-14)+ccenterx+1, sy*(cradius-14)+ccentery+1, ccenterx+1, ccentery+1, RED);
  tft.fillCircle(ccenterx+1, ccentery+1, 3, RED);
 
  // x ve y koordinatları yeni değerleri ile gncellenir
  osx = sx*(cradius-14)+ccenterx+1;
  osy = sy*(cradius-14)+ccentery+1;
  omx = mx*(cradius-17)+ccenterx+1;
  omy = my*(cradius-17)+ccentery+1;
  ohx = hx*(cradius-28)+ccenterx+1;
  ohy = hy*(cradius-28)+ccentery+1;
}
 
void loop() {
 
  if (digitalRead(pinSwitch1)) /// butona her basıldığında ekran görüntüüs değişir
  {
    if(state) state = false;
    else state = true;
  }
 
  if(state) dijitalGosterge(hh,mm,ss);
 
  else{
 
    if (targetTime < millis()) { targetTime = millis()+1000; ss++; if (ss == 60) { ss = 0; mm++; if(mm > 59) {
          mm = 0;
          hh++;
          if (hh > 23) hh = 0;
        }
      }
 
      drawClockFace();
      drawClockHands(hh,mm,ss);
    }
  }
 
}
 
void dijitalGosterge(uint8_t h1, uint8_t m1, uint8_t s1)
{
  if (targetTime < millis()) { targetTime = millis()+1000; ss++; if (ss == 60) { ss = 0; mm++; if(mm > 59) {
          mm = 0;
          hh++;
          if (hh > 23) hh = 0;
        }
      }
 
      tft.fillScreen(BLACK);
      tft.setTextColor(Olive);
      tft.setCursor(ccenterx-30,ccentery);
      tft.setTextSize(2);
      tft.print(h1);
      tft.print(" : ");
 
      if(m1<10)
      {
        tft.print("0");
      }
      tft.print(m1);
    }
}

Bir Cevap Yazın

Time limit is exhausted. Please reload CAPTCHA.