Proje hakkında
Klasik 16×2 LCD ekranları doğrudan bağlamak 12'den fazla kablo gerektirir. Ekranın arkasına lehimlenmiş küçük I2C dönüştürücü modül (PCF8574) sayesinde bu sayı 4'e iner: iki besleme ve iki haberleşme hattı. Böylece Arduino'nun pinleri diğer sensörler için serbest kalır.
I2C, aynı iki kabloya onlarca farklı cihazın bağlanabildiği bir haberleşme protokolüdür. Her cihazın bir adresi vardır ve Arduino konuşmak istediği cihazı bu adresle çağırır. Bu projede önce ekranımızın adresini bulacak, sonra ekrana yazı ve özel karakterler yazdıracağız.
- I2C haberleşmenin temellerini ve SDA / SCL hatlarını
- Arduino IDE'ye harici kütüphane kurmayı
- I2C tarayıcı ile cihaz adresini bulmayı
- İmleç konumlandırma ve özel karakter tasarlamayı
Malzeme listesi
Projeyi tamamlamak için aşağıdaki 5 çeşit malzemeye ihtiyacınız var. Parçaların çoğu Arduino başlangıç setlerinde hazır olarak bulunur.
Arduino Uno R3 1 adet
Projenin beyni. Nano veya Mega ile de aynı kod çalışır.
16×2 LCD ekran + I2C modül 1 adet
PCF8574 tabanlı I2C adaptörü lehimli olarak satın alın.
Jumper kablo (erkek-dişi) 4 adet
LCD modülünün pinlerine doğrudan takılır.
USB A-B kablosu 1 adet
Kodu yüklemek ve kartı bilgisayardan beslemek için.
Küçük düz uçlu tornavida 1 adet
Modül üzerindeki kontrast ayarı için.
Devre bağlantıları
Bağlantıları USB kablosu takılı değilken yapın. Her satır, bileşenin hangi bacağının Arduino'nun hangi pinine gideceğini gösterir; çizgi rengi önerilen kablo rengidir.
Adım adım kurulum
Kütüphaneyi kurun
Arduino IDE'de Araçlar › Kütüphaneleri Yönet menüsünü açın. Arama kutusuna LiquidCrystal I2C yazın ve Frank de Brabander'ın kütüphanesini kurun.
Ekranı bağlayın
Erkek-dişi kablolarla GND'yi GND'ye, VCC'yi 5V'a, SDA'yı A4'e, SCL'yi A5'e bağlayın. Breadboard'a gerek yoktur.
Adresi bulun
İlk olarak I2C tarayıcı kodunu yükleyin ve Seri Port Ekranını açın. Ekrana yazan adresi (genellikle 0x27 veya 0x3F) not edin.
Ana kodu yükleyin
Ana koddaki LiquidCrystal_I2C lcd(0x27, 16, 2) satırında adresi kendi bulduğunuz adresle değiştirip yükleyin.
Kontrastı ayarlayın
Ekran arka ışığı yanıyor ama yazı görünmüyorsa modülün arkasındaki mavi potansiyometreyi tornavidayla yavaşça çevirin; yazılar belirgin hale gelecektir.
Sonucu izleyin
Ekranda önce karşılama mesajı, ardından kalp karakteri ve saniye saniye artan bir sayaç görmelisiniz.
Arduino kodu
Kodları Arduino IDE'ye yapıştırıp yükleyebilirsiniz. Türkçe karakterler yalnızca yorum satırlarında kullanıldı; Seri Port Ekranına yazdırılan metinlerde bilerek kullanılmadı.
Önce bu kodu yükleyip ekranınızın I2C adresini bulun.
// I2C Adres Tarayıcı
// RobotikHocasi.com
#include <Wire.h>
void setup() {
Wire.begin();
Serial.begin(9600);
Serial.println("I2C taramasi basliyor...");
byte bulunan = 0;
for (byte adres = 1; adres < 127; adres++) {
Wire.beginTransmission(adres);
if (Wire.endTransmission() == 0) { // Cihaz yanıt verdi
Serial.print("Cihaz bulundu: 0x");
if (adres < 16) Serial.print("0");
Serial.println(adres, HEX);
bulunan++;
}
}
if (bulunan == 0) {
Serial.println("Hic I2C cihazi bulunamadi. Kablolari kontrol edin.");
} else {
Serial.println("Tarama tamamlandi.");
}
}
void loop() {
}
Karşılama mesajı, özel kalp karakteri ve canlı sayaç.
// I2C LCD Ekrana Yazı Yazdırma
// RobotikHocasi.com
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
// Adres, sütun sayısı, satır sayısı
LiquidCrystal_I2C lcd(0x27, 16, 2);
// 5x8 piksellik özel kalp karakteri
byte kalp[8] = {
0b00000,
0b01010,
0b11111,
0b11111,
0b11111,
0b01110,
0b00100,
0b00000
};
void setup() {
lcd.init(); // Ekranı başlat
lcd.backlight(); // Arka ışığı aç
lcd.createChar(0, kalp); // Kalbi 0 numaralı yuvaya kaydet
lcd.setCursor(0, 0); // 1. satır, 1. sütun
lcd.print("Robotik Hocasi");
lcd.setCursor(0, 1); // 2. satır, 1. sütun
lcd.print("Merhaba Dunya ");
lcd.write(0); // Kalp karakterini yaz
delay(3000);
lcd.clear(); // Ekranı temizle
}
void loop() {
unsigned long saniye = millis() / 1000;
lcd.setCursor(0, 0);
lcd.print("Gecen sure:");
lcd.setCursor(0, 1);
lcd.print(saniye);
lcd.print(" saniye "); // Sondaki boşluklar eski rakamları siler
delay(250);
}
Kod açıklaması
LiquidCrystal_I2C lcd(0x27, 16, 2);lcd adında bir ekran nesnesi oluşturur. 0x27 onaltılık (hex) sistemde yazılmış I2C adresidir; 16 sütun, 2 satır ekran boyutudur.
Wire.beginTransmission / endTransmissionTarayıcı kodu her adresi tek tek çağırır. endTransmission() 0 döndürürse o adreste yanıt veren bir cihaz vardır.
lcd.setCursor(sütun, satır)İmleci belirtilen konuma taşır. Saymaya 0'dan başlanır; (0, 1) ikinci satırın başıdır.
byte kalp[8] = { 0b01010, ... };Her satır 5 pikselden oluşur. 0b ile başlayan ikili sayılarda 1 yanan, 0 sönük pikseldir. Toplam 8 adede kadar özel karakter tanımlanabilir.
lcd.print(" saniye ")Sayı 10'dan 9'a gibi kısaldığında eski rakam ekranda kalır. Sondaki boşluklar bu artık karakterleri temizler; her döngüde lcd.clear() kullanmaktan daha az titreşim yapar.
Nasıl çalışır?
I2C protokolü iki hat kullanır: SCL (saat) hattında Arduino düzenli darbeler gönderir, SDA (veri) hattında ise bitler bu darbelere senkronize şekilde iletilir. Her mesaj, alıcı cihazın 7 bitlik adresiyle başlar. Hatta bağlı tüm cihazlar adresi dinler, ama sadece adresi eşleşen cihaz yanıt verir.
LCD'nin arkasındaki PCF8574 çipi, I2C üzerinden gelen baytları 8 ayrı dijital çıkışa dönüştürür. Bu çıkışlar LCD'nin veri ve kontrol pinlerine bağlıdır. LiquidCrystal_I2C kütüphanesi, lcd.print("A") gibi basit komutları LCD'nin anladığı düşük seviyeli komut dizilerine çevirerek bu karmaşıklığı bizden gizler.
Sorun giderme
Arka ışık yanıyor ama ekran boş
Üst satırda dolu kareler görünüyor
Tarayıcı hiçbir cihaz bulamıyor
Türkçe karakterler (ş, ğ, ı) bozuk çıkıyor
Geliştirme fikirleri
Projeyi tamamladıysanız, aşağıdaki fikirlerle bir adım öteye taşıyabilirsiniz.
Dijital termometre
Bir DHT11 sensörü ekleyip sıcaklık ve nemi ekranda gösterin.
Kayan yazı
lcd.scrollDisplayLeft() ile 16 karakterden uzun mesajları kaydırın.
Reaksiyon ölçer
Ekranda "BAS!" yazdığında butona basma süresini milisaniye olarak ölçün.
Menü sistemi
İki butonla gezilebilen, ayar değiştirilebilen basit bir menü tasarlayın.