Arduino ile Nokia 5110 LCD Ekran Kullanımı

Nokia’nın emektar telefonlarından 5110’un LCD ekranını kurcalayan bir Maker, bu ekranın Arduino gibi mikroişlemcili geliştirme kartlarına kolay bir şekilde bağlanabileceğini keşfetmesi ile bu yolculuk başlıyor.

Bu ekranın beyni ve kalbi Philips tarafından yapılan tek çekirdekli PCD8544 CMOS LCD sürücüsüdür. Bu sürücü 84×84 piksel olan her hangi bir ekranı kontrol edebilmektedir. Mikroişlemcilere SPI iletişim yolu ile bağlanmaktadır.

arduino 5110 lcd

5110 LCD Özellikleri

Görüntü TeknolojisiNokta LCD
MCU ArayüzüSPI
Ekran Boyutu1.5 inç
Çözünürlük84 × 48 piksel
Çalışma Gerilimi2.7V – 3.3V
Çalışma AkımıMaksimum 50mA
Görüş Açısı180 °

5110 LCD Bellek Yönetimi

PCD8544 LCD sürücüsünde, yansıtılacak bit motifini tutan ekran için yerleşik 504 bayt Grafik Görüntü Veri RAM’i (GDDRAM) bulunmaktadır. Bu hafıza alanı 6 bölüm olarak ayarlanmıştır. Her bölüm 84 sütun içerir. Ve her sütun 8 bit veri bulundurabilir.

İpucu

PCD8544, LCD ekran için yerleşik bir GDDRAM‘a sahip olmasına karşın, bellek içeriğini okuyamıyoruz. Ayrıca verileri okumak için ekran ara belleğini değiştirmekte pek olanaklı değildir.
İpucu olarak, kütüphane ATmega328P’den tampon olarak 504 bayt bellek ayırıyor. Böylece, ekran ara belleğini değiştirebilir ve daha sonra ATmega328P ‘nin belleğinden PCD8544 denetleyicisinin dahili belleğine toplu bir aktarım gerçekleştirebilirsiniz.

5110 LCD Pin Şeması

arduino 5110 lcd

Reset(1): Ekranı sıfırlamak için kullanılır doğrudan Arduino’ya bağlarsanız kod yüklerken veya yenilerken otomatik sıfırlama yapılabilir.

CE: “Chip Enable” SPI veri yolu kullanılırken birden fazla cihaz arasından doğru cihazı seçmek için kullanılır.

DC: “Data Command” alınan veri veya komutun görüntülenip, görüntülenmemesi gösterir.

Din: “Data in” seri veri pini.

CLK: “Serial Clock” seri saat pini

Vcc: 3.3V girişi.

BL: Arka ekran ışığını kontrol etmek için kullanılır, Arduino PWM ya da potansiyometre ile kontrol edebilirsiniz.

GND: “Ground” Negatif girişi.

PCD8544 Kütüphanesi

PCD8544 LED sürücüsü kullanıma ne kadar açık olsada, tam anlamıyla kullanmak için bellek adresleme alanında yeterli bilgiye sahip olmak gerekiyor. Fakat PCD8544 kütüphanesi ile daha hızlı ve basit bir şekilde kontrol sağlayabilirsiniz. Bu yazımızda kullandığımız tüm kodlar bu kütüphane ile hazırlanmıştır.

Eğer indirip, klasöre atmakla uğraşmak istemiyorsanız, Arduino IDE’si üzerinden kütüphane yönetimi ile ekleyebilirsiniz.

arduino 5110 lcd

Devre Şeması

Sadece test yapmak için kullanmayı planlıyorsanız, bu şekilde kullanabilirsiniz fakat uzun süreli kullanımlar için GND,VCC,BL,CE pini hariç tüm pinlere 10k ohm, CE pinine 1k ohm direnç bağlamanız gerekiyor, bu sayede fazla akımı sınırlamış olursunuz.

arduino 5110 lcd

Arduino Kodu

Kodu yüklemeden önce kütüphanenin yüklü olduğundan, portların seçili olduğundan ve bağlantıların yapıldığından emin olun.

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
int rotatetext = 1;
void setup()   {
 Serial.begin(9600);
 display.begin();
 // you can change the contrast around to adapt the display for the best viewing!
 display.setContrast(57);
 // Clear the buffer.
 display.clearDisplay();
 // Display Text
 display.setTextSize(1);
 display.setTextColor(BLACK);
 display.setCursor(0,0);
 display.println("devreyakan!");
 display.display();
 delay(2000);
 display.clearDisplay();
 // Display Inverted Text
 display.setTextColor(WHITE, BLACK); // 'inverted' text
 display.setCursor(0,0);
 display.println("devreyakan!");
 display.display();
 delay(2000);
 display.clearDisplay();
 // Scaling Font Size
 display.setTextColor(BLACK);
 display.setCursor(0,0);
 display.setTextSize(2);
 display.println("devre!");
 display.display();
 delay(2000);
 display.clearDisplay();
 // Display Numbers
 display.setTextSize(1);
 display.setCursor(0,0);
 display.println(123456789);
 display.display();
 delay(2000);
 display.clearDisplay();
 // Specifying Base For Numbers
 display.setCursor(0,0);
 display.print("0x"); display.print(0xFF, HEX); 
 display.print("(HEX) = ");
 display.print(0xFF, DEC);
 display.println("(DEC)"); 
 display.display();
 delay(2000);
 display.clearDisplay();
 // Display ASCII Characters
 display.setCursor(0,0);
 display.setTextSize(2);
 display.write(3);
 display.display();
 delay(2000);
 display.clearDisplay();
 // Text Rotation
 while(1)
 {
 display.clearDisplay();
 display.setRotation(rotatetext);  // rotate 90 degrees counter clockwise, can also use values of 2 and 3 to go further.
 display.setTextSize(1);
 display.setTextColor(BLACK);
 display.setCursor(0,0);
 display.println("Text Rotation");
 display.display();
 delay(1000);
 display.clearDisplay();
 rotatetext++;
 }
}
void loop() {}

arduino 5110 lcd

Meraklılar İçin Kütüphanenin Örnekleri

Metin Görüntüleme

// Display Text
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.println("Hello world!");
display.display();
delay(2000);
display.clearDisplay();

setTextSize(): Metin font boyutunu ayarlamak için kullanılır.

setTextColor(): Yazı rengini ayarlamak için kullanılır, koyu arka planı için BLACK, parlak arkaplan için WHITE yazmak gerekiyor

setCursor(X,Y): Piksellerin başlayacağı koordinatlar.

print(” “): ve println(” “): Metni ekrana yazdırmak için.

display(): Bellekteki verileri ekrana yazdırmak için kullanılır.

Ters Çevrilmiş Metin

// Display Inverted Text
display.setTextColor(WHITE, BLACK);
display.setCursor(0,0);
display.println("Hello world!");
display.display();
delay(2000);
display.clearDisplay();

Ters çevrilmiş metni görüntülemek için setTextColor(FontColor,BackgroundColor) işlevini çağırmak gerekiyor. Daha önce yalnızca bir parametre çağırdığımızı görebilirsiniz. Ancak şimdi iki parametre çağırıyoruz. Bu, Function overloading adı verilen olayla yapılmaktadır. İşlev aşırı yüklenmesi olarak bilinen bu olay, aynı isimde ancak farklı parametre kümesiyle birden çok işlev oluşturma işidir. Aşırı yüklenmiş bir işleve yapılan çağrılar, geçirilen parametrelere bağlı olarak bu işlevin belirli bir uygulamasını çalıştırır.

Bu kodda geçen setTextColor(BLACK, WHITE) kodu, dolu arka plan üzerinde siyah metin oluşturacaktır.

Yazı Tipi Boyutu

// Scaling Font Size
display.setTextColor(BLACK);
display.setCursor(0,0);
display.setTextSize(2);
display.println("Hello!");
display.display();
delay(2000);
display.clearDisplay();

Makalenin başlarında, setTextSize() yazı tipi boyutunu ayarlamak için bu fonksiyonu çağırdık ve parametre olarak 1’i seçtik. Negatif olmayan bir tam sayı girerek yazı tipini ölçeklendirmek için bu işlevi kullanabilirsiniz.
Örnek Olarak:
Yazı fontunu 1 seçerseniz karakterler 5×7 formatında oluşturulur, eğer 2 seçerseniz 10×14 formatında oluşturulur.

İpucu

Adafruit_GFX kütüphanesi yazı tipini oluşturan fonksiyonlara sahiptir. Varsayılan olarak tek aralıklı ve tek format yazı tipi seçilidir. Ancak, Adafruit GFX kütüphanesinin yeni sürümleri alternatif yazı tiplerini kullanma şansı sunar. Kütüphaneyle birlikte birkaç alternatif yazı tipi gelir, ayrıca yenilerini ekleme özelliği vardır.

Rakamları Görüntüleme

// Display Numbers
display.setTextSize(1);
display.setCursor(0,0);
display.println(123456789);
display.display();
delay(2000);
display.clearDisplay();

Rakamlar LCD ekranda sadece print() veya println() fonksiyonu ile görüntülenebilir. Bu işlevlerin aşırı yüklenmiş bir uygulaması 32 bit işaretsiz int olarak kabul eder, bu nedenle yalnızca 0 ile 2^32=4,294,967,295 arasındaki sayıları görüntüleyebilirsiniz.

Sayılar için Taban Belirtme

// Specifying Base For Numbers
display.setCursor(0,0);
display.print("0x"); display.print(0xFF, HEX); 
display.print("(HEX) = ");
display.print(0xFF, DEC);
display.println("(DEC)"); 
display.display();
delay(2000);
display.clearDisplay();

print() ve println() işlevlerinde, kullanılacak tabanı (format) belirten isteğe bağlı ikinci bir parametre bulunur; izin verilen değerler BIN (ikili veya taban 2), OCT (sekizli veya taban 8), DEC (ondalık veya taban 10), HEX (onaltılık veya taban 16) ‘dır.

Örneğin:

  • print (78, BIN) “1001110” verir
  • print (78, OCT) “116” verir
  • print (78, DEC) “78” verir
  • print (78, HEX) “4E” verir
  • println (1.23456, 0) “1” verir
  • println (1.23456, 2) “1.23” verir
  • println (1.23456, 4) “1.2346” verir

ASCII Sembollerini Görüntüleme

// Display ASCII Characters
display.setCursor(0,0);
display.setTextSize(2);
display.write(3);
display.display();
delay(2000);
display.clearDisplay();

print() ve println() fonksiyonları ekrana insan tarafından okunabilen ASCII metni olarak veri gönderirken, write() fonksiyonu ekrana ikili veri gönderir. Bu nedenle, ASCII sembollerini görüntülemek için bu işlevi kullanabilirsiniz. 3 numaralı örnek kütüphanede kalp sembolüne denk gelmektedir.

Metin(Yazı) Döndürme

// Text Rotation
while(1)
{
 display.clearDisplay();
 display.setRotation(rotatetext);
 display.setTextSize(1);
 display.setTextColor(BLACK);
 display.setCursor(0,0);
 display.println("Text Rotation");
 display.display();
 delay(1000);
 display.clearDisplay();
 rotatetext++;
}

0 – Ekranı standart yatay yönde tutar.
1 – Ekranı 90 ° sağa döndürür.
2 – Ekranı ters çevirir.
3 – Ekranı 90 ° sola döndürür.

Geometrik Şekiller

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
// Declare LCD object for software SPI
// Adafruit_PCD8544(CLK,DIN,D/C,CE,RST);
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
void setup()   {
 Serial.begin(9600);
 //Initialize Display
 display.begin();
 // you can change the contrast around to adapt the display for the best viewing!
 display.setContrast(57);
 // Clear the buffer.
 display.clearDisplay();
 // Draw Rectangle
 display.drawRect(0, 0, 60, 40, BLACK);
 display.display();
 delay(2000);
 display.clearDisplay();
 //Draw Filled Rectangle
 display.fillRect(0, 0, 60, 40, BLACK);
 display.display();
 delay(2000);
 display.clearDisplay();
 //Draw Round Rectangle
 display.drawRoundRect(0, 0, 60, 40, 8, BLACK);
 display.display();
 delay(2000);
 display.clearDisplay();
 //Draw Filled Round Rectangle
 display.fillRoundRect(0, 0, 60, 40, 8, BLACK);
 display.display();
 delay(2000);
 display.clearDisplay();
 //Draw Circle
 display.drawCircle(20, 20, 20, BLACK);
 display.display();
 delay(2000);
 display.clearDisplay();
 //Draw Filled Circle
 display.fillCircle(20, 20, 20, BLACK);
 display.display();
 delay(2000);
 display.clearDisplay();
 //Draw Triangle
 display.drawTriangle(20, 0, 0, 40, 40, 40, BLACK);
 display.display();
 delay(2000);
 display.clearDisplay();
 //Draw Filled Triangle
 display.fillTriangle(20, 0, 0, 40, 40, 40, BLACK);
 display.display();
 delay(2000);
 display.clearDisplay();
}
void loop() {}

Dikdörtgen Çizimi

// Draw Rectangle
display.drawRect(0, 0, 60, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();
//Draw Filled Rectangle
display.fillRect(0, 0, 60, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();

Yuvarlak Kenarlı Dikdörtgen Çizim

//Draw Round Rectangle
display.drawRoundRect(0, 0, 60, 40, 8, BLACK);
display.display();
delay(2000);
display.clearDisplay();
//Draw Filled Round Rectangle
display.fillRoundRect(0, 0, 60, 40, 8, BLACK);
display.display();
delay(2000);
display.clearDisplay();

Çember, Daire, Yuvarlak

//Draw Circle
display.drawCircle(20, 20, 20, BLACK);
display.display();
delay(2000);
display.clearDisplay();
//Draw Filled Circle
display.fillCircle(20, 20, 20, BLACK);
display.display();
delay(2000);
display.clearDisplay();

Üçgen Çizimi

//Draw Triangle
display.drawTriangle(20, 0, 0, 40, 40, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();
//Draw Filled Triangle
display.fillTriangle(20, 0, 0, 40, 40, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();

BITMAP Oluşturmak

5150 LCD ekranda resim gibi dosyaları göstermek için elimizde olan görselleri bitmap formatına çevirmemiz gerekiyor. Bu çevirmeyi isterseniz LCD Assistant üzerinden isterseniz internetten image2cpp üzerinden yapabilirsiniz.

#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
// Declare LCD object for software SPI
// Adafruit_PCD8544(CLK,DIN,D/C,CE,RST);
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
// 'Marilyn Monroe 84x48', 84x48px
const unsigned char MarilynMonroe [] PROGMEM = {
 0x00, 0x00, 0x00, 0x7f, 0x00, 0x02, 0xfe, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00, 
 0x00, 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00, 
 0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x1f, 0xe1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 
 0x00, 0x00, 0x0f, 0xf1, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xd8, 0xe0, 
 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x07, 0xe0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x03, 
 0x3f, 0xe0, 0x00, 0x07, 0xf0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x70, 0x00, 0x0f, 0xee, 
 0x7c, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x0f, 0xf7, 0x1c, 0x00, 0x00, 0x00, 0x00, 
 0x07, 0x80, 0x00, 0x0f, 0xc7, 0xf3, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x0f, 0xf3, 
 0xdf, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x00, 0x08, 0x7d, 0xef, 0xff, 0xc0, 0x00, 0x00, 
 0x00, 0x7f, 0xff, 0x80, 0x30, 0x0f, 0xfc, 0xe0, 0xc0, 0x00, 0x00, 0x01, 0x9e, 0x73, 0xc0, 0xe0, 
 0x07, 0xf8, 0xc1, 0xc0, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x01, 0xc0, 0x0f, 0xfd, 0xe1, 0x80, 0x00, 
 0x00, 0x03, 0xf8, 0x00, 0x01, 0x9c, 0x0f, 0xff, 0xc1, 0xc0, 0x00, 0x00, 0x02, 0xc0, 0x00, 0x01, 
 0x9f, 0xbf, 0xfe, 0x01, 0x40, 0x00, 0x00, 0x02, 0x60, 0x00, 0x03, 0x07, 0xef, 0xff, 0x01, 0x40, 
 0x00, 0x00, 0x00, 0x60, 0x00, 0x07, 0x01, 0xf7, 0xff, 0x80, 0xc0, 0x00, 0x00, 0x00, 0x50, 0x01, 
 0xdf, 0x00, 0x7f, 0xff, 0x1c, 0x80, 0x00, 0x00, 0x00, 0x40, 0x01, 0xff, 0x00, 0x1f, 0xff, 0x1e, 
 0xe0, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3f, 0x80, 0x07, 0xef, 0x03, 0xe0, 0x00, 0x00, 0x06, 0x08, 
 0x00, 0x03, 0xc0, 0x07, 0xdf, 0x07, 0xc0, 0x00, 0x00, 0x06, 0x08, 0x0f, 0x81, 0x80, 0x1f, 0xdf, 
 0x1f, 0x80, 0x00, 0x00, 0x03, 0x08, 0x1f, 0x98, 0x00, 0x3f, 0xfe, 0x19, 0x80, 0x00, 0x00, 0x18, 
 0x08, 0x3f, 0xfe, 0x00, 0x7f, 0xfe, 0x3f, 0x00, 0x00, 0x00, 0x08, 0x08, 0x30, 0x3f, 0x00, 0xff, 
 0xff, 0x3f, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x76, 0x0f, 0x89, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00, 
 0x03, 0xe0, 0x7f, 0xc3, 0x81, 0xff, 0xfe, 0x9f, 0x80, 0x00, 0x00, 0x03, 0xf0, 0x7f, 0xf3, 0xc3, 
 0xff, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x7f, 0xfd, 0xc3, 0xff, 0xfe, 0x5e, 0x00, 0x00, 
 0x00, 0x03, 0xf0, 0x7f, 0xff, 0xc3, 0xff, 0xf3, 0x1e, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x71, 0xff, 
 0x87, 0xff, 0xe3, 0xff, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x7c, 0x3f, 0x87, 0xff, 0xe3, 0xfe, 0x00, 
 0x00, 0x00, 0x0f, 0xf0, 0x3c, 0xff, 0x05, 0xff, 0xf3, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x0f, 
 0xfe, 0x09, 0xff, 0xf7, 0xfc, 0x00, 0x00, 0x00, 0x08, 0xf8, 0x01, 0xfc, 0x19, 0xff, 0xff, 0xf8, 
 0x00, 0x00, 0x00, 0x0c, 0x78, 0x00, 0x00, 0x13, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x0e, 0x78, 
 0x00, 0x00, 0x23, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x0e, 0xf8, 0x00, 0x00, 0x47, 0xff, 0xff, 
 0xf0, 0x00, 0x00, 0x00, 0x0c, 0xfa, 0x00, 0x01, 0x8f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x08, 
 0x7b, 0x00, 0x03, 0x3f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0c, 0x3b, 0xf8, 0x0f, 0xff, 0xff, 
 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 
 0x07, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x71, 0xff, 0xff, 0xff, 
 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x41, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00
};
void setup()   {
 Serial.begin(9600);
 //Initialize Display
 display.begin();
 // you can change the contrast around to adapt the display for the best viewing!
 display.setContrast(57);
 // Clear the buffer.
 display.clearDisplay();
 // Display bitmap
 display.drawBitmap(0, 0,  MarilynMonroe, 84, 48, BLACK);
 display.display();
 // Invert Display
 //display.invertDisplay(1);
}
void loop() {}

image2cpp Kullanımı

Resminizi bir diziye dönüştürebilen image2cpp adlı çevrimiçi bir uygulama var. Image2cpp, LCD Asistan’dan daha yeni ve daha kullanışlıdır. Her hangi bir resmi çevirmek için siteyi açın ve istediğiniz görseli seçin;

arduino 5110 lcd

Görüntünüzün boyutları, Görüntü ayarları altındaki Tuval boyutu kısmında bulunur. Görüntüyü 84 × 48 olarak değiştirin ve uygun Ölçeklendirme seçeneğini işaretleyin.

Son olarak, en önemli seçeneği değiştirin (Brightness threshold). Eşiğin ayarlanması bu seviyenin üstündeki pikselleri beyaz ve siyahın altındaki pikselleri yapar. Detayların belirgin olması için 171 değerini öneriyoruz.

arduino 5110 lcd

Önizleme kısmı ayarlarınızda yaptığınız değişiklikleri yansıtır. Ayarları göz önünde tutarak değiştirebilirsiniz.

arduino 5110 lcd

Sonuçtan memnun kaldığınızda, veri dizisini oluşturmaya devam edebilirsiniz. Arduino Kodu olarak çıkış formatını seçin ve Kod oluştur butonuna tıklayın.

arduino 5110 lcd

Çıktıyı doğrudan örnek kodumuzla kullanabilirsiniz. Sadece uygun şekilde çağırdığınızdan emin olun. Ardından diziyi drawBitmap() fonksiyonu içinde çağırın.

arduino 5110 lcd

LCD Assistant Kullanımı

Aşağıdaki ayarları birebir yaparak bu şekilde kullanabilirsiniz, görseli seçtikten sonra çıktı olarak .c dosyası olarak kaydedin, kaydettiğiniz .c dosyasını Arduino projenizin klasörüne atıp doğrudan ekleyebilirsiniz.

arduino 5110 lcd