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.
5110 LCD Özellikleri
Görüntü Teknolojisi | Nokta LCD |
MCU Arayüzü | SPI |
Ekran Boyutu | 1.5 inç |
Çözünürlük | 84 × 48 piksel |
Çalışma Gerilimi | 2.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ı
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.
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 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() {}
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.
Renkleri 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.
Renkleri Tersine Çevirme
display.invertDisplay(true);
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;
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.
Önizleme kısmı ayarlarınızda yaptığınız değişiklikleri yansıtır. Ayarları göz önünde tutarak değiştirebilirsiniz.
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.
Çı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.
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.
Yorum yapma özelliği, forum tarafından gelen istek sebebiyle kapatılmıştır. Lütfen tartışmalar ve sorularınız için topluluk forumumuza katılın.