Bu örnekte U8GLib kütüphanesinin Page Loop yapısını kullanarak 0.96 I2C 128X64 OLED üzerinde basit bir uygulama gerçekleştireceğiz. İhtiyacımız olanlar:

  • Arduino UNO
  • 0.96 I2C 128X64 OLED (4 pinli)
  • Bir kaç kablo ve breadboard

U8GLib kullanımı gerçekten çok kolay olan bir kütüphane. OLED bağlantıları da oldukça sade. Eğer U8Glib kütüphanesi ekli değilse Arduino IDE'si üzerindeki Sketch>Include Library>Manage Libraries menüsünü seçerek u8glib kütüphanesini ekleyelim. Bağlantıyı da aşağıdaki gibi yaptıktan sonra "Merhaba Dünya" uygulamasını modülümüze yüklemeye hazırız demektir.

Connections
Arduino UNO - OLED bağlantısı

Eğer elinizdeki OLED SSD1306 değilse ilgili satırı değiştirmeniz gerekebilir.


#include "U8glib.h"


U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);	// I2C / TWI 

void sayfaYazdir() {
  u8g.setFont(u8g_font_unifont);
  u8g.drawStr( 0, 22, "Merhaba Cuneyt");
}

void setup(void) {
  
}

void loop(void) {
  // picture loop
  u8g.firstPage();
  int i = 0;
  do {
    sayfaYazdir();
  } while( u8g.nextPage() );
  
  delay(1000);
}


İlk uygulama bu kadar basit. Ancak benim üzerinde durmak istediğim kısım "Page Loop" yapısı. Dikkat ederseniz kod üzerinde iki tane döngü(loop) var. Birincisi Arduino'nun kendi döngüsü diğeri ise OLED'in sayfa döngüsü. OLED'in sayfaYazdir() fonksiyonunu çalıştırdığı kısımda yalnızca ve yalnızca çizim komutlarını çalıştırmamız gerekiyor. Global değişkenleri bu döngüde çalıştırırsak programımız istenmeyen sonuçlar üretebilir.

Yukarıdaki örnek yalnızca tek bir sayfadan oluşmakta. Biraz daha gelişmiş bir örnek yapmaya çalışalım. Benim 3 tane sensörüm olsun. Birincisi zaman sensörü (aslında saat de bir nevi sensör), ikincisi sıcaklık ve üçüncüsü de nem sensörü olsun. Son sayfada da kendi adımı ya da şirketimin adını yazdıralım. 4 sayfamız oldu ve elimizdeki sensörlere göre bu sayı daha da artabilir. Bu yüzden merhaba dünya uygulamasındaki döngüyü defalarca kopyalayıp yapıştırmaktansa, fonksiyon işaretçileri(pointers) yaratarak daha modüler bir program yazabilirim. Böylelikle her sensörün fonksiyonunu birbirinden ayırmış olurum. Aşağıdaki örnekte basitlik açısından sensör kullanılmadı. Uygulamaya sensör eklenirken sensörle ilgili okumalar kesinlikle u8g.firstPage(); u8g.nextPage() arasında yapılmamalıdır. Sensör okumaları Arduino'nun kendi loop'unda u8g.firstPage() komutundan önce ya da nextPage'ten sonra geçekleştirilmelidir.


#include "U8glib.h"
#include 

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE|U8G_I2C_OPT_DEV_0);  // I2C / TWI 

void sayfaZaman();       // Sayfa-1
void sayfaSicaklik();    // Sayfa-2
void sayfaNem();         // Sayfa-3
void sayfaHakkimda();    // Sayfa-4

const int sayfaSayisi = 4;
int p;
void (*sayfalar[sayfaSayisi])() = { sayfaZaman, sayfaSicaklik, sayfaNem, sayfaHakkimda };
int sure [sayfaSayisi] = { 1000, 1000, 1000, 2000 };


void setup() {  
  u8g.setFont(u8g_font_unifont);
  u8g.setColorIndex(1);
  p = 0;
  Serial.begin(9600);
}

void loop() {  
  u8g.firstPage();
  do {  
    (*sayfalar[p])();
  } while( u8g.nextPage() );
  delay(sure[p]);
  p = p+1;
  if (p == sayfaSayisi)
    p=0;
}
  


void sayfaZaman() {
  Serial.write("Zaman");
  Serial.println();
  u8g.drawStr( 0, 15, "Agustos 2017");
  return 0; 
}
void sayfaSicaklik(){
  Serial.write("Sicaklik");
  Serial.println();
  u8g.drawStr( 0, 15, "27 derece"); 
  return 0;
}
void sayfaNem() {
  Serial.write("Nem");
  Serial.println();
  u8g.drawStr( 0, 15, "%65 nem"); 
  return 0;
}
void sayfaHakkimda(){
  Serial.write("Hakkimda");
  Serial.println();
  u8g.drawStr( 0, 15, "Cuneyt"); 
  u8g.drawStr( 0, 30, "Aliustaoglu"); 
  return 0;
}