Bir cümlelik özet
Dijital çıkış bir pini açıp kapatarak LED gibi bir parçayı kontrol etmemizi, dijital giriş ise bir butonun basılı olup olmadığını okumamızı sağlar; bu iki fikri birleştirince Arduino'ya "butona basınca ışığı yak" gibi kararlar aldırabiliriz.
Neden önemli?
Blink dersinde bir LED'i yakıp söndürmüştük. Ama o LED bizden hiçbir şey duymuyordu; sadece kodda yazdığımız süre kadar yanıp sönüyordu. Gerçek cihazlar ise çevrelerini dinler: bir düğmeye basarsın, ışık yanar; bir tuşa dokunursun, kapı açılır.
Bu derste Arduino'nun iki yönünü tanıyacağız. Dijital çıkış, Arduino'nun dünyaya bir şey göndermesidir: bir pini açar (5 volt) veya kapatır (0 volt). Dijital giriş ise Arduino'nun dünyayı dinlemesidir: bir pinde sinyal var mı, yok mu diye bakar.
"Dijital" kelimesi burada sadece iki değer olduğu anlamına gelir: açık ya da kapalı, 1 ya da 0. Arada bir yer yoktur. Bir buton için bu tam uyar; buton ya basılıdır ya değildir. Bu ikili mantık, tüm bilgisayarların temelidir.
Dijital çıkış: Bir pini kontrol etmek
Blink dersinden hatırlayacaksın: digitalWrite komutu bir pini HIGH (yaklaşık 5 volt, açık) veya LOW (0 volt, kapalı) yapar. LED'i o pine bir dirençle bağladığımızda, pin açıldığında LED yanar.
Bağlantı
- LED'in uzun bacağı (artı, anot) bir dirence bağlanır.
- Direnç (220–330 ohm) 8 numaralı pine gider.
- LED'in kısa bacağı (eksi, katot) GND'ye bağlanır.
Direnç şart. Onsuz LED'den geçen akım çok yükselir ve LED (bazen de pin) zarar görür. Direnci LED'e su borusundaki daraltma gibi düşün: akışı güvenli seviyede tutar.
Kod
int ledPin = 8;
void setup() {
pinMode(ledPin, OUTPUT); // 8. pin cikis olacak
}
void loop() {
digitalWrite(ledPin, HIGH); // LED yansin
delay(1000);
digitalWrite(ledPin, LOW); // LED sonsun
delay(1000);
}
Bu Blink'in aynısı, sadece pini bir değişkende tuttuk. pinMode(ledPin, OUTPUT) satırı Arduino'ya "bu pinden sinyal göndereceğim" der. Bir pini çıkış olarak ayarlamayı unutursak digitalWrite düzgün çalışmaz.
Dijital giriş: Bir butonu okumak
Şimdi Arduino'nun dinlemesini istiyoruz. Bir butonun durumunu digitalRead komutuyla okuruz. Bu komut bize HIGH veya LOW döndürür.
INPUT_PULLUP neden gerekli?
Bir buton pinini boşta bıraktığında garip bir sorun çıkar: pin ne açık ne kapalıdır, havadaki elektriksel gürültüyü toplar ve rastgele HIGH/LOW okunur. Buna "yüzen giriş" (floating input) denir.
Çözüm bir dirençle pini sabit bir değere çekmektir. Arduino bunu bizim için içeride yapabilir: pinMode(pin, INPUT_PULLUP) yazdığımızda pin, dahili bir dirençle HIGH'a çekilir. Yani buton basılı değilken digitalRead HIGH okur.
Butonun diğer ucunu GND'ye bağlarız. Butona basınca pin GND'ye bağlanır ve LOW okunur. Bu biraz ters gelebilir: basılı = LOW, serbest = HIGH. Ama harici dirence gerek kalmaması bunu değerli kılar.
Bağlantı
- Butonun bir bacağı 2 numaralı pine.
- Butonun diğer bacağı GND'ye.
- LED yine 8 numaralı pinde, dirençle (yukarıdaki gibi).
Butonu Serial ile izlemek
Önce butonun ne okuduğunu gözümüzle görelim. Serial bize Arduino'dan bilgisayara mesaj göndermeyi sağlar.
int butonPin = 2;
void setup() {
Serial.begin(9600);
pinMode(butonPin, INPUT_PULLUP);
}
void loop() {
int durum = digitalRead(butonPin);
Serial.println(durum); // basili=0, serbest=1
delay(200);
}
Kodu yükleyip Seri Monitör'ü açtığında, butona basmadan 1 (HIGH), basınca 0 (LOW) görürsün. Elektriğin görünmez dilini böylece okuyabiliriz.
İkisini birleştir: Butonla LED kontrolü
Şimdi asıl hedef: butona basınca LED yansın, bıraktığında sönsün. Giriş ve çıkışı tek programda birleştiriyoruz.
int butonPin = 2;
int ledPin = 8;
void setup() {
pinMode(butonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop() {
if (digitalRead(butonPin) == LOW) { // basili
digitalWrite(ledPin, HIGH); // LED yak
} else {
digitalWrite(ledPin, LOW); // LED sondur
}
}
Program sürekli loop içinde döner. Her turda butonu okur. Basılıysa (LOW) LED'i yakar, değilse söndürür. Bu, Algoritmalar dersindeki koşul yapısının gerçek donanımdaki halidir: "Eğer buton basılıysa, ışığı yak."
Günlük hayattan iki örnek
Kapı zili. Zil düğmesi tam olarak bu mantıkla çalışır. Sen basınca devre kapanır, içerideki ses açılır; bıraktığında susar. Bizim butonlu LED'imiz minik bir kapı zilidir; sadece ses yerine ışık verir.
Buzdolabı ışığı. Kapıyı açtığında ışık yanar, kapattığında söner. Kapının kenarındaki küçük düğme bir dijital girişi besler. Kapı kapalıyken düğme basılıdır (ışık kapalı), açıldığında serbest kalır (ışık yanar). Aynı "giriş oku, çıkışa karar ver" fikridir.
Mini uygulama
Yukarıdaki butonlu LED devresini kurup çalıştır. Sonra kodu şöyle değiştir: butona her basıldığında LED durum değiştirsin (yanıyorsa sönsün, sönükse yansın) — tıpkı gerçek bir oda lambası anahtarı gibi.
İpucu: Bir değişkende LED'in durumunu tut. Butonun basıldığı anı yakalamak için önceki okumayı da sakla.
int butonPin = 2;
int ledPin = 8;
bool ledAcik = false;
int oncekiDurum = HIGH;
void setup() {
pinMode(butonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop() {
int durum = digitalRead(butonPin);
if (oncekiDurum == HIGH && durum == LOW) { // yeni basis
ledAcik = !ledAcik;
digitalWrite(ledPin, ledAcik);
delay(50); // titremeyi azalt
}
oncekiDurum = durum;
}
Çalıştır ve gözlemle: Bazen tek basışta iki kez değişiyormuş gibi olabilir. Bunun nedenini "Sık yapılan hatalar" bölümünde açıklıyoruz.
Uygulama laboratuvarı: Dijital Giriş ve Çıkış
Dijital Giriş ve Çıkış konusunu kalıcı hâle getirmenin en iyi yolu, kavramı küçük ve ölçülebilir bir göreve dönüştürmektir. Bu çalışmada Dijital çıkış: Bir pini kontrol etmek ile Kod arasındaki ilişkiyi kullanarak bağlantı şeması, derlenebilen Arduino kodu, seri monitör kaydı ve test sonucu hazırlayacaksın. Amaç yalnız sonucun çalışması değil; hangi kararı neden verdiğini, neyi test ettiğini ve hangi durumda tasarımı değiştireceğini açıklayabilmektir.
Görev senaryosu
Şu senaryoyu ele al: çizgiyi algılayan iki sensörün değerlerini seri monitörde karşılaştırma. Dersin ana hedefi “digitalRead ve digitalWrite ile bir butonla LED'i kontrol etmeyi öğren” olduğuna göre önce problemi tek cümleyle tanımla. Ardından sistemin alacağı girdiyi, uygulayacağı işlemi ve üreteceği çıktıyı ayrı ayrı yaz. Bilmediğin bir ayrıntı varsa onu varsayım olarak işaretle; varsayımı gerçek bilgi gibi kullanma.
- Planla: Başlangıç durumunu, beklenen sonucu ve kullanacağın kavramları yaz.
- En küçük sürümü kur: Yalnız temel davranışı çalıştır; süsleme ve ek özellikleri sonraya bırak.
- Üç test hazırla: Normal bir durum, sınırda bir durum ve hatalı ya da beklenmeyen bir durum seç.
- Sonucu kaydet: Beklenen ile gerçekleşeni yan yana yaz; fark varsa olası nedeni belirt.
- Tek değişiklik yap: Aynı anda birçok şeyi değiştirmek yerine bir kararı düzeltip testi yeniden çalıştır.
Başarı ölçütleri
- Kartın 5 V veya 3,3 V çalışma sınırı doğru mu?
- Pin numaraları kod ve devrede eşleşiyor mu?
- Seri monitör ölçümü beklenen aralıkta mı?
- Motor veya servo karttan doğrudan aşırı akım çekiyor mu?
- Güç kesildiğinde sistem güvenli duruma dönüyor mu?
“Dijital Giriş ve Çıkış” çalışmasını bitirdiğinde ürünü bir arkadaşına yalnız bölüm başlıklarıyla anlat. Arkadaşın çizgiyi algılayan iki sensörün değerlerini seri monitörde karşılaştırma senaryosundaki adımları ve karar nedenlerini takip edebiliyorsa anlatım yeterince açıktır. Anlaşılmayan noktayı daha fazla terim ekleyerek değil, Dijital çıkış: Bir pini kontrol etmek ve Kod ilişkisini daha küçük adımlara bölerek düzelt.
Sık yapılan hatalar
pinMode satırını unutmak
Pin türünü ayarlamazsan giriş ve çıkış beklendiği gibi çalışmaz. Butonu INPUT_PULLUP, LED'i OUTPUT olarak ayarlamayı setup içinde yap.
Dirençsiz LED bağlamak
LED'i doğrudan pine takarsan aşırı akım geçer. LED sönebilir veya pin zarar görebilir. Her zaman 220–330 ohm dirençle bağla.
INPUT_PULLUP mantığını ters düşünmek
INPUT_PULLUP ile buton serbestken HIGH, basılıyken LOW okunur. Kodda == LOW yerine == HIGH yazarsan LED tam tersine davranır.
Buton titremesi (debounce)
Butonlar metal temaslarla çalışır; bastığın an temas birkaç milisaniye titrer. Arduino bunu birden çok basış sanabilir. Küçük bir delay(50) veya millis ile bekleme, bu titremeyi (bounce) yumuşatır.
Güvenlik notu
- Bu derste sadece düşük gerilim kullanıyoruz: Arduino'nun USB'den veya pil paketinden gelen 5 voltu. Şebeke elektriğiyle (prizle) hiçbir zaman deney yapma.
- LED'i her zaman bir akım sınırlama direnciyle bağla. Dirençsiz bağlantı parçaları ısıtabilir.
- Bağlantıları değiştirirken Arduino'nun USB kablosunu çıkar; devreyi kurup kontrol ettikten sonra tekrar tak.
- Motor, pompa veya güçlü bir yük çalıştırmak istersen bunu doğrudan Arduino pininden yapma. Motorlar bir motor sürücü kartı ve ayrı bir güç kaynağı ister; aksi halde Arduino zarar görür. Motorları düşük hızda başlatmayı unutma.
- İlk devreyi kurarken bir yetişkinle birlikte çalış. Bir bağlantıdan emin değilsen sormadan güç verme.
Ders özeti
- Dijital çıkış (
digitalWrite) bir piniHIGHveyaLOWyaparak LED gibi parçaları kontrol eder. - Dijital giriş (
digitalRead) bir pininHIGHmiLOWmu olduğunu okur; buton durumunu böyle öğreniriz. INPUT_PULLUPyüzen girişi önler: buton serbestkenHIGH, basılıykenLOWokunur.- Giriş ve çıkışı bir
ifkoşuluyla birleştirerek "butona basınca ışık yansın" gibi kararlar kurarız. - LED'i her zaman bir dirençle bağla ve yalnız düşük gerilimle çalış.
Kontrol soruları
digitalWrite(8, HIGH)komutu ne yapar?- Bir butonun durumunu okumak için hangi komutu kullanırız?
INPUT_PULLUPkullanınca, buton serbestkendigitalReadne döndürür:HIGHmiLOWmu?- LED'i dirençsiz bağlarsak ne olabilir?
- Butona basınca LED'i yakmak için
ifkoşulunudigitalRead(butonPin) == ?şeklinde nasıl yazarız (INPUT_PULLUP ile)?
Cevaplar
- 8 numaralı pini
HIGH(yaklaşık 5 volt) yapar; o pine dirençle bağlı bir LED varsa yanar. digitalReadkomutunu kullanırız; bizeHIGHveyaLOWdöndürür.HIGHdöndürür.INPUT_PULLUPpini dahili dirençleHIGH'a çeker; buton basılınca pin GND'ye bağlanır veLOWolur.- LED'den çok fazla akım geçer; LED sönebilir veya Arduino pini zarar görebilir. Bu yüzden 220–330 ohm direnç kullanırız.
if (digitalRead(butonPin) == LOW)yazarız. ÇünküINPUT_PULLUPile basılı butonLOWokunur.
Kaynak ve doğrulama notu
“Dijital Giriş ve Çıkış” dersi için doğrulama odağı Dijital çıkış: Bir pini kontrol etmek ile Kod arasındaki ilişkinin örnekler üzerinde tutarlı çalışmasıdır. Arduino uyumlu kartlarda pin, gerilim ve akım sınırları modele göre değişebilir. Kod derlense bile devre güvenli olmayabileceğinden, motor ve servo gibi yükler uygun sürücü ve harici besleme ile kullanılmalıdır.
Sonraki ders
Analog Okuma: Bir pin yalnızca açık/kapalı değil, arada birçok değer de okuyabilir. analogRead ile bir potansiyometreyi veya ışık sensörünü okuyup 0–1023 arası sayılara dönüştürmeyi öğreneceğiz.