Herkese Merhaba, Bu yazım da I2C’yi ve 16x2 LCD’yi tanıyacak ve kullanacağız. Hemen başlayalım!
Bunu Oku!
Eğer 16x2 LCD Ekran hakkında daha ayrıntılı ve I2C’siz kullanımını öğrenmek isterseniz buraya tıklayarak öğrenebilirsiniz. Ayrıca rehber blogları ile bu blog desteklenecektir. ✨
I2C Adaptörü Nedir?
I2C çipinde 8-Bit G/Ç Genişletici yongası - PCF8574 bulunur. Bu çip, bir Arduino’dan gelen I2C verilerini LCD ekranın gerektirdiği paralel verilere dönüştürür.

I2C’de ayrıca, ekranın kontrastında ince ayarlar yapmak için küçük bir trimpot bulunur. Tornavida ile çevirerek parlaklığını ayarlayabilirsiniz.

Ek olarak, I2C’de arka ışığa güç sağlayan bir pinli kablo bulunur. Arka ışığın yoğunluğunu kontrol etmek için kablo çıkarabilir ve “LED” olarak işaretlenmiş başlık pimine harici bir voltaj uygulayabilirsiniz.
Daha fazla ayrıntıya girmeden bağlantı şekline geçelim.
I2C LCD Bağlantısı (Pinout)
I2C LCD dönüştürücü modülü Arduino’ya yalnızca 4 kablo ile bağlanır: VCC 5V’a, GND toprağa, SDA A4’e ve SCL A5’e (Arduino Uno için).

SDA ve SCL pinleri her kartta farklı yerdedir. Kendi kartınıza göre bakın:
| Kart | SDA | SCL | VCC |
|---|---|---|---|
| Arduino Uno / Nano | A4 | A5 | 5V |
| Arduino Mega 2560 | 20 | 21 | 5V |
| Arduino Leonardo / Micro | 2 | 3 | 5V |
| ESP32 (varsayılan) | GPIO21 | GPIO22 | 5V (VIN) |
| ESP8266 / NodeMCU | D2 (GPIO4) | D1 (GPIO5) | 5V (VIN) |
| Raspberry Pi Pico | GP4 | GP5 | VBUS (5V) |
Kartınızın hangi pininin I2C olduğundan emin değilseniz Arduino Pinout ve ESP32 Pinout araçlarından bakabilirsiniz.
Doğru I2C Adresini Bulun
Bu, en sık takılınan adım. Modüller ya 0x27 ya da 0x3F adresini kullanır, ama istisnalar var. Yanlış adres hiçbir hata vermez, ekran sadece boş kalır. Tahmin etmek yerine tarayın:
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
while (!Serial);
Serial.println("I2C taraniyor...");
byte bulunan = 0;
for (byte adres = 1; adres < 127; adres++) {
Wire.beginTransmission(adres);
if (Wire.endTransmission() == 0) {
Serial.print("Cihaz bulundu: 0x");
if (adres < 16) Serial.print("0");
Serial.println(adres, HEX);
bulunan++;
}
}
if (bulunan == 0) Serial.println("Hicbir cihaz yok. Kablolamayi kontrol edin.");
}
void loop() {}
Seri monitörü 9600 baud’a alın. Çıkan adresi koddaki LiquidCrystal_I2C lcd(...) satırına yazın. Hiçbir cihaz görünmüyorsa sorun yazılımda değil, kabloda veya beslemede.
Arduino IDE Kütüphanesi Kurulumu
Kütüphane kurulumunu bilmiyorsanız bu sayfaya bakabilirsiniz.
Kütüphane arama yerine liquidcrystal yazarak Frank de Brabander tarafından yapılmış LiquidCrystal I2C kütüphanesini indirin. Eğer bulamadıysanız bu linkten (tıkladığınız anda indirir) hızlıca indirip ZIP olarak ekleyin. (Arduino sitesinden indirmektedir.)
Burada nasıl ZIP olarak ekleyebileceğinize dair kısa bir bilgi yer almaktadır.
Kodlama
#include <LiquidCrystal_I2C.h> // kütüphaneyi ekledik
LiquidCrystal_I2C lcd(0x3F,16,2); // 16 karakter ve 2 satırlık bir ekran için LCD adresini 0x3F olarak ayarlandı.
void setup() {
lcd.init();
lcd.clear();
lcd.backlight(); // arka ışık açık
lcd.setCursor(2,0); // 3 satır sağa, 1 sütun aşağı
lcd.print("projedefteri.com");
}
void loop() {
}
Kütüphane Fonksiyonları
LiquidCrystal_I2C ile yapabileceğiniz her şey aşağıdaki listede. 20x4 ekran kullanıyorsanız kurucuyu lcd(0x27, 20, 4) olarak değiştirmeniz yeterli, kalan her şey aynı.
| Fonksiyon | Ne yapar |
|---|---|
lcd.init() | Ekranı başlatır. setup() içinde ilk çağrı olmalı. |
lcd.backlight() / lcd.noBacklight() | Arka ışığı açar / kapatır. |
lcd.clear() | Ekranı siler ve imleci başa alır. |
lcd.home() | İmleci silmeden sol üste alır. |
lcd.setCursor(sutun, satir) | İmleci konumlandırır. Sıfırdan başlar: sol üst (0, 0). |
lcd.print(...) | Yazı, sayı veya değişken basar. |
lcd.cursor() / lcd.noCursor() | Alt çizgi imlecini gösterir / gizler. |
lcd.blink() / lcd.noBlink() | Yanıp sönen blok imleci. |
lcd.display() / lcd.noDisplay() | İçeriği silmeden görüntüyü açar / kapatır. |
lcd.scrollDisplayLeft() / Right() | Tüm içeriği bir karakter kaydırır. |
lcd.createChar(indeks, bayt[]) | 0-7 arası indekse özel karakter yükler. |
lcd.write(indeks) | Özel karakteri basar. |
lcd.setCursor(2, 1) ikinci satırın üçüncü sütunu demektir, üçüncü satırın ikinci sütunu değil. Çoğu kişi bunu ters kullanıp yazının kaybolmasına şaşırır. 16x2 ekranda geçerli aralık sütun için 0-15, satır için 0-1’dir.Kayan Yazı (Scrolling Text)
16 karakter çoğu mesaj için yetmez. İki yöntem var.
1. Kütüphanenin kendi kaydırması. Tüm ekranı kaydırır, kısa mesajlar için yeterlidir:
void setup() {
lcd.init();
lcd.backlight();
lcd.setCursor(0, 0);
lcd.print("Proje Defteri - Arduino rehberleri");
}
void loop() {
lcd.scrollDisplayLeft();
delay(300);
}
2. Kendi penceresini kaydırmak. Daha kontrollü ve satır bazında çalışır:
String mesaj = "Sicaklik 23.4 C, Nem %48, Basinc 1013 hPa ";
int konum = 0;
void loop() {
lcd.setCursor(0, 0);
lcd.print(mesaj.substring(konum, konum + 16));
konum++;
if (konum > mesaj.length() - 16) konum = 0;
delay(300);
}
Bu yöntemde lcd.clear() çağırmadığımıza dikkat edin. Her seferinde tam 16 karakter bastığımız için eski içerik zaten üzerine yazılıyor; clear() eklemek gözle görülür bir titremeye sebep olur.
Özel Karakterler (Türkçe Harfler ve Semboller)
HD44780 denetleyicisi 0-7 arası sekiz özel karaktere yer ayırır. Her karakter 5x8 piksellik sekiz baytlık bir dizidir.
byte derece[8] = {
0b00110,
0b01001,
0b01001,
0b00110,
0b00000,
0b00000,
0b00000,
0b00000
};
void setup() {
lcd.init();
lcd.backlight();
lcd.createChar(0, derece); // 0 numarali yuvaya yukle
lcd.setCursor(0, 0);
lcd.print("Sicaklik: 23.4");
lcd.write(byte(0)); // derece isareti
lcd.print("C");
}
Sekiz yuva sınırı gerçek bir kısıttır. Sekizden fazla özel karaktere ihtiyacınız varsa createChar() ile çalışma anında yuvaları yeniden yükleyebilirsiniz, ama o an ekranda görünen karakterler de değişir.
Sorun Giderme
Ekran tamamen boş, arka ışık yanıyor
Kontrast ayarı. Modülün arkasındaki mavi trimpotu tornavidayla yavaşça çevirin. Fabrika ayarı çoğu zaman sıfıra yakındır ve hiçbir şey görünmez.
Sadece bir sıra dolu beyaz kare görünüyor
Klasik belirti: ekran çalışıyor ama Arduino veri göndermiyor. Genellikle yanlış I2C adresi ya da lcd.init() çağrılmamış demektir. Tarayıcı kodunu çalıştırın.
Arka ışık bile yanmıyor
Besleme sorunu. VCC ve GND’yi kontrol edin, ESP kartlarında 3.3V değil 5V kullandığınızdan emin olun. Modülde arka ışık için bir jumper varsa takılı olduğunu doğrulayın.
Yazı görünüyor ama karakterler bozuk
Genellikle besleme yetersizliği ya da çok uzun kablo. I2C hattı 20-30 cm’yi geçtiğinde sinyal bozulur. Ayrıca birçok sensörü aynı hatta bağladıysanız pull-up dirençleri yetmiyor olabilir.
Türkçe karakterler soru işareti çıkıyor
HD44780’in dahili karakter tablosunda Türkçe harfler yoktur. Yukarıdaki özel karakter yöntemini kullanmanız gerekir.
I2C ile bağladığınız ekranda kendi özel karakterlerinizi (Türkçe harfler, semboller vb.) göstermek isterseniz LCD Karakter Oluşturucu aracıyla ihtiyacınız olan byte dizisini saniyeler içinde üretebilirsiniz.
Sıkça Sorulan Sorular
I2C LCD Arduino’da hangi pinlere bağlanır? Arduino Uno’da SDA A4’e, SCL A5’e bağlanır; ayrıca 5V ve GND gerekir. Arduino Mega’da SDA 20, SCL 21 numaralı pindedir.
I2C LCD ekranda hiçbir şey görünmüyor, ne yapmalıyım? Önce modülün arkasındaki trimpot ile kontrastı ayarlayın. Sonra I2C adresini kontrol edin: çoğu modül 0x27 veya 0x3F adresini kullanır. İkisi de çalışmazsa I2C tarayıcı (scanner) kodu yükleyerek doğru adresi bulabilirsiniz.
I2C LCD modülünün adresi nedir? Modüldeki çipe göre değişir: PCF8574 çipli modüller genellikle 0x27, PCF8574A çipliler 0x3F adresini kullanır. Adres, koddaki LiquidCrystal_I2C lcd(0x27,16,2); satırına yazılır.
I2C LCD için hangi kütüphane gerekir? LiquidCrystal_I2C kütüphanesi. Arduino IDE Kütüphane Yöneticisi’nden veya yukarıdaki gibi ZIP olarak kurabilirsiniz.
20x4 LCD ile aynı kod çalışır mı? Evet. Tek değişiklik kurucu satırıdır: LiquidCrystal_I2C lcd(0x27, 20, 4);. Fonksiyonların tamamı aynı kalır, sadece setCursor aralığı sütunda 0-19, satırda 0-3 olur.
Aynı I2C hattına başka sensör bağlayabilir miyim? Evet, I2C’nin varlık sebebi budur. SDA ve SCL hatlarına paralel bağlayın, yeter ki adresleri farklı olsun. LCD 0x27, BME280 0x76, DS3231 0x68 kullanır; çakışma olmaz. Aynı adresli iki cihaz için TCA9548A gibi bir çoklayıcı gerekir.
I2C LCD’de kayan yazı nasıl yapılır? İki yol var: kütüphanenin lcd.scrollDisplayLeft() fonksiyonuyla tüm ekranı kaydırmak, veya uzun metnin 16 karakterlik penceresini substring() ile kendiniz kaydırmak. İkinci yöntem satır bazında çalıştığı için daha kullanışlıdır; örnek kod yukarıdaki kayan yazı bölümünde.
I2C LCD mi OLED mi kullanmalıyım? Sadece yazı gösterecekseniz I2C LCD daha ucuz, daha okunaklı ve neredeyse hiç RAM tüketmez. Grafik, ikon veya animasyon istiyorsanız SSD1306 OLED gerekir; karşılığında Arduino Uno’da 1 KB RAM harcarsınız. Detay için Arduino OLED SSD1306 rehberine bakabilirsiniz.
Eğer herhangi bir sorun yaşadıysanız bağlantılarınızı kontrol etmeyi unutmayın veya yorumlardan sorularınızı, görüş ve önerilerinizi gönderebilirsiniz! İyi kodlamalar! 😁
İlgili Araçlar ve Yazılar
- LCD Karakter Oluşturucu - 5x8 özel karakter tasarlayın,
createChar()kodunu alın - I2C LCD Kod Üretici - hazır LiquidCrystal_I2C kodu üretin
- Arduino Pinout - kartınızın I2C pinlerini bulun
- 16x2 LCD Dev Rehber - I2C’siz, paralel bağlantı
- Arduino OLED SSD1306 Rehberi - grafik ekran tarafı
