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.

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);
}
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:
tft.fillRect(X_Baslangic, Y_Baslangic, Genislik, Yukseklik);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.
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.
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.
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.
map() fonksiyonunun hedef parametre sınırlarını takas ederek yazılımsal bir ayna efekti oluşturabiliriz.
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
Henüz yorum yapılmamış. İlk yorumu siz yapın!