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.
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:



| 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) |
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));
}
}
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.tft.Color565(r, g, b) fonksiyonu, döngüdeki matematiksel değerleri alarak ekranda kusursuz renk geçişleri (Gradient efektleri) oluşturur.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.Çö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.
Çö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
Henüz yorum yapılmamış. İlk yorumu siz yapın!