Gömülü sistem ve IoT projelerinde sistem durumunu, sensör değerlerini veya ağ bağlantı bilgilerini kullanıcıya anlık olarak göstermek projenin kullanılabilirliğini artıran en önemli unsurdur. 0.96 inç ve 1.3 inç SSD1306 OLED ekranlar; düşük güç tüketimi, yüksek kontrast oranı (arka aydınlatmaya ihtiyaç duymaz) ve sadece 4 pin (I2C) ile bağlanabilme kolaylığı sayesinde ESP32 projelerinde en çok tercih edilen ekran modülleridir.

ESP32 ve SSD1306 I2C Donanım Bağlantısı

ESP32 mikrodenetleyicisinde donanımsal I2C haberleşmesi için varsayılan pinler tanımlıdır. SSD1306 ekranınızı ESP32 NodeMCU kartına aşağıdaki pin tablosuna göre bağlamalısınız:

OLED Pin ESP32 Pin Açıklama
GND GND Topraklama hattı
VCC 3.3V (veya VIN) ESP32 3.3V mantıksal voltaj seviyesiyle beslenmelidir
SCL (SCK) GPIO 22 I2C Saat Hattı (Clock)
SDA GPIO 21 I2C Veri Hattı (Data)
Kritik Uyarı: Piyasadaki bazı SSD1306 modüllerinde VCC ve GND pinlerinin sırası terstir (GND önce veya VCC önce). Bağlantıyı yapmadan önce mutlaka ekran modülü üzerindeki serigrafi etiketleri kontrol edin; ters voltaj modülü anında yakabilir.

Kütüphane Seçimi: Adafruit SSD1306 vs U8g2

Arduino IDE üzerinde SSD1306 ekranları sürmek için başlıca iki popüler kütüphane bulunur:

  • Adafruit_SSD1306: Kullanımı en kolay, başlangıç dostu ve doğrudan çizim fonksiyonları (daire, dikdörtgen, bitmap) sunan kütüphanedir. Ancak tüm ekranı RAM üzerinde (128x64 piksel = 1024 byte buffer) tutar. ESP32 gibi 520 KB SRAM'e sahip güçlü çiplerde bellek tüketimi sorun oluşturmaz.
  • U8g2: Sayfa tamponlama (page buffering) mimarisiyle çalışır. Türkçe karakter ve yüzlerce farklı font desteği sunar, ancak kodlama yapısı biraz daha karmaşıktır.

Çalışan Arduino C++ Örnek Kodu (Sensör Dashboard)

Aşağıdaki kod örneğinde, ESP32 başlatıldığında ekranın I2C adresini doğrular, açılış animasyonu gösterir ve periyodik olarak sensör değerleri ile WiFi sinyal gücünü (RSSI) güncelleyen bir dashboard arayüzü çizer:

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define SCREEN_ADDRESS 0x3C // Bazı ekranlarda 0x3D olabilir

Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

// Örnek sensör değişkenleri
float temperature = 24.8;
int humidity = 58;

void setup() {
    Serial.begin(115200);

    // I2C başlat (SDA: GPIO 21, SCL: GPIO 22)
    Wire.begin(21, 22);

    if(!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) {
        Serial.println(F("SSD1306 OLED ekran bulunamadi! Baglantilari kontrol edin."));
        for(;;); // Hata durumunda döngüde kal
    }

    display.clearDisplay();
    display.setTextColor(SSD1306_WHITE);

    // Başlangıç Logo Ekranı
    display.setTextSize(2);
    display.setCursor(10, 15);
    display.println("KODKATMAN");
    display.setTextSize(1);
    display.setCursor(20, 38);
    display.println("IoT Dashboard");
    display.display();
    delay(2000);
}

void drawDashboard(float temp, int hum) {
    display.clearDisplay();

    // Üst Bilgi Barı
    display.setTextSize(1);
    display.setCursor(0, 0);
    display.print("WiFi: ON");
    display.setCursor(80, 0);
    display.print("BAT: 92%");
    display.drawLine(0, 10, 128, 10, SSD1306_WHITE);

    // Sıcaklık Kutusu
    display.drawRoundRect(0, 16, 60, 44, 4, SSD1306_WHITE);
    display.setCursor(6, 22);
    display.print("SICAKLIK");
    display.setTextSize(2);
    display.setCursor(6, 36);
    display.print((int)temp);
    display.setTextSize(1);
    display.print(" C");

    // Nem Kutusu
    display.setTextSize(1);
    display.drawRoundRect(66, 16, 60, 44, 4, SSD1306_WHITE);
    display.setCursor(76, 22);
    display.print("BAGIL NEM");
    display.setTextSize(2);
    display.setCursor(74, 36);
    display.print(hum);
    display.setTextSize(1);
    display.print(" %");

    display.display();
}

void loop() {
    // Sensör simülasyonu
    temperature += (random(-5, 6) / 10.0);
    humidity += random(-1, 2);

    drawDashboard(temperature, humidity);
    delay(1000);
}

Sık Karşılaşılan Hatalar ve Çözümleri

  1. Ekranın Hiç Açılmaması (Siyah Ekran): En yaygın neden I2C adresinin yanlış olmasıdır. Kartınızın adresi 0x3C yerine 0x3D olabilir. Bir I2C Scanner kodu yükleyerek seri porttan doğru adresi doğrulayın.
  2. Ekranın Donması veya Rastgele Çizgiler: I2C hattı gürültüye duyarlıdır. Kabloların 20 cm'den uzun olmamasına özen gösterin veya SDA ve SCL hatlarına 4.7kΩ pull-up direnci bağlayın.
  3. Düşük FPS (Yenileme Hızı): I2C saat hızını varsayılan 100 kHz yerine Wire.setClock(400000); komutuyla 400 kHz (Fast Mode) seviyesine çıkararak çizim hızını 4 kat artırabilirsiniz.
Proje Fikri: Bu ekranı daha önce yayımladığımız ESP32 ve MQTT Rehberimizle birleştirerek, AWS veya yerel MQTT broker'ınızdan gelen uzaktan komutları anlık gösteren akıllı bir IoT terminali inşa edebilirsiniz.