Arduino Uno ile TFT LCD Dokunmatik Buton (Arayüz Kontrolü) Uygulaması

👤 Yazar: ozcan 📅 Tarih: 13.07.2026 08:55 👁️ Görüntüleme: 40

TFT LCD Dokunmatik Buton (Arayüz Kontrolü) Uygulaması

Ekran üzerine çizim yapmaktan daha önemlisi, dokunmatik paneli projelerimizi kontrol edebileceğimiz dinamik butonlara dönüştürmektir. TFT LCD ekranlarda dokunmatik hassasiyeti analog pinlerin paylaşımlı kullanılmasından ötürü kritik bir yazılımsal mimari gerektirir. Aşağıdaki kod, ekranda iki adet büyük kontrol butonu oluşturur, dokunma koordinatlarını haritalandırır ve basılan butona göre donanımsal bir eylemi tetikler.


dokunmatik buton kontrolü

Kritik Geliştirme Notu: Orijinal boyama kodundaki karmaşık renk temizleme algoritmaları yerine, burada koordinat bazlı sınır kontrolü (X ve Y düzleminde geometri testi) yapılmıştır. Bu yaklaşım, kararlı endüstriyel arayüzlerin temelini oluşturur.

Dokunmatik Arayüz Kontrol Kod Bloğu

Arduino Uno ve uyumlu TFT Shield modülleri için tasarlanmış, basılan butona göre ekranda durum bildirimi yapan ve dahili LED'i kontrol eden tam fonksiyonel kod yapısı:

#include "TFTLCD.h"
#include "TouchScreen.h"

// Dokunmatik Ekran Donanımsal Pinleri
#define YP A1
#define XM A2
#define YM 7
#define XP 6

// Dokunmatik Panel Kalibrasyon Sınırları (Standart Değerler)
#define TS_MINX 150
#define TS_MINY 120
#define TS_MAXX 920
#define TS_MAXY 940

TouchScreen ts = TouchScreen(XP, YP, XM, YM, 300);

// TFT LCD Kontrol Pinleri
#define LCD_CS A3
#define LCD_CD A2
#define LCD_WR A1
#define LCD_RD A0
#define LCD_RESET A4

// 16-bit Renk Paleti
#define BLACK 0x0000
#define BLUE 0x001F
#define RED 0xF800
#define GREEN 0x07E0
#define WHITE 0xFFFF
#define GRAY 0x7BEF

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

// Kontrol Edilecek Donanım Pini
const int tetikPin = 13;

void setup(void) {
  Serial.begin(9600);
  pinMode(tetikPin, OUTPUT);

  tft.reset();
  tft.initDisplay();

  // Ekran yönünü belirliyoruz
  tft.setRotation(0);

  // Arayüzü Çizdiriyoruz
  arayuzCiz();
}

#define MINPRESSURE 10
#define MAXPRESSURE 1000

void loop() {
  // Dokunmatik panelden koordinat çekiyoruz
  TSPoint p = ts.getPoint();

  // Paylaşımlı pinleri tekrar ekran kontrolü için çıkış yapıyoruz
  pinMode(XM, OUTPUT);
  pinMode(YP, OUTPUT);

  if (p.z > MINPRESSURE && p.z < MAXPRESSURE) {

    int mappedX = map(p.x, TS_MINX, TS_MAXX, 0, tft.width());
    int mappedY = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());

    // --- ROTATION 2 İÇİN YENİ DOKUNMATİK EŞLEŞTİRME ---
    // Sadece Y eksenini ters çeviriyoruz, X eksenini düz bırakıyoruz:
    int x = mappedX;
    int y = tft.height() - mappedY;

    // Seri monitörden koordinat takibi yapabilmen için:
    Serial.print("Dokunma X: ");
    Serial.print(x);
    Serial.print(" | Y: ");
    Serial.println(y);

    // --- SOL BUTON KONTROLÜ (LED AÇ) ---
    // X: 10 - 110 | Y: 150 - 210
    if (x > 10 && x < 110 && y > 150 && y < 210) {
      digitalWrite(tetikPin, HIGH);


      tft.fillRect(10, 80, 230, 40, BLACK);
      tft.drawString(20, 90, "DURUM: LED ACIK", GREEN, 2);

      delay(300);  // Çoklu tetiklemeyi önlemek için gecikme
    }

    // --- SAĞ BUTON KONTROLÜ (LED KAPAT) ---
    // X: 130 - 230 | Y: 150 - 210
    if (x > 130 && x < 230 && y > 150 && y < 210) {
      digitalWrite(tetikPin, LOW);

      tft.fillRect(10, 80, 220, 40, BLACK);
      tft.drawString(20, 90, "DURUM: LED KAPALI", RED, 2);

      delay(300);
    }
  }
}

void arayuzCiz() {
  tft.fillScreen(BLACK);
  // Üst Başlık Alanını y=0 yerine y=2 koordinatından başlatıyoruz (Sınır taşmasını önlemek için)
  tft.fillRect(0, 2, tft.width(), 38, BLUE);
  tft.drawString(25, 14, "AKILLI EV ARAYUZU", WHITE, 2); 

  // Varsayılan Durum Bilgisi
  tft.drawString(20, 90, "DURUM: BEKLEMEDE", WHITE, 2);

  // LED AÇ Butonu (Yeşil)
  tft.fillRect(10, 150, 100, 60, GREEN);
  tft.drawRect(10, 150, 100, 60, WHITE);
  tft.drawString(40, 172, "AC", BLACK, 2);

  // LED KAPAT Butonu (Kırmızı)
  tft.fillRect(130, 150, 100, 60, RED);
  tft.drawRect(130, 150, 100, 60, WHITE);
  tft.drawString(145, 172, "KAPAT", WHITE, 2);
}

Yazılımsal Mimari Mantığı: Buton Alanı Nasıl Hesaplanır?

Dokunmatik buton mantığında en çok karıştırılan durum, ekrana çizilen kutu ile dokunulan koordinatın nasıl eşleştirileceğidir. Tasarım yaparken şu formül izlenir:

  • Kutu Çizimi: tft.fillRect(X_Baslangic, Y_Baslangic, Genislik, Yukseklik);
  • Dokunma Sorgusu: if (p.x > X_Baslangic && p.x < (X_Baslangic + Genislik) && p.y > Y_Baslangic && p.y < (Y_Baslangic + Yukseklik))

Yukarıdaki kod bloğunda Yeşil butonumuz 10 koordinatında başlayıp 100 piksel genişliğinde olduğu için, X ekseninde 10 ile 110 arasındaki tüm dokunma hamlelerini başarıyla yakalar.


Gelişmiş Dokunmatik Optimizasyonları ve İpuçları

Dokunma Kararsızlığını Engelleme (Debounce Ritmi)

Dokunmatik paneller mekanik yapıları gereği tek bir dokunuşta işlemciye onlarca ardışık sinyal gönderebilir. Bu durum butonun çılgınlar gibi açılıp kapanmasına (titreme efektine) yol açar. Kod bloğumuzun içerisine yerleştirdiğimiz delay(200); ifadesi, işlemcinin dokunma eylemini onayladıktan sonra kısa bir süre dinlenmesini sağlar. Daha profesyonel projelerde bu bekleme süresi millis() zamanlayıcı mimarisiyle kurulabilir.

Koordinat Eksen Kayması ve Kalibrasyon Çözümü

Ekranı yan (Landscape) veya dik (Portrait) moduna aldığınızda dokunmatik eksenlerin yönü değişebilir. Eğer butonlara bastığınızda bambaşka yerler tetikleniyorsa, kodun başındaki map() fonksiyonunun parametrelerinin yerini değiştirmeniz gerekir. Örneğin X eksenindeki tersliği düzeltmek için minimum ve maksimum kalibrasyon değerlerinin sırasını (TS_MINX ve TS_MAXX) ters yazarak aynalama etkisi yaratabilirsiniz.

Dokunmatik Ekrandaki Ayna (Ters Görüntü) Sorununun Çözümü

TFT LCD projelerinde en sık karşılaşılan hatalardan biri, ekrandaki butonların görüntüsü ile dokunmatiğin algıladığı eksenin birbirine göre aynalanmış (sağ-sol veya üst-alt tersi) olmasıdır. Örneğin siz ekranın solundaki butona basarken, işlemci sağdaki butona basıldığını sanabilir. Bu durum donanımsal bir arıza değil, ekran kütüphanesi ile dokunmatik panel kütüphanesinin başlangıç noktalarının (orijin) uyuşmamasından kaynaklanır.

Pratik Çözüm Mantığı: Sorunu çözmek için kabloları değiştirmeye veya kütüphane dosyalarını kurcalamaya gerek yoktur. Dokunmatik koordinatlarını piksellere dönüştürdüğümüz map() fonksiyonunun hedef parametre sınırlarını takas ederek yazılımsal bir ayna efekti oluşturabiliriz.

Kod İçerisinde Yapılacak Güncelleme

Mevcut kodunuzun loop() fonksiyonu içerisindeki map() satırlarını, ekranınızdaki tersliğin yönüne göre aşağıdaki gibi revize etmeniz sorunu tamamen ortadan kaldıracaktır:

Eğer sağ-sol ekseninde (X ekseninde) aynadaki gibi bir terslik varsa:

// Orijinal satır: p.x = map(p.x, TS_MINX, TS_MAXX, 0, tft.width());
// Güncellenen satır (0 ile tft.width() yer değiştirdi):
p.x = map(p.x, TS_MINX, TS_MAXX, tft.width(), 0);

Eğer üst-alt ekseninde (Y ekseninde) bir terslik varsa:

// Orijinal satır: p.y = map(p.y, TS_MINY, TS_MAXY, 0, tft.height());
// Güncellenen satır (0 ile tft.height() yer değiştirdi):
p.y = map(p.y, TS_MINY, TS_MAXY, tft.height(), 0);

Bu ufak matematiksel yer değişimi sayesinde, dokunmatik panelden gelen ters koordinat grafiği tam tersi bir düzleme katlanarak ekran pikselleriyle yüzde yüz simetrik ve kararlı bir şekilde çalışmaya başlayacaktır.


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