Parçalar · 4 dk okuma

I2C LCD Ekran (16x2) Kullanımı: Arduino, ESP32 ve Pico ile Yazı Yazdırma

16x2 I2C LCD ekran Arduino'ya nasıl bağlanır? 4 kablolu bağlantı, I2C adresini bulma (0x27, 0x3F), LiquidCrystal_I2C kütüphanesi, kontrast ayarı, özel karakter ve Türkçe harfler.

16x2 LCD ekran, 2 satır ve her satırda 16 karakter gösterebilen, Arduino dünyasının en yaygın ekranıdır. Sıcaklık ve mesafe gibi ölçüm değerlerini, menüleri, saatleri ve oyun skorlarını göstermek için kullanılır. Ekranın kendisi 16 pinlidir ve tek başına en az 6 dijital pin ister; arkasına lehimlenen küçük I2C modülü bu sayıyı yalnızca 2 veri kablosuna indirir. Bu yazıda I2C LCD'yi bağlamayı, adresini bulmayı ve ekrana istediğini yazdırmayı adım adım göreceksin.

I2C modüllü 16x2 LCD ekran
I2C modüllü 16x2 LCD: arkadaki küçük kart sayesinde yalnızca 4 kabloyla bağlanır.

LCD ekran nasıl çalışır?

Bu ekranlar HD44780 adlı bir sürücü yongayla çalışır. Her karakter 5x8 piksellik küçük bir kutuda çizilir ve yonganın içinde harf, rakam ve bazı simgelerden oluşan hazır bir karakter tablosu bulunur. Arduino sadece "şu konuma şu harfi yaz" komutunu gönderir; harfi piksellere dönüştürmek ekranın işidir. Arka plandaki LED ışık yazının karanlıkta da okunmasını sağlar, sıvı kristal katman ise pikselleri karartarak yazıyı oluşturur.

I2C nedir, neden kolaylaştırır?

I2C, iki kabloyla birden fazla cihazın konuşabildiği bir haberleşme yoludur: SDA veriyi, SCL ise saat sinyalini taşır. Her cihazın kendine ait bir adresi vardır; Arduino konuşmak istediği cihazı adresiyle çağırır. LCD modülleri genellikle 0x27 ya da 0x3F adresini kullanır. Aynı iki kabloya saat modülü, OLED ekran ve BME280 gibi sensörler de bağlanabilir; adresleri farklı olduğu sürece hepsi birlikte çalışır.

PCF8574 I2C LCD adaptör modülü
PCF8574 tabanlı I2C modülü: mavi trimpot kontrastı ayarlar, jumper ise arka ışığı açıp kapatır.

Modülün üzerindeki PCF8574 yongası, I2C'den gelen komutları ekranın beklediği 8 paralel sinyale çevirir. Ekranı I2C modülü olmadan da kullanabilirsin, ama o durumda 6 pin, bir potansiyometre ve çok sayıda kablo gerekir. Modül hem pin tasarrufu sağlar hem de devreni sadeleştirir.

Teknik özellikler

ÖzellikDeğer
Görüntü16 sütun × 2 satır karakter
Karakter boyutu5 × 8 piksel
Sürücü yongaHD44780 (ya da uyumlu)
I2C adaptörüPCF8574 / PCF8574A
Varsayılan adres0x27 (PCF8574) ya da 0x3F (PCF8574A)
Besleme5 V, arka ışık açıkken yaklaşık 20–30 mA
BağlantıGND, VCC, SDA, SCL

I2C LCD bağlantısı: Arduino, ESP32 ve Pico

Bağlantı tüm kartlarda aynı dört kablodur; değişen tek şey SDA ve SCL'nin hangi pinlerde olduğudur. Kartının I2C pinlerini görmek için Pinout aracına bakabilirsin.

LCD piniArduino Uno / NanoArduino MegaESP32Raspberry Pi Pico
GNDGNDGNDGNDGND
VCC5V5VVIN (5V)VBUS (5V)
SDAA420GPIO 21GP4
SCLA521GPIO 22GP5
I2C modülü SDA ve SCL hatlarını kendi VCC'sine, yani 5 V'a çeker. ESP32 ve Pico'nun pinleri 3,3 V'tur. Pratikte çoğu zaman sorunsuz çalışsa da en güvenli yol arada iki yönlü bir I2C seviye dönüştürücü kullanmak ya da modülün üzerindeki pull-up dirençlerini söküp hatları 3,3 V'a çekmektir.

I2C adresini bulma: tarayıcı kodu

Ekranının adresinden emin değilsen aşağıdaki kodu yükle. Kod 1'den 126'ya kadar bütün adresleri tek tek dener ve cevap veren her cihazın adresini Seri Monitör'e yazar. Ekranı tanımlarken bu adresi kullanacaksın.

Arduino (C++)
1#include <Wire.h>
2
3void setup() {
4  Wire.begin();
5  Serial.begin(9600);
6  Serial.println("I2C taranıyor / scanning...");
7  for (byte addr = 1; addr < 127; addr++) {
8    Wire.beginTransmission(addr);
9    if (Wire.endTransmission() == 0) {   // cihaz cevap verdi / device answered
10      Serial.print("Bulundu / found: 0x");
11      Serial.println(addr, HEX);
12    }
13  }
14}
15
16void loop() {
17}

Kütüphaneyi kurmak ve ekrana yazı yazdırmak

Kütüphane Yöneticisi'nde LiquidCrystal I2C ara ve Frank de Brabander'in kütüphanesini kur. Aşağıdaki kod ilk satıra bir selam, ikinci satıra ise Arduino çalışmaya başladığından beri geçen süreyi saniye olarak yazar.

Arduino (C++)
1#include <Wire.h>
2#include <LiquidCrystal_I2C.h>
3
4LiquidCrystal_I2C lcd(0x27, 16, 2);  // adres, sütun, satır / address, columns, rows
5
6void setup() {
7  lcd.init();
8  lcd.backlight();               // arka ışığı aç / backlight on
9  lcd.setCursor(0, 0);           // sütun 0, satır 0 / column 0, row 0
10  lcd.print("Merhaba Dunya!");
11}
12
13void loop() {
14  lcd.setCursor(0, 1);           // ikinci satır / second row
15  lcd.print("Sure: ");
16  lcd.print(millis() / 1000);    // saniye / seconds
17  lcd.print(" sn   ");           // eski rakamları sil / clear old digits
18  delay(200);
19}
Ekran yanıyor ama yazı görünmüyorsa ya da üst satırda sadece dolu kareler varsa modülün arkasındaki mavi trimpotu küçük bir tornavidayla yavaşça çevir. Bu kontrast ayarıdır ve "ekranım çalışmıyor" sorunlarının çoğu buradan çözülür.

En çok kullanılan LCD komutları

KomutNe yapar?
lcd.init()Ekranı başlatır; setup() içinde bir kez çağrılır.
lcd.backlight() / lcd.noBacklight()Arka ışığı açar ya da kapatır.
lcd.setCursor(sütun, satır)Yazının başlayacağı konumu seçer; sayım 0'dan başlar.
lcd.print(değer)Metin ya da sayı yazar.
lcd.clear()Ekranı tamamen siler ve imleci başa alır.
lcd.scrollDisplayLeft()Tüm görüntüyü bir karakter sola kaydırır.
lcd.blink() / lcd.cursor()Yanıp sönen ya da alt çizgi imleç gösterir.
lcd.createChar(no, dizi)0–7 arası yuvaya özel karakter kaydeder.

Kayan yazı yapmak

16 karakterden uzun bir metni göstermek için ekranı kaydırabilirsin. Aşağıdaki kod metni yazar ve her 300 milisaniyede bir sola kaydırır; böylece uzun bir mesaj tabela gibi ekrandan akar.

Arduino (C++)
1#include <Wire.h>
2#include <LiquidCrystal_I2C.h>
3
4LiquidCrystal_I2C lcd(0x27, 16, 2);
5
6void setup() {
7  lcd.init();
8  lcd.backlight();
9  lcd.print("BlueGrays ile elektronik ogren");  // 16 karakterden uzun / longer than 16 chars
10}
11
12void loop() {
13  lcd.scrollDisplayLeft();   // bir adım sola / one step left
14  delay(300);
15}

Özel karakter ve Türkçe harfler

HD44780'in karakter tablosunda ş, ğ, ı, ö, ü, ç gibi harfler yoktur; bunları yazdırmaya çalışırsan ekranda anlamsız işaretler görürsün. Çözüm, 8 adede kadar 5x8 piksellik özel karakter tanımlamaktır. Her satır bir bayt olarak yazılır, 1 olan bitler yanan pikseldir. Aşağıdaki örnek bir kalp simgesi çizer; aynı yöntemle ş ya da ğ harfini de çizebilirsin.

Arduino (C++)
1byte heart[8] = {
2  0b00000,
3  0b01010,
4  0b11111,
5  0b11111,
6  0b01110,
7  0b00100,
8  0b00000,
9  0b00000
10};
11
12// setup() içinde / inside setup()
13lcd.createChar(0, heart);   // 0. yuvaya kaydet / store in slot 0
14lcd.setCursor(15, 0);
15lcd.write(byte(0));         // kalbi göster / show the heart

ESP32 ve Raspberry Pi Pico ile I2C LCD

ESP32'de aynı Arduino kodu ve aynı kütüphane çalışır; Wire.begin() varsayılan olarak GPIO 21 (SDA) ve GPIO 22 (SCL) pinlerini kullanır. Farklı pinler istersen Wire.begin(SDA, SCL) yazabilirsin. Raspberry Pi Pico'da MicroPython ile çalışırken lcd_api.py ve pico_i2c_lcd.py adlı iki küçük dosyayı Pico'ya kopyalayıp şu şekilde kullanırsın:

MicroPython
1from machine import I2C, Pin
2from pico_i2c_lcd import I2cLcd   # Pico'ya kopyalanan dosya / file copied to the Pico
3
4i2c = I2C(0, sda=Pin(4), scl=Pin(5), freq=400000)
5addr = i2c.scan()[0]              # ilk bulunan adres / first found address
6lcd = I2cLcd(i2c, addr, 2, 16)    # 2 satır, 16 sütun / 2 rows, 16 columns
7
8lcd.putstr("Merhaba Pico!")
9lcd.move_to(0, 1)                 # sütun 0, satır 1 / column 0, row 1
10lcd.putstr("BlueGrays")

I2C LCD ile proje fikirleri

  • Dijital termometre: Sıcaklık ve nemi ekrana yaz; sensör tarafı için DHT11 Sıcaklık ve Nem Sensörü yazısına bak.
  • Mesafe göstergesi: HC-SR04 ile ölçtüğün mesafeyi santimetre olarak göster; ayrıntılar HC-SR04 Mesafe Sensörü yazısında.
  • Dijital voltmetre: Analog pinden okuduğun gerilimi ekranda göster.
  • Şifreli kilit: Tuş takımından girilen şifreyi ekranda yıldızla göster.
  • Menü sistemi: Bir potansiyometre ya da iki butonla ekrandaki seçenekler arasında gez.
  • Mini oyun: Özel karakterlerle çizilen bir koşucu karakteri engellerden kaçır.

Sık yapılan hatalar ve çözümleri

  • Ekran yanıyor ama yazı yok: Kontrast ayarlı değil; trimpotu çevir.
  • Üst satırda dolu kareler: Ekran enerji alıyor ama başlatılmamış; adres yanlış, SDA ve SCL ters ya da lcd.init() çağrılmamış olabilir.
  • Yanlış adres: Kodda 0x27 yazıp ekranın 0x3F olması; tarayıcı koduyla gerçek adresi bul.
  • Eski rakamların kalması: 100'den 99'a düşen bir sayı ekranda 990 gibi görünür; sayıdan sonra birkaç boşluk yaz. lcd.clear() da işe yarar ama yavaştır ve döngüde sık kullanılırsa ekran titrer.
  • Türkçe harflerin bozuk çıkması: Ekranın tablosunda bu harfler yoktur; özel karakter tanımla ya da Türkçe karakter kullanma.
  • Rastgele bozulan yazılar: Uzun ve gevşek kablolar ya da motor gibi parazit üreten parçalar I2C hattını bozabilir; kabloları kısa tut ve motorları ayrı beslemeyle çalıştır.

Ekranı bir sensörle birleştirmek, ilk gerçek projeni yapmanın en hızlı yoludur. BlueGrays uygulamasında I2C LCD kullanan onlarca projeyi devre şemaları ve hazır kodlarıyla bulabilirsin; değerleri bir düğmeyle değiştirmek için Potansiyometre Nedir? yazısı da işine yarayacak.

Sıkça sorulan sorular

LCD ekranım neden sadece kare gösteriyor?

Üst satırdaki dolu kareler ekranın enerji aldığını ama başlatılmadığını gösterir. Adres yanlış olabilir, SDA ve SCL yer değiştirmiş olabilir ya da kontrast çok yüksektir. Önce I2C tarayıcı koduyla adresi doğrula, sonra trimpotu ayarla.

I2C LCD'nin adresi 0x27 mi 0x3F mi?

PCF8574 yongalı modüller genelde 0x27, PCF8574A yongalı modüller 0x3F adresini kullanır. Hangisi olduğunu en kolay I2C tarayıcı koduyla öğrenirsin; kodda LiquidCrystal_I2C lcd(0x3F, 16, 2) şeklinde değiştirmen yeterlidir.

Aynı Arduino'ya iki LCD ekran bağlanabilir mi?

Evet. Modülün üzerindeki A0, A1 ve A2 lehim pedleri kısa devre edilerek adres değiştirilir; böylece aynı iki kabloya 8 taneye kadar LCD bağlanabilir. Kodda her ekran için farklı adresle ayrı bir nesne tanımlarsın.

20x4 LCD için de aynı kod çalışır mı?

Evet. Tanımlamayı LiquidCrystal_I2C lcd(0x27, 20, 4) yapman yeterlidir; satır numaraları 0 ile 3 arasında, sütunlar 0 ile 19 arasında olur.

LCD ekranda Türkçe karakter nasıl yazılır?

Ekranın hazır karakter tablosunda ş, ğ, ı gibi harfler yoktur. lcd.createChar() ile her harfi 5x8 piksellik özel karakter olarak çizip lcd.write() ile yazdırabilirsin. Aynı anda en fazla 8 özel karakter tanımlanabildiğini unutma.

LCD mi OLED ekran mı kullanmalıyım?

LCD ucuz, güneş altında okunaklı ve metinle sayı göstermek için idealdir. OLED daha küçük, kontrastı yüksek ve grafik ile simge çizebilir ama uzun süre aynı görüntüde kalırsa iz bırakabilir. Metin için LCD, grafik için OLED seç.

Tüm projeleri gör
I2C İle LCD Ekran Kullanımı
#32Başlangıç
Premium

I2C İle LCD Ekran Kullanımı

I2C modülü sayesinde sadece 2 kablo (SDA, SCL) ile LCD ekranı kontrol ederek mesaj yazdıran proje. I2C protokolü ile pin tasarrufu sağlamayı öğretir.

4.8(53)
69
2x16 LCD Ekrana Mesaj Yazdırma
#29İleri
Premium

2x16 LCD Ekrana Mesaj Yazdırma

2x16 LCD ekrana karakter karakter yazı yazdıran ve ekranı temizleyerek döngüsel mesaj gösteren proje. LCD kütüphanesi, setCursor ve print fonksiyonlarının kullanımını öğretir.

4.6(37)
51
LCD İle Sağa Sola Çarpan Yazı Yazmak
#30İleri
Premium

LCD İle Sağa Sola Çarpan Yazı Yazmak

LCD ekranda yazıyı sağa sola hareket ettirerek duvarlara çarpan animasyon efekti oluşturan proje. Dinamik setCursor konumlandırma ve metin animasyonu mantığını öğretir.

4.5(29)
40
ESP32 I2C LCD Ekran (16x2)
#119Orta
Premium

ESP32 I2C LCD Ekran (16x2)

Bu projede 16x2 karakter LCD ekranı I2C protokolü üzerinden ESP32'ye bağlayarak metin görüntülüyoruz. I2C sayesinde sadece 2 data pini (SDA ve SCL) ile ekranı kontrol edebiliyoruz; klasik paralel bağlantıdaki 6+ pin israfı ortadan kalkıyor. Kod ilk satıra sabit bir mesaj, ikinci satıra ise her saniye artan bir sayaç yazdırıyor. Ayrıca başlangıçta I2C tarayıcı çalıştırarak ekranın adresini Serial Monitor'a yazdırıyoruz (genelde 0x27 veya 0x3F).

4.9(22)
39
DHT11 İle Sıcaklık Ve Nem
#55Orta

DHT11 İle Sıcaklık Ve Nem

DHT11 sensörü ile ortam sıcaklığı ve nem değerini ölçerek I2C LCD ekranda gösteren proje. Dijital sıcaklık/nem sensörü kullanımını öğretir.

4.7(47)
60
LCD Ekran ile Dijital Voltmetre
#56Orta
Premium

LCD Ekran ile Dijital Voltmetre

Gerilim bölücü devresi ile 0-55V aralığında voltaj ölçümü yaparak sonucu I2C LCD ekranda gösteren dijital voltmetre projesi. Gerilim bölücü formülü ve analog ölçüm kalibrasyonunu öğretir.

4.5(27)
36
4x4 Keypad LCD Ekran Şifre Uygulaması
#64İleri
Premium

4x4 Keypad LCD Ekran Şifre Uygulaması

4x4 keypad ile şifre girişi yaparak doğruysa servo ile kapı açan, yanlışsa kırmızı LED yakan güvenlik projesi. Şifre karşılaştırma ve servo-LCD-keypad entegrasyonunu öğretir.

4.8(57)
75
Arduino LCD Koşucu Oyunu
#98Orta
Premium

Arduino LCD Koşucu Oyunu

6x2 karakter LCD ekranda çalışan yandan kaydırmalı sonsuz koşucu oyunu. Kahraman otomatik olarak koşar, oyuncu butona basarak engellerin üzerinden zıplar. Alt ve üst sırada rastgele engeller oluşur. Pasif buzzer ile açılış melodisi, zıplama sesi, 50 puan kutlama sesi ve oyun sonu melodisi çalar. Açılışta "BlueGrays — Arduino Projects" splash ekranı gösterilir. Skor ekranın sağ üst köşesinde anlık olarak güncellenir.

4.7(31)
53

16x2 LCD'yi I2C modülüyle yalnızca 4 kabloyla bağlamayı, adresini bulmayı, yazı ve sayı yazdırmayı, kayan yazı yapmayı ve kendi simgelerini çizmeyi öğren.

I2C LCD Ekran (16x2) Kullanımı: Arduino, ESP32 ve Pico ile Yazı Yazdırma | BlueGrays