Skip to Content
Arduino EğitimleriDijital Giriş ve Çıkış

Dijital Giriş ve Çıkış

Dijital pinler yalnızca iki durum tanır: HIGH (5 V) ve LOW (0 V). Bir LED’i yakmak, bir röleyi çekmek, bir butonun basılıp basılmadığını anlamak — hepsi bu iki durum üzerine kuruludur.

Arduino programlamanın temeli üç fonksiyondan oluşur: pinMode(), digitalWrite() ve digitalRead().

pinMode() — Pinin Görevini Belirlemek

Bir pini kullanmadan önce ne iş yapacağını söylemeniz gerekir. Bu, setup() içinde yapılır.

pinMode(pin, mod);
ModAnlamı
OUTPUTPin çıkış olur; HIGH/LOW verebilir
INPUTPin giriş olur; dış dünyayı okur
INPUT_PULLUPGiriş + dahili pull-up direnci aktif
void setup() { pinMode(8, OUTPUT); // LED pinMode(2, INPUT_PULLUP); // buton }

digitalWrite() — Çıkış Vermek

digitalWrite(pin, deger);
  • HIGH → pin 5 V verir
  • LOW → pin 0 V verir (GND’ye çeker)
const int LED_PIN = 8; void setup() { pinMode(LED_PIN, OUTPUT); } void loop() { digitalWrite(LED_PIN, HIGH); delay(500); digitalWrite(LED_PIN, LOW); delay(500); }

Hatırlatma: Bir pin en fazla 20 mA verebilir. LED için mutlaka seri direnç kullanın; motor veya röle için transistör gerekir.

digitalRead() — Giriş Okumak

int durum = digitalRead(pin);

Dönen değer HIGH (1) veya LOW (0) olur.

Arduino, giriş pinindeki gerilimi şu eşiklere göre yorumlar:

  • 3 V üzeri → HIGH
  • 1,5 V altı → LOW
  • Arası → belirsiz bölge; okuma güvenilir değildir

Floating (Boşta Kalan) Giriş

Bu, dijital girişlerde anlaşılması gereken en önemli kavramdır.

Bir giriş pinini hiçbir yere bağlamazsanız, o pin havada kalır ve çevredeki elektriksel gürültüyü toplar. digitalRead() rastgele HIGH veya LOW döndürür.

Bir butonu yalnızca pin ile 5 V arasına bağlarsanız: buton basılıyken pin 5 V görür (HIGH), basılı değilken pin hiçbir yere bağlı değildir — işte bu floating durumudur.

Çözüm, pini basılmadığı durumda bilinen bir seviyeye çekmektir.

INPUT_PULLUP — En Pratik Çözüm

Arduino’nun mikrodenetleyicisi içinde her pin için bir dahili pull-up direnci (yaklaşık 20–50 kΩ) bulunur. INPUT_PULLUP bunu etkinleştirir.

Bağlantı iki kabloya iner:

  • Butonun bir ucu → Arduino pini
  • Butonun diğer ucu → GND

Davranış:

DurumOkunan değer
Buton basılı değilHIGH (dahili direnç 5 V’a çeker)
Buton basılıLOW (pin GND’ye bağlanır)

Mantık terstir ama bağlantı çok basitleşir ve harici dirence gerek kalmaz.

const int BUTON_PIN = 2; const int LED_PIN = 8; void setup() { pinMode(BUTON_PIN, INPUT_PULLUP); pinMode(LED_PIN, OUTPUT); } void loop() { if (digitalRead(BUTON_PIN) == LOW) { // basili digitalWrite(LED_PIN, HIGH); } else { digitalWrite(LED_PIN, LOW); } }

Harici pull-up ve pull-down direnç seçenekleri Buton ve Anahtarlar yazısında ayrıntılı anlatılmıştır.

Durum Değişimi (Edge) Algılama

Yukarıdaki kod “buton basılı mı?” sorusunu yanıtlar. Ancak çoğu zaman istediğiniz şey “buton yeni mi basıldı?” bilgisidir.

Farkı görmek için şu örneği düşünün: butona her basıldığında LED’in durumunu değiştirmek istiyorsunuz. Basitçe yazarsanız, buton basılı tutulduğu sürece loop() binlerce kez döner ve LED çılgınca yanıp söner.

Çözüm, önceki durumu hatırlamaktır:

const int BUTON_PIN = 2; const int LED_PIN = 8; int oncekiDurum = HIGH; bool ledAcik = false; void setup() { pinMode(BUTON_PIN, INPUT_PULLUP); pinMode(LED_PIN, OUTPUT); } void loop() { int mevcutDurum = digitalRead(BUTON_PIN); // HIGH'tan LOW'a gecis = yeni basis if (oncekiDurum == HIGH && mevcutDurum == LOW) { ledAcik = !ledAcik; digitalWrite(LED_PIN, ledAcik ? HIGH : LOW); delay(50); // basit debounce } oncekiDurum = mevcutDurum; }

Bu kalıp — “mevcut durumu oku, öncekiyle karşılaştır, sonra öncekini güncelle” — Arduino programlamada sürekli karşınıza çıkar.

delay(50) satırı buton zıplamasını (bounce) engellemek içindir. Bloke etmeyen daha iyi bir debounce çözümü için Buton ve Anahtarlar yazısına bakın.

Birden Fazla Pini Yönetmek

Çok sayıda LED veya buton varsa dizi kullanmak kodu kısaltır:

const int LED_SAYISI = 5; const int ledler[LED_SAYISI] = { 3, 4, 5, 6, 7 }; void setup() { for (int i = 0; i < LED_SAYISI; i++) { pinMode(ledler[i], OUTPUT); } } void loop() { // sirayla yak for (int i = 0; i < LED_SAYISI; i++) { digitalWrite(ledler[i], HIGH); delay(100); } // sirayla sondur for (int i = LED_SAYISI - 1; i >= 0; i--) { digitalWrite(ledler[i], LOW); delay(100); } }

Pin Durumunu Tersine Çevirmek

Bir pinin mevcut durumunu okuyup tersine çevirmek için:

digitalWrite(LED_PIN, !digitalRead(LED_PIN));

digitalRead() bir çıkış pini üzerinde de çalışır ve o pinin son yazılan değerini döndürür.

Aktif LOW ve Aktif HIGH

Bazı bileşenler ters mantıkla çalışır ve bu şaşırtıcı olabilir:

BileşenAktif seviye
Normal LED (anot pine bağlı)HIGH
INPUT_PULLUP ile butonLOW
Çoğu röle kartıLOW
Ortak anot RGB LEDLOW
Çoğu I2C kesme çıkışıLOW

Aktif LOW bir röle kartını kullanırken setup() içinde pini önce HIGH yapmayı unutmayın; aksi halde kart açılırken röle kısa süre çeker:

void setup() { digitalWrite(ROLE_PIN, HIGH); // once pasif seviye pinMode(ROLE_PIN, OUTPUT); // sonra cikis }

Sıra önemlidir: pinMode() çağrıldığı anda pin son yazılan değeri çıkışa verir.

Sık Yapılan Hatalar

pinMode() yazmayı unutmak. Pin varsayılan olarak INPUT modundadır. Çıkış vermeye çalıştığınızda LED çok sönük yanar veya hiç yanmaz.

== yerine = yazmak. if (durum = HIGH) her zaman doğrudur ve değişkeni de bozar. Karşılaştırma için == kullanın.

INPUT_PULLUP mantığını ters kurmak. Basılı durum LOW’dur.

Giriş pinini digitalWrite() ile yazmaya çalışmak. INPUT modundaki bir pine digitalWrite(pin, HIGH) yazmak dahili pull-up’ı açar (eski kodlarda bu yöntem kullanılırdı) ama çıkış vermez.

D0/D1’i kullanmak. Seri haberleşmeyi bozar.

Debounce yapmamak. Bir basış birden fazla sayılır.

Özet

Dijital pinler HIGH ve LOW olmak üzere iki durum tanır. pinMode() pinin görevini, digitalWrite() çıkış değerini, digitalRead() ise giriş durumunu belirler.

Bu derste şunları öğrendik:

  • pinMode() modlarını ve ne zaman kullanılacağını
  • Floating giriş sorununu ve INPUT_PULLUP çözümünü
  • HIGH/LOW eşik gerilimlerini
  • Durum değişimi (edge) algılama kalıbını
  • Dizilerle birden fazla pini yönetmeyi
  • Aktif LOW bileşenleri ve açılış tetiklemesini önlemeyi
Son güncelleme