Arduino ile TFT LCD Ekran Kullanımı ve Grafik Performans Testi

👤 Yazar: ozcan 📅 Tarih: 11.07.2026 14:10 👁️ Görüntüleme: 34

Arduino ile TFT LCD Ekran Kullanımı ve Grafik Performans Testi (Benchmark)

Projelerimizde sabit karakterli 16x2 LCD ekranları veya küçük OLED ekranları kullanmayı öğrendik. Şimdi ise sırada Arduino projelerinize renkli ve görsel bir çağ atlatacak olan TFT LCD Ekran teknolojisi var! Bu rehberde, Arduino Uno üzerine doğrudan oturan (Shield) 8-bit geniş renkli bir TFT ekranı kodlayacağız. Ekranımızın sürücü entegresini (Chipset) otomatik tespit eden ve ardından tüm grafik sınırlarını (yazı, daire, üçgen, ızgara) test eden muazzam bir performans testi uygulaması gerçekleştireceğiz.

Gerekli Malzemeler

  • Arduino Uno
  • Arduino Uno Uyumlu TFT LCD Shield Ekran (ILI9325 / ILI9328 Sürücülü)
  • USB Bağlantı Kablosu

1. TFT LCD Shield Montajı ve Pin Düzeni

Bu projenin en güzel yanı karmaşık kablo bağlantılarıyla uğraşmamanızdır! Kullandığımız ekran bir "Shield" yani kalkan olduğu için, Arduino Uno'nun üzerine pinler tam denk gelecek şekilde doğrudan oturtulur. Ekranın kullandığı kontrol pinlerinin dağılımı şu şekildedir:

arduino tft lcd montajarduino uno ili9325 tft lcdili 9325 tft lcd arduino uno için

TFT LCD Kontrol Pini Arduino Uno Analog Pini Görevi
LCD_RD A0 Read (Ekrandan veri okuma kontrolü)
LCD_WR A1 Write (Ekrana veri yazma kontrolü)
LCD_CD A2 Command / Data (Komut veya veri seçimi)
LCD_CS A3 Chip Select (Ekran donanımını aktif etme)
LCD_RESET A4 Reset (Ekranı donanımsal sıfırlama)

2. Arduino Kod Blokları

Aşağıdaki performans test kodunu doğrudan kopyalayarak Arduino IDE editörünüze yapıştırabilirsiniz. Projenin çalışabilmesi için TFTLCD.h kütüphanesinin kütüphane yöneticinizden eklenmiş olduğundan emin olun.

#include "TFTLCD.h"

// TFT LCD Kontrol Pin Tanımlamaları
#define LCD_CS A3    // Chip Select (Çip Seçimi)
#define LCD_CD A2    // Command/Data (Komut/Veri Seçimi)
#define LCD_WR A1    // Write (Yazma Kontrolü)
#define LCD_RD A0    // Read (Okuma Kontrolü)
#define LCD_RESET A4 // Reset (Sıfırlama Pini)

// 16-bit Renk Kodları (Renk Tanımlamaları)
#define BLACK   0x0000
#define BLUE    0x001F
#define RED     0xF800
#define GREEN   0x07E0
#define CYAN    0x07FF
#define MAGENTA 0xF81F
#define YELLOW  0xFFE0
#define WHITE   0xFFFF

TFTLCD tft(LCD_CS, LCD_CD, LCD_WR, LCD_RD, LCD_RESET);

void setup(void) {
  Serial.begin(9600);
  Serial.println("8-Bit LCD Testi Baslatildi!");
  
  tft.reset();
  
  // Ekran sürücü entegresini kontrol etme (Chipset Tespiti)
  uint16_t identifier = tft.readRegister(0x0);
  if (identifier == 0x9325) {
    Serial.println("ILI9325 surucusu bulundu.");
  } else if (identifier == 0x9328) {
    Serial.println("ILI9328 surucusu bulundu.");
  } else {
    Serial.print("Bilinmeyen ekran surucusu kodu: ");
    Serial.println(identifier, HEX);
    while (1); // Sürücü eşleşmezse güvenli kalmak için programı burada durdur
  }  
 
  tft.initDisplay();
  
  // Sırasıyla tüm grafik test fonksiyonlarını çalıştır
  testYazi(RED);
  delay(2000);
  
  testCizgiler(CYAN);
  delay(500);
  
  testHizliCizgiler(RED, BLUE);
  delay(500);
  
  testDikdortgenler(GREEN);
  delay(500);
  
  testDoluDikdortgenler(YELLOW, MAGENTA);
  delay(500);
  
  tft.fillScreen(BLACK);
  testDoluDaireler(10, MAGENTA);
  testIciBosDaireler(10, WHITE);
  delay(500); 
  
  testUcgenler();
  delay(500); 
  
  testDoluUcgenler();
  delay(500); 
  
  testKoseYuvarlatilmisDikdortgen();
  delay(500); 
  
  testDoluKoseYuvarlatilmisDikdortgen();
}

void loop(void) {
  // Ekranı 4 farklı yöne (0, 90, 180, 270 derece) döndürerek yazı testini tekrarla
  for (uint8_t rotation = 0; rotation < 4; rotation++) {
    tft.setRotation(rotation); 
    testYazi(RED);
    delay(1000);
  }
}

// 1. Yazı Performans Testi
void testYazi(uint16_t color) {
  tft.fillScreen(BLACK);
  tft.setCursor(0, 20);
  tft.setTextColor(color);
  
  tft.setTextSize(1);
  tft.println("Merhaba Dunya!");
  tft.setTextSize(2);
  tft.println(1234.56);
  tft.setTextSize(3);
  tft.println(0xDEADBEEF, HEX);
}

// 2. Karmaşık Çizgi Testi (Köşelerden merkezlere çizgiler çeker)
void testCizgiler(uint16_t color) {
  tft.fillScreen(BLACK);
  uint16_t w = tft.width();
  uint16_t h = tft.height();

  for (uint16_t x = 0; x < w; x += 6) tft.drawLine(0, 0, x, h - 1, color);
  for (uint16_t y = 0; y < h; y += 6) tft.drawLine(0, 0, w - 1, y, color);
  
  tft.fillScreen(BLACK);
  for (uint16_t x = 0; x < w; x += 6) tft.drawLine(w - 1, 0, x, h - 1, color);
  for (uint16_t y = 0; y < h; y += 6) tft.drawLine(w - 1, 0, 0, y, color);
  
  tft.fillScreen(BLACK);
  for (uint16_t x = 0; x < w; x += 6) tft.drawLine(0, h - 1, x, 0, color);
  for (uint16_t y = 0; y < h; y += 6) tft.drawLine(0, h - 1, w - 1, y, color);

  tft.fillScreen(BLACK);
  for (uint16_t x = 0; x < w; x += 6) tft.drawLine(w - 1, h - 1, x, 0, color);
  for (uint16_t y = 0; y < h; y += 6) tft.drawLine(w - 1, h - 1, 0, y, color);
}

// 3. Yatay ve Dikey Hızlı Çizgi Testi (Izgara Tasarımı)
void testHizliCizgiler(uint16_t color1, uint16_t color2) {
  tft.fillScreen(BLACK);
  for (uint16_t y = 0; y < tft.height(); y += 5) tft.drawHorizontalLine(0, y, tft.width(), color1);
  for (uint16_t x = 0; x < tft.width(); x += 5)  tft.drawVerticalLine(x, 0, tft.height(), color2);
}

// 4. İçi Boş Dikdörtgen Testi (İç içe geçen kutular)
void testDikdortgenler(uint16_t color) {
  tft.fillScreen(BLACK);
  for (uint16_t x = 0; x < tft.width(); x += 6) {
    tft.drawRect(tft.width()/2 - x/2, tft.height()/2 - x/2, x, x, color);
  }
}

// 5. İçi Dolu Dikdörtgen Testi
void testDoluDikdortgenler(uint16_t color1, uint16_t color2) {
  tft.fillScreen(BLACK);
  for (uint16_t x = tft.width() - 1; x > 6; x -= 6) {
    tft.fillRect(tft.width()/2 - x/2, tft.height()/2 - x/2, x, x, color1);
    tft.drawRect(tft.width()/2 - x/2, tft.height()/2 - x/2, x, x, color2);
  }
}

// 6. İçi Dolu Daire Testi (Ekranı dairelerle kaplar)
void testDoluDaireler(uint8_t radius, uint16_t color) {
  for (uint16_t x = radius; x < tft.width(); x += radius * 2) {
    for (uint16_t y = radius; y < tft.height(); y += radius * 2) {
      tft.fillCircle(x, y, radius, color);
    }
  }  
}

// 7. İçi Boş Daire Testi
void testIciBosDaireler(uint8_t radius, uint16_t color) {
  for (uint16_t x = 0; x < tft.width() + radius; x += radius * 2) {
    for (uint16_t y = 0; y < tft.height() + radius; y += radius * 2) {
      tft.drawCircle(x, y, radius, color);
    }
  }  
}

// 8. İçi Boş Üçgen Testi
void testUcgenler() {
  tft.fillScreen(BLACK);
  for (uint16_t i = 0; i < tft.width()/2; i += 5) {
    tft.drawTriangle(tft.width()/2, tft.height()/2 - i,
                     tft.width()/2 - i, tft.height()/2 + i,
                     tft.width()/2 + i, tft.height()/2 + i, tft.Color565(0, 0, i));
  }
}

// 9. İçi Dolu Üçgen Testi
void testDoluUcgenler() {
  tft.fillScreen(BLACK);
  for (uint16_t i = tft.width()/2; i > 10; i -= 5) {
    tft.fillTriangle(tft.width()/2, tft.height()/2 - i,
                     tft.width()/2 - i, tft.height()/2 + i,
                     tft.width()/2 + i, tft.height()/2 + i, tft.Color565(0, i, i));
    tft.drawTriangle(tft.width()/2, tft.height()/2 - i,
                     tft.width()/2 - i, tft.height()/2 + i,
                     tft.width()/2 + i, tft.height()/2 + i, tft.Color565(i, i, 0));    
  }
}

// 10. Köşeleri Yuvarlatılmış İçi Boş Dikdörtgen Testi
void testKoseYuvarlatilmisDikdortgen() {
  tft.fillScreen(BLACK);
  for (uint16_t x = 0; x < tft.width(); x += 6) {
    tft.drawRoundRect(tft.width()/2 - x/2, tft.height()/2 - x/2, x, x, x/8, tft.Color565(x, 0, 0));
  }
}

// 11. Köşeleri Yuvarlatılmış İçi Dolu Dikdörtgen Testi
void testDoluKoseYuvarlatilmisDikdortgen() {
  tft.fillScreen(BLACK);
  for (uint16_t x = tft.width(); x > 20; x -= 6) {
    tft.fillRoundRect(tft.width()/2 - x/2, tft.height()/2 - x/2, x, x, x/8, tft.Color565(0, x, 0));
  }
}

Projenin Önemli Detayları ve Algoritma Analizi

  • Otomatik Chipset Kontrolü: Kodun setup bölümünde yer alan tft.readRegister(0x0) komutu, ekrandaki entegre işlemciye kimlik numarasını sorar. Eğer ekranınız orijinal bir ILI9325 veya ILI9328 modeliyse onay verip testi başlatır; aksi halde hata vererek güvenli modda bekler.
  • Dinamik Renk Üretimi: Projedeki renkler standart RGB formatında değil, 16-bitlik (565 formatı) özel HEX kodlarıyla belirlenir. Kodun alt kısımlarında gördüğünüz tft.Color565(r, g, b) fonksiyonu, döngüdeki matematiksel değerleri alarak ekranda kusursuz renk geçişleri (Gradient efektleri) oluşturur.
  • Ekran Döndürme (Rotation): loop() fonksiyonu içerisindeki tft.setRotation(rotation) komutu ekranı sırasıyla 0, 90, 180 ve 270 derece döndürür. Bu özellik, yapacağınız projelerde ekranı yatay veya dikey kullanabilmenize olanak tanır.

Sık Karşılaşılan Sorunlar ve Çözümleri

1. Ekran Sadece Beyaz Yanıyor ve Seri Portta "Bilinmeyen ekran surucusu" Hatası Var

Çözüm: Piyasada birbirine benzeyen onlarca farklı TFT ekran çipseti (Örn: ST7781, SPFD5408, ILI9341) bulunur. Eğer ekranınızın sürücü kodu tanımlı olanların dışındaysa, seri port ekranında yazan HEX kodunu (Örneğin: 0x9341) koddaki if (identifier == 0x9325) kontrol bloklarına yeni bir else if olarak ekleyebilir ya da kütüphanenizin o çipseti destekleyip desteklemediğini kontrol edebilirsiniz.

2. Renkler Çok Soluk Veya Birbirine Karışmış Durumda

Çözüm: TFT shield'lar Arduino Uno'nun tüm dijital ve analog pinlerine tam oturmalıdır. Eğer pinlerden biri tam temas etmiyorsa 8-bitlik renk verisi eksik iletilir ve renkler sapıtır. Ekranı bastırarak pinlerin yuvaya tam yerleştiğinden emin olun.


Gerekli dosyalar: TFTLCD.zip

💬 Yorumlar

Henüz yorum yapılmamış. İlk yorumu siz yapın!

Bir Yorum Bırakın

Güvenlik Kontrolü:

Yenidir.com
↑ Sayfa Başı
📞 İletişim ✉ E-Posta Gönder 🟥 YouTube
© 2026 Yenidir.com
Yenidir CMS V0.1