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);| Mod | Anlamı |
|---|---|
OUTPUT | Pin çıkış olur; HIGH/LOW verebilir |
INPUT | Pin giriş olur; dış dünyayı okur |
INPUT_PULLUP | Giriş + 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 verirLOW→ 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ış:
| Durum | Okunan değer |
|---|---|
| Buton basılı değil | HIGH (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şen | Aktif seviye |
|---|---|
| Normal LED (anot pine bağlı) | HIGH |
INPUT_PULLUP ile buton | LOW |
| Çoğu röle kartı | LOW |
| Ortak anot RGB LED | LOW |
| Ç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