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:
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
- Ekranın Hiç Açılmaması (Siyah Ekran): En yaygın neden I2C adresinin yanlış olmasıdır. Kartınızın adresi
0x3Cyerine0x3Dolabilir. Bir I2C Scanner kodu yükleyerek seri porttan doğru adresi doğrulayın. - 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.
- 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.