Arduino ile e-Paper Ekran Kullanımı
E-kitap okuyucuların neden LCD, OLED veya TFT ekran kullanmadığını hiç merak ettiniz mi? Bunun nedeni, aynı kullanımda e-paper ekran veya e-ink ekranların TFT ekrana kıyasla %0,008 güç tüketmesidir. Bu yazıda Arduino ve diğer mikrodenetleyiciler ile kolayca kullanılabilen e-paper ekranı tanıtacağız.
e-Paper Ekran Nasıl Çalışır?
e-paper ekranlar, pozitif yüklü (4) beyaz pigmentler ve (6) şeffaf yağda asılı duran negatif yüklü (5) siyah pigmentler içeren (3) resim öğeleri (pikseller) içerir. Bu pikseller (2) şeffaf ve (7) şeffaf olmayan elektrotlar arasındadır.
Bir piksele pozitif bir yük uygulandığında, siyah pigmentler aşağı inerken beyaz pigmentler ekranın yüzeyine (şeffaf elektrot) itilir. Yüzeydeki beyaz pigmentler beyaz ışığı yansıtır ve siyah ışığı emer. Tersine, negatif bir yük siyah pigmentleri ekrana doğru itecektir. Gri renk ise hem negatif hem de pozitif yük uygulandığında elde edilir.
e-paper ekranın diğer görüntüleme teknolojilerine göre avantajı, görüntü görüntülendikten sonra güce ihtiyaç duymamasıdır. Bu nedenle, bir e-kitap okuyucuda bir sayfa okuyorsanız, e-mürekkep ekranının güç tükettiği tek zaman, bir sayfadan diğerine aktarım yaptığınız zamandır. Buna karşılık, TFT ekranlarda yenileme hızı genelde 50 Hz’dir. Bu, saniyede 50 kez güç tükettiği anlamına gelir.
Ayrıca, e-paper ekranlar, ortam ışığının yansımasıyla çalışırlar, bu yüzden arkadan aydınlatmaya gerek duymazlar fakat bazı modellerde, arka ışık mevcuttur.
e-paper Modülü
Kullanılan modül Arduino uyumlu e-paper ekran MH-ET LIVE’dır.
Bu ekran, mikrodenetleyicilerle iletişim kurmak için SPI protokolünü. kullanır. Ekranın arkasında iki anahtar bulunur: biri voltaj seviyelerini değiştirmek için, diğeri 3 telli ve 4 telli SPI arasında geçiş yapmak içindir.
Bu e-paper ekranı Waveshare ile uyumludur, bu nedenle buradaki kod, bu türe sahipseniz kullanılabilir (aşağıda gösterilmiştir):
Arduino Kodu
Kullanılan kütüphane, Waveshare kütüphanesinin üzerinde oynanmış bir sürümüdür, eğer isterseniz doğrudan Waveshare kütüphanesini de kullanabilirsiniz.
Kitaplıkta, biri metin yazdırma, diğeri gri tonlamalı görüntüleri göstermek için olmak üzere iki örnek kod bulunur.
Metin Yazdırma
Temel olarak, kütüphaneyi eklemeniz gerekir. Eğer kütüphane kurmayı, eklemeyi bilmiyorsanız bu yazımıza bakabilirsiniz.
#include <Epaper1_54.h>
sonra epd sınıfının bir örneğini oluşturun:
Epd epd(0, 0);
Buradaki 0 ve 0 argümanları, boyanacak görüntünün başlangıç noktasını belirtmek içindir.
Ardından, ekranı başlatırsınız:
epd.LDirInit();
ve metnin genişliğini ve yüksekliğini ayarlayın:
epd.SetWidth(200);
epd.SetHeight(24);
Burada metin, 200 piksel ekran genişliğinin tamamını ve 24 piksel ekran yüksekliğini kaplayacaktır.
Ardından, metnin rengini belirtin. Beyaz arka planda siyah metin istiyorsanız, önce Clear() işlevini çağırın ve ona 1 veya “UNCOLORED” değerini iletin:
epd.Clear(UNCOLORED);
Dizeyi yazmak için DrawStringAt() işlevi kullanılır ve ardından bu dizeyi ekran arabelleğine yerleştirilir:
epd.DrawStringAt(30, 4, "devreyakan.com", &Font16, COLORED);
epd.SetFrameMemory(epd.Buffer(), 0, 10, epd.GetWidth(), epd.GetHeight());
Burada, 30 ve 4, metnin sütun ve satır konumlarıdır. Bunu, görüntülenecek metin, ardından yazı tipi ve renk takip eder.
Siyah arka plan üzerinde beyaz metin istiyorsanız, bu örnekte RENKLİ ve RENKSİZ konumlarını tersine çevirmeniz yeterlidir.
Ayrıca, aşağıdaki yazı tipi boyutları arasından seçim yapabilirsiniz:
- Font8
- Font12
- Font16
- Font20
- Font24
setFrameMemory() bir arabellek gerektirir (dahili olarak bildirilmiş), başlangıç x ve y koordinatı (önceki sütun ve satır kümesine referansla) ve 200 ve 24 olarak bildirilen genişlik ve yükseklik gerektirir.
Son olarak, çerçeveyi göstermek için DisplayFrame()’i çağırırız:
epd.DisplayFrame();
Kodun Tamamı
#include <SPI.h>
#include <Epaper1_54.h>
Epd epd(0, 0);
void setup() {
Serial.begin(115200);
Serial.println("e-Paper calistir ve temizle");
epd.LDirInit();
epd.ClearAll();
epd.SetWidth(200);
epd.SetHeight(24);
Serial.println("e-Paper yazdirma");
epd.Clear(UNCOLORED);
epd.DrawStringAt(30, 4, "devreyakan.com", &Font16, COLORED);
epd.SetFrameMemory(epd.Buffer(), 0, 10, epd.GetWidth(), epd.GetHeight());
epd.DisplayFrame();
}
void loop() {
}
Gri Tonlamalı Resimleri Gösterme
e_paper_image kitaplığındaki örnek, bir görüntünün e-paper ekranında nasıl görüntüleneceğini gösterir. Yine de, burada adımları özetleyeceğiz.
200 x 200 piksel boyutunda bir resim bulun ve onu Img2Cpp’ye yükleyin. Bu web sitesi görüntüleri bir bayt dizisine dönüştürür ve bu daha sonra bir görüntüyü ekranda görüntülemek için kullanılabilir.
Bayt dizisi, “Kod oluştur” düğmesine tıklandıktan sonra oluşturulacaktır.
Arduino IDE’de yeni bir dosya açın ve aşağıdaki kodu yapıştırın:
#include <Epaper1_54.h>
#include "gorsel.h"
Epd epd(0, 0);
void setup() {
Serial.begin(115200);
Serial.println("e-Paper init and clear");
epd.LDirInit();
epd.ClearAll();
epd.DisplayPartBaseImage(epd_bitmap_sample_input);
epd.DisplayFrame();
}
void loop() {
}
Görüntüyü görüntüleme işlevi, argümanı char dizisi olan DisplayPartBaseImage() işlevidir.
Img2Cpp’den char dizisini eklemek için “gorsel.cpp” adında harici bir dosya oluşturun. Bayt dizisi kodunu Img2Cpp’den yapıştırın ve ardından bu satırı en üst satıra ekleyin:
#include "gorsel.h"
#include <avr/pgmspace.h>
Ardından “gorsel.h” adında başka bir dosya oluşturun ve şu satırı yazın:
extern const unsigned char epd_bitmap_sample_input[];
Diğer Fonksiyonlar
void DrawAbsolutePixel(int x, int y, int colored);
void DrawPixel(int x, int y, int colored);
void DrawCharAt(int x, int y, char ascii_char, sFONT* font, int colored);
void DrawStringAt(int x, int y, const char* text, sFONT* font, int colored);
void DrawLine(int x0, int y0, int x1, int y1, int colored);
void DrawHorizontalLine(int x, int y, int width, int colored);
void DrawVerticalLine(int x, int y, int height, int colored);
void DrawRectangle(int x0, int y0, int x1, int y1, int colored);
void DrawFilledRectangle(int x0, int y0, int x1, int y1, int colored);
void DrawCircle(int x, int y, int radius, int colored);
void DrawFilledCircle(int x, int y, int radius, int colored);
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.