03
Eyl
2020

Arduino ile ST7735 1.8″ TFT LCD kullanımı

ST7735; Sitronics adlı Rus firmasının geliştirdiği bir kontrol çipidir ve bu çipi kullanan ST7735 LCD modülleri oldukça uygun fiyata temin edilebilmektedir. ST7735, SPI seri haberleşme arayüzü ile çalışır. Ekran 160 satır ve 128 sütundan oluşmaktadır ve 16bit renk derinliğine sahiptir.

ST7735 3.3Volt ile çalışır. Bu nedenle 5V Arduino modeli kullanılıyorsa, gerilimin 3.3Volt’ a düşürülmesi gerekmektedir. Bunun için 5 adet 1K direnç kullanmak yeterli olacaktır.

Malzemeler

  • 1 adet Arduino
  • 1 adet ST7735 1.8″ TFT LCD
  • 5 adet 1K direnç

Bağlantı şeması

ST7735 pin adıST7735 alternatif pin adıArduino bağlantı pini
GNDGNDGND
VCCVDD3.3V
SCLSCLK13 (1K direnç ile)
SDAMOSI11 (1K direnç ile)
RSTReset8 (1K direnç ile)
DCA09 (1K direnç ile)
CSCS10 (1K direnç ile)
BLKLed3.3V

ST7735 1.8″ LCD modellerinin bağlantı pinlerinin yeri farklılık gösterebilir. Bu yüzden bağlantı yaparken yukarıdaki tabloya uygun olarak yapınız.

Kaynak kod

ST7735 TFT LCD’ yi çalıştırmak için Adafruit_GFX, Adafruit_ST7735 ve SPI kütüphaneleri gerekmektedir. Kütüphaneleri aşağıdaki linklere tıklayarak indirebilirsiniz.

Adafruit_GFX.h indir

Adafruit_ST7735.h indir

SPI.h indir

Arduino ile ekranın iletişim kurması için kütüphanelerin çağırılıp, ekranın pin numaralarının Arduino’ ya bildirilmesi gerekmektedir. Bu işlem aşağıdaki kod satırları ile yapılabilir.

int sclk = 13;
int mosi = 11;
int cs = 10;
int dc = 9;
int rst = 8;

#include <Adafruit_GFX.h> // grafik kütüphanesi
#include <Adafruit_ST7735.h> // donanım kütüphanesi
#include <SPI.h>

Adafruit_ST7735 tft = Adafruit_ST7735 (cs, dc, rst);

void setup() {
  Serial.begin (9600); 
  tft.initR (INITR_BLACKTAB);
  Serial.println ("TFT bağlandı");
}

void loop() {
   delay(500); //Ekranın tazelenmesi için bekleme süresi
}

Yukarıdaki kod çalıştırıldığında ekranda herhangi bir bildirim görünmeyecektir. Ancak seri porttan “TFT bağlandı” yazısı alındıysa LCD doğru bir şekilde bağlanmış demektir. Burada tft adında bir ST7735 nesnesi tanımlanmıştır ve bundan sonraki kodlar tft nesnesi üzerinden ilerleyecektir.

Bir pikselin rengini değiştirme

Ekranda herhangi bir pikseli istenen renge boyamak için aşağıdaki fonksiyon kullanılır.

void drawPixel(uint16_t x, uint16_t y, uint16_t color);

Bu fonksiyonun parametreleri;
uint16_t x: Pikselin x koordinatındaki konumu (hangi sütunda?)
uint16_t y: Pikselin y koordinatındaki konumu (hangi satırda?)
uint16_t color: Pikselin boyanacağı renk kodu

Örneğin 20. sütun ve 80. satırdaki pikseli yeşile boyamak istersek loop fonksiyonunun içine

tft.drawPixel(20, 80, 0x07E0);

komut satırını ekleyebiliriz. Burada 0x7BEF bir uint16 renk kodunu ifade etmektedir. ST7735 kütüphanesinin içinde önceden tanımlanmış renk kodları bulunur. Bunlar aşağıdaki tablodaki şekildedir.

ST7735 Renk Koduuint16Karşılığı
ST7735_BLACK0x0000Siyah
ST7735_RED0x001FKırmızı
ST7735_GREEN0x07E0Yeşil
ST7735_WHITE0xFFFFBeyaz
ST7735_BLUE0xF800Mavi
ST7735_CYAN0x07FFCamgöbeği
ST7735_YELLOW0xFFE0Sarı
ST7735_MAGENTA0xF81FEflatun

Buna göre yukarıdaki kodu aşağıdaki şekilde yazarsak da piksel yine aynı renge (yeşile) boyanacaktır.

tft.drawPixel(20, 80, ST773_GREEN);

İki nokta arasına çizgi çizme

Ekranda iki nokta arasına çizgi çizmek için aşağıdaki fonksiyon kullanılır.

void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t color);

Bu fonksiyonun parametreleri;
uint16_t x0, uint16_t y0: Birinci pikselin x, y koordinatları
uint16_t x1, uint16_t y1: İkinci pikselin x, y koordinatları
uint16_t color: Çizginin rengi

Örneğin 20,80 noktası ile 50,100 noktası arasında kırmızı renkte bir çizgi çekmek için aşağıdaki komut satırı uygulanabilir.

tft.drawLine(20, 80, 50, 100, ST7735_RED);

Dikdörtgen çizme

Ekranda verilen bir noktadan itibaren dikdörtgen çizmek için aşağıdaki fonksiyonlardan biri kullanılır.

// İçi boş dikdörtgen çizmek için
void drawRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color);
// İçi dolu dikdörtgen çizmek için
void fillRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t color);

Bu fonksiyonların parametreleri;
uint16_t x0, uint16_t y0: Başlangıç pikselinin x, y koordinatları
uint16_t w: Dikdörtgenin genişliği
uint16_t h: Dikdörtgenin yüksekliği
uint16_t color: Dikdörtgenin rengi

Bu fonksiyonların kullanım örnekleri aşağıdaki gibidir.

// 10,10 pikselden başlayarak 20x30 piksel büyüklüğünde içi boş kırmızı çerçeveli bir dikdörtgen çizmek için 
tft.drawRect(10, 10, 20, 30, ST7735_RED); 
// 25,35 pikselden başlayarak 40x30 piksel büyüklüğünde içi dolu mavi bir dikdörtgen çizmek için 
tft.fillRect(25, 35, 40, 30, ST7735_BLUE);

Daire çizme

Ekranda verilen bir noktayı merkez alarak, bu merkezin etrafına istenen yarıçapta bir daire çizmek için aşağıdaki fonksiyonlar kullanılır.

// İçi boş daire çizmek için
void drawCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color);
// İçi dolu daire çizmek için
void fillCircle(uint16_t x0, uint16_t y0, uint16_t r, uint16_t color);

Bu fonksiyonların parametreleri;
uint16_t x0, uint16_t y0: Başlangıç pikselinin (dairenin merkez noktasının) x, y koordinatları
uint16_t r: Dairenin yarıçapının kaç piksel olduğu
uint16_t color: Dairenin rengi

Bu fonksiyonların kullanım örnekleri aşağıdaki gibidir.

// Merkez noktası 40,40 pikselde olan 10 piksel yarıçapında kırmızı bir daire çiz
tft.drawCircle(40, 40, 10, ST7735_RED); 
// Merkez noktası 30,50 pikselde olan 5 piksel yarıçapında yeşil ve içi dolu bir daire çiz 
tft.fillCircle(30, 50, 5, ST7735_GREEN);

Kenarları yumuşatılmış dikdörtgen çizme

Bazı uygulamalarda kenarları yumuşatılmış dikdörtgenler çizmek gerebilir .Verilen bir noktadan itibaren yumuşatılmış dikdörtgen çizmek için aşağıdaki fonksiyonlardan biri kullanılır.

// İçi boş yumuşatılmış dikdörtgen çizmek için
void drawRoundRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t radius, uint16_t color);
// İçi dolu yumuşatılmış dikdörtgen çizmek için
void fillRoundRect(uint16_t x0, uint16_t y0, uint16_t w, uint16_t h, uint16_t radius, uint16_t color);

Bu fonksiyonların parametreleri;
uint16_t x0, uint16_t y0: Başlangıç pikselinin x, y koordinatları
uint16_t w: Dikdörtgenin genişliği
uint16_t h: Dikdörtgenin yüksekliği
uint16_t radius: Yumuşatma yarıçapı
uint16_t color: Dikdörtgenin rengi

Bu fonksiyonların kullanım örnekleri aşağıdaki gibidir.

// 10,10 pikselden başlayarak 20x30 piksel büyüklüğünde 1 piksel yumuşatılmış içi boş kırmızı çerçeveli bir dikdörtgen çizmek için 
tft.drawRect(10, 10, 20, 30, 1, ST7735_RED); 
// 25,35 pikselden başlayarak 40x30 piksel büyüklüğünde  3 piksel yumuşatılmış içi dolu mavi bir dikdörtgen çizmek için 
tft.fillRect(25, 35, 40, 30, 3, ST7735_BLUE);

Üçgen çizme

Verilen üç noktanın birleştirilip bir üçgen çizilmesi için aşağıdaki fonksiyonlardan biri kullanılır.

// İçi boş bir üçgen çizmek için
void drawTriangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color);
// İçi dolu bir üçgen çizmek için
void fillTriangle(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t color);

Bu fonksiyonların parametreleri;
uint16_t x0, uint16_t y0: Birinci pikselin x, y koordinatları
uint16_t x1, uint16_t y1: İkinci pikselin x, y koordinatları
uint16_t x2, uint16_t y2: Üçüncü pikselin x, y koordinatları
uint16_t color: Üçgenin rengi

Bu fonksiyonların kullanım örnekleri aşağıdaki gibidir.

// (10,10), (20,32) ve (100,99) noktaları arasında içi boş yeşil bir üçgen çizmek için
tft.drawTriangle(10, 10, 20, 32, 100, 99, ST7735_GREEN); 
// (10,10), (20,32) ve (100,99) noktaları arasında içi dolu yeşil bir üçgen çizmek için
tft.fillTriangle(10, 10, 20, 32, 100, 99, ST7735_GREEN);

Metin yazdırma

Ekrana bir metin yazdırmak için aşağıdaki komut satırları kullanılabilir.

tft.fillScreen (ST7735_BLACK);  // Ekranın tamamını siyaha boya
tft.setTextColor(ST7735_RED);  // Yazı rengini kırmızı olarak ayarla
tft.setTextSize(1);  // Yazı boyutu 1 olsun
tft.setCursor (10, 6);  // Yazının başlangıç pikselinin koordinatları
tft.print ("www.hbmacit.com");  // Ekrana yazdırılacak metin

Bu komut seti çalıştırıldığında aşağıdaki gibi bir çıktı elde edilecektir.

Resim çizme

ST7735 ekranına monokrom görüntüler çizilebilir ve bunlardan animasyonlar oluşturulabilir. Bunun için aşağıdaki fonksiyon kullanılmaktadır.

void drawBitmap(int16_t x, int16_t y, uint8_t *bitmap, int16_t w, int16_t h, uint16_t color);

Bu fonksiyonların parametreleri;
uint16_t x0, uint16_t y0: Resmin başlangıç x, y koordinatları
uint8_t *bitmap: Resmi gösteren array
int16_t w: Resmin genişliği
int16_t h: Resmin yüksekliği
uint16_t color: Resmin rengi

Bir resmi ekranda çizdirmek için önce o resmi uint_8 dizisine dönüştürmek gerekir. Bu dönüşümü yapan bazı programlar olsa da, aşağıdaki linki verilen web sitesinden bu işlemi çevrimiçi olarak kolayca yapabilirsiniz.

Image to Bit Array Web Sitesi

Bir görüntüyü array’ e dönüştürünce Arduino’ da aşağıdaki şekilde tanımlayabilirsiniz.

const unsigned char BenimResmim [] PROGMEM = {
  0x01, 0x80, 0x01, 0x80, 0x01, 0x98, 0x07, 0xf8, 0x0c, 0x30, 0x10, 0x08, 0x20, 0x04, 0x2c, 0x34, 
0x26, 0x64, 0x61, 0x86, 0x20, 0x04, 0x20, 0x04, 0x20, 0x04, 0x10, 0x08, 0x0c, 0x30, 0x07, 0xe0
};

Resmin çözünürlüğü ne kadar çoksa, dizinin boyutu da o kadar çok olacaktır. Yukarıdaki array’ i ekrana yazdırmak için aşağıdaki komut satırı kullanılabilir.

tft.drawBitmap(0, 0, BenimResmim, 16, 16, ST7735_RED);

Bu komut satırı ile ekranın sol üst köşesinden (0,0 piksel) başlayarak 16×16 piksel büyüklüğünde ve kırmızı renkte resim çizilecektir.