Arduino ile haberleşmede bu kez kullanacağımız display bir OLED display. Aliexpress’den 10 TL civarında alınabiliyor.

aliexpres-1306

 

Ürün özelliklerine baktığımızda 0.91 inç (3.2 cm) olan bu model SSD1306 sürücüsünü kullanıyor. Yatayda 128, düşeyde 32 piksel var. Nokia 5110’u LCD ekranını hatırlıyorum; 84×48 piksel idi. Onda her bir piksel bir sıvı kristal hücre iken  burada her bir piksel bir LED. Yani ayrı bir aydınlatmaya gerek yok. Bu ekranı alırken monokrom olanlar gibi iki renkli seçenekleri de var. 3.3 volt lojik seviye ile çalışıyor ama kart üzerinde 5v-3.3 v dönüştürücü olduğundan 5 volta bağlanabiliyor. Yaklaşık 20 mA akım çekiyor. Ayrıca bunun en yakın arkadaşı ve en sık kullanılan başka bir modeli de biraz daha büyük (0.96 inç) olan ve aynı sürücüyü kullanan 128×64 modeli. Farkı anladınız…

Bu küçük boyutuna rağmen bu ekrana da bitmap resmi, şekiller, harfler, rakamlar, özel karakterler yazabiliyor, bunları hareketlendirebiliyoruz. Resimlerden farke ettiyseniz bağlantısı çok kolay. Dört bacağı var:

img_20190501_142822.jpg

SDA : Veri (Data) pini

SCl:    Saat (Clock) pini

VCC: Besleme gerilimi (3.3-5 volt)

GND: Toprak hattı

 

Bu modül I2C (I kare C ya da I iki C şeklinde okunabiliyor. İsmi Inter Integrated Circuit, (entegre devreler arası), iki I bir C) protokolü ile haberleşme sağlıyor. Hatırlıyorsanız Daha önce iki tür seri haberleşme görmüştük. Birinci model Arduino’nun bilgisayarla haberleştiği (Rx ve Tx kullanarak) asenkron seri haberleşme, diğeri ise Nokia 5110 display’in Arduino ile haberleşmede kullanılan senkronize seri haberleşme (MOSI, MISO, saat sinyali olan). Burada kullanılan I2C protokolü ise birden fazla çevre biriminin bir mikrodenetleyici ile kullanılmasını kolaylaştıran bir sistem (Hatta 1602 LCD ekranını da o kadar kablo yerine I2C sistemi ile bağlantı sağlayan aparattan bahsetmiştik)

I2C

Bağlantı bu kadar basit. Microdenetleyici aynı hat üzerinden kendisine bağlanan tüm çevre birimlerini kontrol ediyor. Birden fazla mikrodenetleyici de bağlanabiliyor. Ve sadece SDA ve SCL kabloları üzerinden! (Her bir çevre biriminin +Vcc ve Gnd bağlantıları unutulmasın) Güzel, basit bir bağlantı. Arduino’da bu bacaklar kendi sayfasında (https://www.arduino.cc/en/reference/wire) belirtilmiş.

wire

Uno için SDA hattı A4, SCL hattı da A5 pinlerine bağlanıyor. Bu arada yukarıdaki resimde başlık “Wire Library”! yani kod yazarken I2C ile haberleştiğini Arduino’ya anlatabilmek için bu kütüphaneyi başta çağırmak gerekiyor demekki!

Tamam da mikrodenetleyici aynı hattaki bir çevre birimini diğerinden nasıl ayırt ediyor? Cevap tahmin ettiğiniz gibi: her birimin bir adı (adresi) var. Şimdi sorun şu bizim kullanacağımız OLED’in adresi nedir? Yine Arduino’nun kendi sayfasında (http://playground.arduino.cc/Main/I2cScanner) bu birimin adresini gösteren bir kod var:

  1. #include <Wire.h>
  2. void setup()
  3. {
  4.   Wire.begin();
  5.   Serial.begin(9600);
  6.   while (!Serial);
  7.   Serial.println(\nI2C Scanner”);
  8. }
  9. void loop()
  10. {
  11.   byte error, address;
  12.   int nDevices;
  13.   Serial.println(“Scanning…”);
  14.   nDevices = 0;
  15.   for(address = 1; address < 127; address++ )
  16.   {
  17.     Wire.beginTransmission(address);
  18.     error = Wire.endTransmission();
  19.     if (error == 0)
  20.     {
  21.       Serial.print(“I2C device found at address 0x”);
  22.       if (address<16)
  23.         Serial.print(“0”);
  24.       Serial.print(address,HEX);
  25.       Serial.println(”  !”);
  26.       nDevices++;
  27.     }
  28.     else if (error==4)
  29.     {
  30.       Serial.print(“Unknown error at address 0x”);
  31.       if (address<16)
  32.         Serial.print(“0”);
  33.       Serial.println(address,HEX);
  34.     }
  35.   }
  36.   if (nDevices == 0)
  37.     Serial.println(“No I2C devices found\n);
  38.   else
  39.     Serial.println(“done\n);
  40.   delay(5000);           // wait 5 seconds for next scan
  41. }

Bu kodu aynen kopyalayıp Arduino IDE üzerinden yükleme yaptığımızda seri ekranı açıp kullanacağımız display’in adresini öğrenebiliyoruz. Tabi önce OLED bağlantılarını yapalım.

devre şeması

adres

Benim OLED’in adresi: 0x3C imiş(Üreticinin sayfasında da verilmiş). Bu arada bu adresin hex formatında olduğu dikkatinizi çekmiştir. Bunu kod yazarken kullanacağız.

Ayrıca OLED’in kütüphanesini de indirip Arduino kütüphaneleri arasına eklemeliyiz. Bunun için : https://github.com/adafruit/Adafruit_SSD1306 adresinden download zip yapıp, Arduino IDE üzerinden Taslak/.zip kütüphane ekle diyerek indirdiğimiz zip dosyayı ekliyoruz. (Daha önce gördüğümüz için ayrıntıya girmiyorum)

Şimdi IDE çalıştırılıp : Dosya/ Örnekler/  Adafruit SSD1306/ ssd1306_128x32_i2c açılıp yükleme yapıldığında ekranımızın nasıl çalıştığını görebiliriz.

Bu kodda önce gerekli kütüphenler çağrılmış. SSD1306 başka OLED’ler için de kullanılabildiği için 128×32 tanımlanmış, Adafruit sembolü bitmap olarak tanımlanmış.

#include <Wire.h>
#include <Adafruit_GFX.h>             //Grafikler için gelişmiş kütüphane
#include <Adafruit_SSD1306.h>     // Sadece yazılar için daha basit olanı

#define SCREEN_WIDTH 128        // OLED display genişliği (piksel)
#define SCREEN_HEIGHT 32         // OLED display yüksekliği (piksel)

// SSD1306 display’in bacak bağlantıları- I2C (SDA, SCL pinleri)

#define OLED_RESET 4                    // Reset pini
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

#define NUMFLAKES 10

#define LOGO_HEIGHT 16
#define LOGO_WIDTH 16
static const unsigned char PROGMEM logo_bmp[] =
{ B00000000, B11000000,
B00000001, B11000000,
B00000001, B11000000,
B00000011, B11100000,
B11110011, B11100000,
B11111110, B11111000,
B01111110, B11111111,
B00110011, B10011111,
B00011111, B11111100,
B00001101, B01110000,
B00011011, B10100000,
B00111111, B11100000,
B00111111, B11110000,
B01111100, B11110000,
B01110000, B01110000,
B00000000, B00110000 };

“Numflake” dediği ekrandaki son animasyonda kar tanesi benzeri cisimlerin animasyonu var. Burada onları dayısı 10 olarak tanımlanmış. Setup kısmında OLED adresi tanımlanmış, yanlış olması durumunda uyarı mesajı için seri haberleşme başlatılmış ve uyarı yollanmış.

Serial.begin(9600);

if(!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) { // 128×32 için adres 0x3C 
Serial.println(F(“SSD1306 allocation failed”));
for(;;);        // Sonsuz döngü
}

display.display(); komutu ile ekran aktive edilmiş. Ekrandaki her çizimden sonra bu komuta ihtiyaç duyulduğu belirtiliyor.

display.clearDisplay(); komutu ekranı temizliyor.

display.drawPixel(10, 10, WHITE); yatayda ve düşeyde 10.piksellerin kesiştiği yere bir beyaz nokta geliyor. Sonra sırasıyla hazırlanan fonksiyonlar başlamış. Bu fonksiyonlar programın alt satırlarında tanımlanmış.

testdrawline(); // Draw many lines                  :Ekranda oluşan çizgiler,
testdrawrect(); // Draw rectangles (outlines) : İçi boş dikdörtgen,
testfillrect(); // Draw rectangles (filled)           : İçi dolu dikdörtgen,
testdrawcircle(); // Draw circles (outlines)     : İçi boş daire, gibi.

Ekran arka planı bir saniyeliğine beyaz yapılıp bir saniye eski haline dönmüş:

display.invertDisplay(true);
delay(1000);
display.invertDisplay(false);
delay(1000);

Karakterin boyutu,  display.setTextSize(1); ile belirleniyor. Parantezin içerisindeki sayı 1 ise 4 satır sığıyor. Yatayda da 21 karakter.  2, 3, ya da 4 yapabilirsiniz. Bunlar düşeyde 8’in katsayıları. 2 yaparsanız 2 satır olabiliyor, 3 ve 4’de ise sadece bir satır yazabiliyorsunuz.

IMG_20190503_150214

display.setTextColor(BLACK, WHITE); komutuyla sadece yazdığınız yazının (tüm ekranın değil) negatifini alabiliyorsunuz. eski hale döndürmek için: display.setTextColor(WHITE);

IMG_20190503_150212

display.setCursor(10, 0); komutu imlecin gideceği yeri gösteriyor. İlk değer yatay, ikinci değer düşey konumlar.

İnceleme şimdilik bu kadar. Kod üzerinde oynama yaparak istediğimiz değişiklikleri yapmak mümkün. Deneme yanılma usulü. Gelecek projelerimizde bu ekranın kendi amacımıza uygun kullanımını göreceğiz.

Hoşça kalın…

 

Kaynaklar:

Teknik Özellikler: https://www.adafruit.com/product/931

Arduino SDA ve SCL bağlantıları için: https://www.arduino.cc/en/reference/wire

OLED adresini bulmak için:  http://playground.arduino.cc/Main/I2cScanner

OLED kütüphanesi için: https://github.com/adafruit/Adafruit_SSD1306

Daha ayrıntılı bilgi için: https://lastminuteengineers.com/oled-display-arduino-tutorial/