Arduino ile OLED Ekran SSD1306 ile Grafik İşlemleri
Arduino ile Oled ekranlarda SSD1306TUR kütüphanesi ile tüm grafik işlemleri fonksiyonlarına bakıyor olacağız. Ekranın kullanımı ve Arduino Uno 'ya bağlantısı gibi giriş seviyesi konulara hakim değilseniz : Arduino oled ekran kullanımı konusunu ziyaret edebilirsiniz. Bu yazıda yalnızca oled ekran ile grafiksel fonksiyonları inceliyor olacağız. Aşağıdaki fonksiyonları kullandıktan sonra ekranda yaptığınız değişikliklerin görüntülenmesi için display.display(); fonksiyonunu kullanmayı unutmayın.
writeFillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color)
fillRect(int16_t x, int16_t y, int16_t w, int16_t h, uint16_t color) fonksiyonu da kullanılabilir.
İçi dolu bir dikdörtgen çizmenize olanak sağlar, kullanılan parametreler :
x : ekran üzerindeki yatay konum (en sol 0)
y: ekran üzerindeki dikey konum (en üst 0)
w: çizilecek dikdörtgenin genişliği (piksel)
h: çizilecek dikdörtgenin yüksekliği (piksel)
color: renk
display.writeFillRect(0,10,50,10,1);
İçi boş bir dikdörtgen çizmek için aynı parametrelerle
display.drawRect(0, 10, 50, 10, 1);
fonksiyonunu kullanabilirsiniz.
setRotation (uint8_t x)
Ekran yönünü değiştirmenize olanak sağlar, farklı tasarımlarda ya da montaj durumuna göre ekranın yönünü çevirmek için kullanabilirsiniz. X parametresi,
0 : mevcut konumu,
1 : 90 derece sağa, pinler sol tarafta ekrana bakarsanız düz konuma gelmiş olur
2: 180 derece sağa, tam ters posizyonu alır ekran pinleri aşağıda kaldığında ekran düz konuma gelmiş olur
3: 90 derece sola, pinler sağ tarafta kalacak şekilde ekran düz konumda olur.
ekran çevirme işlemi fonksiyon kullanıldıktan sonra kullanılan fonksiyonlar için geçerli olur.
display.setRotation(2);
fonksiyonu SSD1306 ekranı ters çevirir.
fillScreen(uint16_t color)
Ekranın tamamını tek renkle doldurmanıza olanak sağlar.
Ekrana merkezi x0,y0 noktasında olan ve yarı çapı r pixel olan color renginde bir daire çizer. Eğer daireniz yeterince daireymiş gibi görünmüyorsa, bu ekranın dikey piksel aralığının yatay piksel aralığından daha fazla olmasından kaynaklanıyor olabilir ya da yüksekliğinizi düşük girmiş olabilirsiniz. Yüksekliği 64 piksel olan ekran için 32 piksel girerseniz ekranınız dikey olarak olduğundan geniş görüneceğinden daire değil de elips görüyor olacaksınız ekranda.
display.drawCircle(64,15,15,SSD1306_WHITE);
aynı patametrelerle fillCircle fonksiyonunu içi dolu bir daire çizmek için kullanabilirsiniz:
Ekrana merkezi x0,y0, notasında r piksel yarı çapında color renginde bir dairenin çeyreklerini çizmenize olanak sağlar, bu fonksiyon yardımıyla köşe noktaları yuvarlak olan dikdörtgen butonlar çizebilirsiniz, tabi drawLine falan da kullanmanız gerekecek, bunun için özel bir fonksiyon var, aşağılarda yazıyor olacak; cornername parametresini 4 bitlik ikili sayı sisteminde bir değer olarak düşünün 1 ler basamağınız 1 ise dairenin sol üst çeyreğini, 2 ler basamağınız 1 ise sağ üst çeyreğini, 4 ler basamağınız 1 ise sağ alt çeyreğini, 8 ler basamağınız 1 ise sol alt çeyreğini çizdirebilirsiniz. Daha kolayınıza gelsin diye kütüphanenin tanımlamalarını kullanabilirsiniz, köşe sayınız birden fazla ise aralarına | or koymanız işinizi çözecektir :
Sol üst köşesi x,y noktasında olan w piksel genişliğinde h piksel yüksekliğinde kenarları r piksel yarı çapında oval olan içi boş bir dikdörtgen çizmenize olanak sağlar.
sonrasında setup fonksiyonu içerisinde ekranımızı başlatıyoruz :
voidsetup()
{
if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS))
{
Serial.println(F("SSD1306 allocation failed"));
for (;;)
; // Don't proceed, loop forever
}
display.clearDisplay();
}
artık display nesnesiyle ekranımızı yönetmeye başlayabiliriz.
clearDisplay()
Ekranın tampon datasını siler, tüm pikseller kapalı duruma gelir.
display.clearDisplay();
display()
Display fonksiyonu ekran için yaptığınız işlemlerin ekranda gösterilmesini sağlar, aşağıdaki ya da grafik işlemleri konusunda yazdığımız tüm fonksiyonlardan sonra bu fonksiyonu kullanmamız gerekiyor, aksi halde kullanılan fonksiyonlar uno'nun ram indeki buffer da saklanıyor, ekrana gönderilmiyor.
display.display();
String İşlemleri
Ekrana yazı yazdırmak için kullanabileceğimiz fonksiyonlara bakalım;
setTextColor()
setTextColor(uint16_ttextColor)
Ekrana herhangi bir şey yazdırmadan önce yazı rengini belirlemeniz gerekiyor, belirlemezseniz kütüphane varsayılan olarak SSD1306_WHITE olarak seçiyor, zaten monochrome bir ekran için başka bir şansınız yok, piksel ya görünüyordur açıktır yani, ya da kapalıdır, kapalı olma durumu da SSD1306_BLACK ile seçilebilir.
display.setTextColor(SSD1306_WHITE);
setTextColor(uint16_ttextColor, uint16_tbgColor)
Arka plan da belirlemek istiyorum derseniz bunu sadece yazı kapalı arka plan görünür olsun istediğiniz için kullanırsınız, diğer durumda arka plan zaten siyahtır, yani inverse text yapmak için: ilk parametre yazı rengi ikinci parametre yazı arka plan rengi olarak verilebiliyor :
Yazılacak metnin boyutunu ayarlar, bu karakter boyutunuzun bir çarpanı gibi düşünülebilir, karakterini 6x8 ise ve fonksiyona 2 değerini göndermişseniz, karakterleriniz 12x16 olarak basılır. Fonksiyonun kullanım zorunluluğu yoktur; kullanılmazsa karakter olduğu boyutlarda ekrana basılır.
display.setTextSize(2);
setFont(const GFXfont *f)
Yazılacak metnin fontunu belirlemenizi sağlıyor, metin yazılmadan önce belirtilmeli. İçerisine parametre olarak gfx fontlardan birinin adresini (font isminin yanında & olmalı) girmelisiniz. Font isimlerini nerden bulabilirim? kütüphanenin içinde TrFonts klasörünün içinde bulunan fontlardan, hangisini seçecekseniz onun dosya ismiyle font ismi aynı ayarlanmıştır, farklı olabilir mi? bunun için font dosyasını açtığında en altta font tanımlamasını göreceksin :
constGFXfontFreeSansBold12pt7bTRPROGMEM
fonksiyona parametre olarak vermen gereken şey tam olarak budur:
display.setFont(&FreeSansBold12pt7bTR);
Ee bir tane font var başka yok mu? Türkçe karakter destekleyen henüz yok. Desteklemeyenlere de Adafruit GFX library içerisinde Fonts klasöründen ulaşabilirsin, projene bu fontları dahil etmek için :
#include"Fonts/FreeSans12pt7b.h"
Fonts/ yazıp font dosya adını yazman yeterli.
setCursor(int16_t x, int16_t y)
Yazılacak metnin ekrandaki pozisyonunu belirlemenizi sağlıyor, x yatay düzlemdeki genişliğe denk gelen değer y dikey düzlemde yüksekliğe denk gelen değer 0,0 ekranın sol üst köşesini ifade eder ve piksel cinsinden değerlerdir.
display.setCursor(20, 22);
metninizi 20 piksel sağa 22 piksel aşağıya kaydırmış olur.
print(const __FlashStringHelper *ifsh)
Fonksiyonun görünümü sizi korkutmasın, içine çift tırnak içinde yazacağınız metni yazmanız yeterli
display.print("Türkçe");
yazdıktan sonra metnin sonuna satır bitirme eklemek isterseniz ki bu durumda bundan sonra yazdıracağınız metin bir alt satırdan başlar, bu durumda println kullanabilirsiniz:
display.println("SSD1306");
Grafik İşlemleri
invertDisplay(bool i)
Parametresi true ise ekrandaki açık olan pikselleri kapalı, kapalı olan pikselleri açık duruma getirir, false ise eski haline döndürür:
display.invertDisplay(true);
dim(bool dim)
Parametresi true ise ekranın daha az parlaklıkla çalışmasını sağlar, false ise, tam parlaklık durumudur, varsayılan olarak ekran tam parlaklık modunda çalışır.
display.dim(true);
drawPixel(int16_t x, int16_t y, uint16_t color)
Ekran üzerinde sadece bir pikseli açmak kapatmak ya da inverse etmek için kullanılır :
display.drawPixel(5,5,1);
5,5 koordinatındaki pikseli 1 ile açabiliriz, bunun yerine SSD1306_WHITE tanımlaması da kullanılabilir.
drawFastHLine(int16_t x, int16_t y, int16_t w, uint16_t color)
Ekran üzerinde yatay bir çizgi çizmenizi sağlar, x parametresi hangi x pikselinden başlayacağınızı, y hangi y satırını kullanacağınızı, w parametresi kaç piksel uzunluk istediğinizi, color parametresi rengi belirmenizi sağlar:
display.drawFastHLine(5,31,123,SSD1306_WHITE);
5. x pikselinden başlayan 31. numaralı yatay satırda, 123 piksel genişliğinde bir çizgi çizer.
drawFastVLine(int16_t x, int16_t y, int16_t h, uint16_t color)
Ekran üzerinde dikey bir çizgi çizmenizi sağlar, x parametresi çizginin olacağı piksel sütununu, y parametresi hangi y pikselinden başlayacağınızı, h parametresi kaç piksel yükseklik istediğinizi, color parametresi rengi belirler.
display.drawFastVLine(2,0,32,SSD1306_WHITE);
2. kolonda 0. cı y pikselinden başlayan 32 piksel yüksekliğinde beyaz renkli bir çizgi çizer.
startscrollright(uint8_t start, uint8_t stop)
Ekranının tamamını ya da bir bölümünü sağa doğru kaydırmanızı sağlar. start ilk satırı stop son satırı ifade eder, satır demişken 8 piksel yüksekliğinde bir bloktan bahsediyoruz, ekranın yukardan aşağıya doğru 4 e bölündüğünü düşünebilirsiniz, 0,0 en üstteki 1,1 bir altındakini 2,2 alttan ikinciyi, 3,3 de en alttaki satırı sağa kaydırır:
display.startscrollright(2,2);
ekranın 16. pikselinden başlayıp 23. pixeline kadar uzanan bloğu sağa kaydırır. Aynı mantıkla :
display.startscrollleft(3,3);
de en sondaki satırı sola doğru kaydırıyor, hem sağa hem sola farklı satırları da olsa kaydıramıyoruz. kaydırmayı sonlandırmak için :