Arduino ile SSD1306 OLED Ekran Kullanımı (I2C) — Devre ve Örnek Kod
Küçük projelerde seri monitöre bağlı kalmadan veri göstermek büyük rahatlık. 0.96” SSD1306 OLED ekranlar hem ucuz hem de çok az pinle çalıştığı için Arduino projelerinde sık tercih ediliyor. Bu yazıda, I2C üzerinden SSD1306 OLED’i bağlayıp kütüphane ile yazı/şekil çizdiren örnek bir devre ve kod paylaşacağım.
Kullanılan Malzemeler
-
Arduino Uno / Nano (benzerleri de olur)
-
0.96” OLED ekran (SSD1306, I2C, genelde 128x64)
-
Breadboard + jumper kablo
-
(Opsiyonel) 1 adet buton (ekran mod değişimi için)
1) OLED SSD1306 I2C Pinleri ve Devre Bağlantısı
SSD1306 I2C OLED’lerde genellikle 4 pin olur:
-
VCC: Besleme (5V veya 3.3V; modüle göre değişebilir)
-
GND: Toprak
-
SCL: I2C saat hattı
-
SDA: I2C veri hattı
Arduino Uno / Nano için bağlantı (I2C)
| OLED Pin | Arduino Uno/Nano |
|---|---|
| VCC | 5V (bazı modüller 3.3V ister, etiketine bak) |
| GND | GND |
| SCL | A5 |
| SDA | A4 |
Not: Arduino Uno’da I2C pinleri A4 (SDA) ve A5 (SCL)’dir. Bazı Uno kartlarında ayrıca “SDA/SCL” yazan ayrı pinler de bulunur, aynı hatta bağlıdır.
2) Kütüphane Kurulumu (Adafruit SSD1306)
Arduino IDE’de:
-
Tools → Manage Libraries…
-
Şunları aratıp yükle:
-
Adafruit SSD1306
-
Adafruit GFX Library
-
-
(Gerekirse) Adafruit BusIO otomatik gelir, gelmezse onu da yükle.
Bu kombinasyon en yaygın ve en sorunsuz çözümlerden biri.
3) I2C Adresini Kontrol Etme (0x3C / 0x3D)
SSD1306 OLED’ler çoğunlukla 0x3C adresiyle gelir; bazen 0x3D olur. Eğer ekran gelmiyorsa adres uyuşmazlığı çok olasıdır.
İstersen I2C tarayıcı kodu ile adresi bulabilirsin (kısa örnek):
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("I2C taraniyor...");
for (byte addr = 1; addr < 127; addr++) {
Wire.beginTransmission(addr);
if (Wire.endTransmission() == 0) {
Serial.print("Bulunan adres: 0x");
Serial.println(addr, HEX);
}
}
}
void loop() {}
4) Örnek Proje: Başlık + Sensör Gibi Değer Gösterimi + Basit Çizimler
Aşağıdaki kod:
-
Ekranı başlatır
-
Üstte başlık basar
-
Ortada sayacı (örnek veri) gösterir
-
Alt kısımda basit bir “bar” (doluluk çubuğu) çizer
Arduino Kodu (SSD1306 128x64)
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// Ekran boyutları
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
// Reset pini (bazı modüllerde yoktur; -1 kullanılabilir)
#define OLED_RESET -1
// I2C adresi (genelde 0x3C)
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
unsigned long lastUpdate = 0;
int counter = 0;
void setup() {
Serial.begin(9600);
// OLED başlat
if (!display.begin(SSD1306_SWITCHCAPVCC, OLED_ADDR)) {
Serial.println("OLED baslatilamadi! Adres/bağlanti kontrol edin.");
while (true) { }
}
display.clearDisplay();
display.setTextColor(SSD1306_WHITE);
display.setTextSize(1);
// Açılış ekranı
display.setCursor(0, 0);
display.println("SSD1306 OLED Demo");
display.println("----------------");
display.println("Baslatiliyor...");
display.display();
delay(1200);
}
void loop() {
// Her 300 ms'de bir güncelle
if (millis() - lastUpdate > 300) {
lastUpdate = millis();
counter++;
// 0-100 arası örnek "değer"
int value = counter % 101;
// Ekranı temizle
display.clearDisplay();
// Başlık
display.setTextSize(1);
display.setCursor(0, 0);
display.println("Arduino + SSD1306");
// Büyük değer
display.setTextSize(2);
display.setCursor(0, 18);
display.print("Deger: ");
display.println(value);
// Bar çizimi
// Çerçeve
int barX = 0, barY = 52, barW = 128, barH = 10;
display.drawRect(barX, barY, barW, barH, SSD1306_WHITE);
// Doluluk
int fillW = map(value, 0, 100, 0, barW - 2);
display.fillRect(barX + 1, barY + 1, fillW, barH - 2, SSD1306_WHITE);
// Ekrana bas
display.display();
}
}
5) Sık Karşılaşılan Sorunlar ve Çözümler
Ekran hiç açılmıyor / bembeyaz / tamamen siyah
-
I2C adresi yanlış olabilir (0x3C yerine 0x3D).
-
SDA/SCL ters bağlanmış olabilir.
-
Modül 3.3V isterken 5V vermiş olabilirsin (modüle göre değişir).
-
“Reset” pini gerekmiyorsa
-1doğru; bazı ekranlarda farklı olabilir.
Yazılar taşmış / kesiliyor
-
setTextSize(2)ile yazı büyüyünce 128x64 alana sığmayabilir. -
Daha kompakt yerleşim veya
setTextSize(1)kullan.