İçeriğe geç

Menü

Berk Akademi
Yorumlar Google yorumları Birebir ders başvurusu Ücretsiz ön görüşme Ana Sayfa

Arduino Dijital Girişte Buton Neden Ters Çalışır? INPUT_PULLUP Mantığı

arduino-buton-neden-ters-calisir-input-pullup
Bu yazıda neler var?
  1. Buton neden basılmadığında HIGH, basılınca LOW okunur?
  2. INPUT, INPUT_PULLUP, HIGH, LOW, GND ve digitalRead ne demek?
  3. Üç aşamalı teşhis: devre, pin modu, if koşulu
  4. Butona basınca LED yakan çalışır örnek
  5. Buton hâlâ beklediğin gibi çalışmıyorsa kontrol listesi
  6. Sık Sorulan Sorular

Arduino dijital girişte buton ters çalışır, çünkü INPUT_PULLUP modu pini dahili pull-up direnciyle varsayılan olarak HIGH'da tutar. Buton pin ile GND arasına bağlandığı için basınca pin GND'ye çekilir ve digitalRead LOW döndürür. Yani kodda LOW "basılı", HIGH "basılı değil" demektir. Bu bir arıza değil, devrenin tasarımıdır.

Buton neden basılmadığında HIGH, basılınca LOW okunur?

pinMode(pin, INPUT_PULLUP) yazdığında mikrodenetleyicinin içindeki bir direnç devreye girer ve pini besleme gerilimi tarafına doğru çeker. Bu direnç çipin içindedir; buton için breadboard'a ayrıca direnç takmazsın. Arduino'nun resmî dokümantasyonu (docs.arduino.cc) INPUT_PULLUP modunu tam olarak bu dahili pull-up direncini etkinleştiren mod olarak tanımlar.

Butonun bir bacağı giriş pinine, diğer bacağı GND'ye gider. Elektrik akışını adım adım düşün:

  1. Buton basılı değil: Pinin GND ile bağlantısı kopuktur. Dahili direnç pini besleme tarafına çeker, pin HIGH okunur.
  2. Buton basılı: Butonun kontakları birleşir, pin doğrudan GND'ye bağlanır. GND pini besleme tarafından daha baskın çeker, pin LOW okunur.
  3. Buton bırakıldı: Pin GND'den ayrılır ve dahili direnç pini yeniden HIGH'a çeker.

Mantık tersine görünür, çünkü "basıldı" olayı sinyalin yükselmesiyle değil düşmesiyle anlaşılır. Buna aktif düşük mantık denir: aktif durum (buton basılı) LOW seviyesiyle temsil edilir. Pin bağlantısını görselleştirirken şunu aklında tut: pin her zaman bir yere çekili olmalı. Basılmadığında besleme tarafına, basıldığında GND'ye.

INPUT, INPUT_PULLUP, HIGH, LOW, GND ve digitalRead ne demek?

INPUT, INPUT_PULLUP, HIGH, LOW, GND ve digitalRead ne demek?

Bu altı terim butonun neden ters çalıştığını anlamak için yeterli. Her biri kısaca:

  • GND: Devrenin ortak referans noktasıdır. Gerilimler ona göre ölçülür; buton, LED ve Arduino'nun GND uçları aynı hatta birleşir.
  • HIGH ve LOW: Dijital bir pinin alabildiği iki mantıksal durumdur. HIGH, pinin besleme gerilimi tarafında; LOW ise GND tarafında olduğunu gösterir.
  • digitalRead(pin): Pinin o andaki durumunu okur ve HIGH ya da LOW olarak döndürür.
  • INPUT: Pini giriş yapar, ama pine hiçbir çekme direnci eklemez. Pinin durumu tamamen dışarıdaki bağlantıya kalır.
  • INPUT_PULLUP: Pini giriş yapar ve dahili pull-up direncini açar. Pin, dışarıdan bir şey bağlanmadığında HIGH'da durur.

Pin "havada kalırsa" ne olur?

Dirençsiz INPUT modunda buton basılı değilken pin hiçbir yere bağlı değildir. Buna floating (havada kalan) pin denir. Böyle bir pinin okuması kararsızdır: elini yaklaştırman, jumper kablonun hareket etmesi ya da çevredeki elektriksel gürültü değeri HIGH ile LOW arasında değiştirebilir. Sonuç, butona hiç dokunmadığın hâlde LED'in titremesi ya da seri monitörde rastgele değerler görmen olabilir.

INPUT_PULLUP bu belirsizliği ortadan kaldırır. Pin varsayılan olarak HIGH'a çekildiği için buton basılı değilken okuma tutarlıdır; buton basılınca da pin açıkça GND'ye bağlanır. Böylece iki durumun ikisi de net bir seviyeye karşılık gelir.

Buton basıldığında ya da bırakıldığında sinyalin kısa süre dalgalanması ise ayrı bir konudur ve debounce başlığı altında incelenir.

Üç aşamalı teşhis: devre, pin modu, if koşulu

Üç aşamalı teşhis: devre, pin modu, if koşulu

Buton ters çalışıyormuş gibi göründüğünde sorunu tek seferde aramak yerine üç katmanı sırayla kontrol et. Çoğu zaman karışıklık, bu katmanlardan birinin diğerleriyle uyuşmamasından çıkar.

1. Devre: Buton pin ile GND arasında mı?

Butonun bir bacağı dijital pine, diğer bacağı GND'ye bağlı olmalı. Bu bağlantı, butona basıldığında pini doğrudan GND'ye yani 0 volt seviyesine çeker. Pin bu kez 5 volta ya da 3,3 volta değil GND'ye bağlandığı için okuma LOW çıkar.

2. Pin modu: INPUT_PULLUP yazıldı mı?

setup() içinde pinMode(pin, INPUT_PULLUP) satırı olmalı. Bu satır pini dahili pull-up direnciyle HIGH tarafına bağlar. Buton için ayrıca direnç takman gerekmez. Mod doğruysa beklenen değerler şöyledir:

Buton durumuPinin bağlandığı yerdigitalRead değeriKoddaki anlamı
BırakılmışDahili pull-up ile HIGH tarafıHIGHBasılı değil
BasılmışGNDLOWBasılı

3. Kod: if koşulu LOW'u "basılı" olarak okuyor mu?

Üçüncü kontrol koşuldur. if (digitalRead(pin) == HIGH) yazıp bunu "basıldı" diye yorumlarsan program tam tersini yapar. INPUT_PULLUP ile doğru ifade digitalRead(pin) == LOW olmalıdır.

Buna aktif düşük mantığı denir: bir eylemin, burada butona basmanın, düşük seviye ile temsil edilmesi. Bu yüzden şu cümleyi aklında tut: INPUT_PULLUP ile LOW değeri arıza anlamına gelmez; butonun GND'ye bağlanması nedeniyle basılı durumun karşılığıdır.

Butona basınca LED yakan çalışır örnek

Aşağıdaki mini devre, üç aşamayı birlikte uygular. Bağlantıları şöyle kur:

  • Butonun bir bacağı dijital giriş pinine (kodda 2), diğer bacağı GND'ye bağlı olsun.
  • LED'in uzun bacağı (anot) uygun değerde bir seri dirençle çıkış pinine (kodda 8) bağlansın.
  • LED'in kısa bacağı (katot) GND'ye gitsin.
const int BUTON_PINI = 2;
const int LED_PINI = 8;
const int BASILI = LOW;

void setup() {
  pinMode(BUTON_PINI, INPUT_PULLUP);
  pinMode(LED_PINI, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  int okunan = digitalRead(BUTON_PINI);

  if (okunan == BASILI) {
    digitalWrite(LED_PINI, HIGH);
    Serial.println("LOW (basili) - LED yanar");
  } else {
    digitalWrite(LED_PINI, LOW);
    Serial.println("HIGH (basili degil) - LED sonuk");
  }
  delay(200);
}

Kodu yükleyip seri monitörü 9600 hızında açtığında şunu görmelisin:

  • Buton bırakılıyken: HIGH (basili degil) - LED sonuk
  • Butona basınca: LOW (basili) - LED yanar ve LED yanar.

Buradaki en önemli ayrıntı const int BASILI = LOW; satırıdır. Koşulu okunan == BASILI diye okumak, "LOW mu HIGH mı?" sorusunu zihninden çıkarıp yerine "basılı mı?" sorusunu koyar. Devreyi değiştirirsen yalnızca bu tek satırı güncellemen yeter. Butonun titreşiminden doğan çoklu okumalar (debounce) ayrı bir konudur ve bu örneğin kapsamı dışında kalır.

Buton hâlâ beklediğin gibi çalışmıyorsa kontrol listesi

Devre doğru görünüyor, kod da derleniyor ama LED yine tepki vermiyorsa şu maddeleri sırayla kontrol et. Her madde farklı bir belirtiye karşılık gelir.

  1. Butonun bacakları aynı bağlantı kolunda kalmış olabilir. Breadboard'da aynı şeritteki delikler birbirine bağlıdır. Butonun iki bacağı aynı şeride girerse ya da içeride hep bağlı olan bacak çiftini kullanırsan, bastığında devreye bir şey değişmez ve okunan değer sabit kalır. Butonu şeridin iki yanına gelecek biçimde yerleştir.
  2. İkinci bacak GND yerine boşta olabilir. Pin ile GND arasında kapanan bir yol yoksa basınca LOW oluşmaz. Pin INPUT modundaysa boşta kalan hat yüzünden okuma rastgele dalgalanabilir (floating pin).
  3. pinMode satırı unutulmuş olabilir. Butonun pini için setup() içinde pinMode(pin, INPUT_PULLUP); yazılmalıdır.
  4. Koşul == HIGH diye yazılmış olabilir. INPUT_PULLUP ile basılı durum LOW'dur. Bu yüzden LED basmadan yanar, basınca söner.
  5. LED'in yönü ve seri direnci kontrol et. LED'in uzun bacağı (anot) pin tarafına, kısa bacağı GND tarafına gelmelidir. LED'le birlikte uygun değerde bir seri direnç kullan.
  6. Ortak GND eksik olabilir. LED ya da başka bir bileşeni ayrı bir güç kaynağından besliyorsan, o kaynağın GND'si ile kartın GND'si birleştirilmelidir.

Mantığı sezgisel hâle getirmek istersen iki seçeneğin var. Birincisi, okunan değere "basılı" adını vermek. İkincisi, koşulu != HIGH diye kurmak. İkisi de çalışır; hangisi kodu sana daha okunur kılıyorsa onu seç.

const int BASILI = LOW;

if (digitalRead(2) == BASILI) {
  digitalWrite(13, HIGH);
}

Bu kodda 2 numaralı pindeki buton basılıyken LED'in bağlı olduğu 13 numaralı pin HIGH olur ve LED yanar. Basarken değerin kısa süre titreyip birden fazla okuma vermesi ise debounce adlı ayrı bir konudur ve bu yazının dışında kalır.

Devreyi kodla eşleştirmek, aslında if koşullarını mantıkla kurma pratiğine dayanır: "hangi durumda hangi değer okunur, ben buna göre ne yaparım?" sorusunu sorarsın. Bu beceriyi programlama diline bağlı kalmadan ücretsiz Algoritmik Düşünme Testi ile ölçebilirsin.

Sık Sorulan Sorular

INPUT_PULLUP kullanırken butona ayrıca direnç takmam gerekir mi?

Hayır. INPUT_PULLUP modu pinin dahili pull-up direncini devreye alır. Butonu yalnızca pin ile GND arasına bağlaman yeterlidir.

Buton bırakılıyken neden sürekli HIGH okuyorum?

Bu beklenen durumdur: pull-up pini basılmamışken HIGH'da tutar. Basınca da HIGH okuyorsan butonun bacaklarını, GND bağlantısını ve butonun doğru bacak çiftine takılıp takılmadığını kontrol et.

Butonu 'basınca HIGH' olacak şekilde bağlayabilir miyim?

Evet, pull-down düzeniyle bağlayabilirsin; bu ayrı bir kurulumdur ve INPUT_PULLUP ile yapılmaz. Pull-up ile devam edeceksen koşulu LOW'a göre kurman daha sade olur.

pinMode'u INPUT bırakırsam butonda ne olur?

Butonu yalnızca pin ile GND arasına bağladıysan, basmadığın anlarda pin hiçbir yere bağlı olmaz ve okuma kararsızlaşabilir. Bu yüzden bu bağlantı şeklinde INPUT_PULLUP kullanılır.

Buton devresinde ters çalışma çoğunlukla bir hata değil, aktif düşük mantığının doğal sonucudur. Devreyi, pin modunu ve koşulu sırayla kontrol ettiğinde sorunun nerede olduğunu kolayca bulursun.

Bu içerik aradığın cevabı verdi mi?
Yanıtın, hangi yazıları geliştirmemiz gerektiğini anlamamıza yardımcı olur.
Bu içeriğin üretilmesinde yapay zeka araçlarından destek alınmıştır.

Bu konudan sonra ne okuyabilirsin?

Tüm yazılar

İlgili Eğitimler

Berk Keskin, yazılım geliştirici ve eğitmen
Yazar

Berk Keskin Kimdir?

Yazılıma 12 yaşında başladı; İzmir Ekonomi Üniversitesi'ni bölüm birincisi ve yüksek şeref öğrencisi olarak tamamladı. Bugün yalnızca eğitim vermekle kalmıyor, sektörde aktif olarak yazılım projeleri geliştiriyor ve gerçek dünya deneyimini birebir derslerine taşıyor. Ezberden uzak, mühendislik zihniyetini merkeze alan sürdürülebilir öğrenme sistemleri tasarlayarak sorgulayan, üreten ve problem çözebilen yeni nesil yazılımcılar yetiştiriyor.

Sektörel Deneyim & Projeler

  • Ticarify Entegrasyon Yazılım logosu CEO Ticarify Entegrasyon YazılımPazaryerleri ve e-ticaret sitelerine otomatik e-fatura kesimi, sipariş ve kargo takibi hizmetleri sunan e-Dönüşüm platformunun API mimarisini ve yazılım ekibini yönetmektedir.
  • Benim Düğünüm logosu CEO Benim DüğünümDijital etkinlik ve anı paylaşım platformu.
  • Siberdizayn logosu Yazılım Ekibi Lideri SiberdizaynYüksek anlık oyuncu trafiğine sahip oyun kontrol panelleri ve sunucu altyapıları geliştiren yazılım ekibine liderlik etmektedir.
  • MEDYOGRAFYA 360° Dijital Çözümler logosu Dijital Strateji Lideri MEDYOGRAFYA 360° Dijital ÇözümlerŞirketlerin dijital çözümlerde uzun vadede nasıl ilerlemesi gerektiği ve dijital dönüşüm süreçlerinin yönetilmesine destek olmaktadır.
  • İzmir Ekonomi Üniversitesi logosu Danışma Kurulu Üyesi İzmir Ekonomi ÜniversitesiMezun olduğu üniversitesinde, Bilgisayar Programcılığı bölümünün akademik müfredatını güncel sektör ihtiyaçlarına göre şekillendirmek adına Danışma Kurulu'nda görev almaktadır.
WhatsApp Hemen Ara