Raspberry Pi'de bir GPIO girişi sürekli 1 okuyorsa en sık görülen sebep, pinin hiçbir yere sabitlenmemiş (floating) olması ya da pull-up direnciyle 3.3 V tarafına çekilmiş olmasıdır. Input modundaki pin yalnızca üzerindeki voltajı okur, kendi seviyesini belirleyemez. Bu yüzden pull-up ya da pull-down ayarını, pin yönünü ve bağlantı şemasını birlikte kontrol etmek gerekir. Aşağıda Raspberry Pi GPIO girişi sürekli 1 okuyor sorununu yazılımdan kabloya doğru sırayla eleyeceğiz.
Giriş modu, HIGH/LOW ve pull-up/pull-down ne anlama geliyor?
Bir pin input olarak ayarlandığında Raspberry Pi o pinin voltajına bakar ve sonucu HIGH (1) ya da LOW (0) olarak yorumlar. Pin hiçbir şeye bağlı değilse okunacak net bir seviye yoktur. Böyle bir pine floating denir; çevredeki elektriksel etkilerden etkilenebilir, bazen 1 gibi görünür, bazen değeri rastgele değişir.
Çözüm, pini boştayken bilinen bir seviyeye çekmektir:
- Pull-up: Pin, bir direnç üzerinden 3.3 V tarafına çekilir. Hiçbir şey bağlı değilken okuma 1 olur.
- Pull-down: Pin, bir direnç üzerinden GND tarafına çekilir. Hiçbir şey bağlı değilken okuma 0 olur.
Pull-up düzeninde buton, pini GND'ye bağlayacak şekilde yerleştirilir:
3.3 V ---[direnç]---+--- GPIO pini
|
[buton]
|
GND
Buton açıkken pin dirençten 3.3 V alır ve 1 okur. Butona basınca pin GND'ye bağlanır ve 0 okur. Yani pull-up'ta basılmadı = 1, basıldı = 0 olur; bu bir hata değil, düzenin doğal sonucudur.
Raspberry Pi GPIO pinleri 3.3 V mantık düzeyinde çalışır ve 5 V toleranslı değildir. Pine 5 V'luk bir sinyal vermek kartı bozabilir. Dahili pull-up ve pull-down dirençleri ise ek parça gerektirmeden yazılımla etkinleştirilebilir.
Teşhise nereden başlamalı? Dört katmanlı kontrol akışı

Sorunun tek bir sebebi olmayabilir; yanlış kod, eksik pull ayarı ve gevşek bir kablo aynı belirtiyi verebilir. Bu yüzden kontrolleri en hızlı ve en ucuz olandan başlayarak sırayla yap. Kod değiştirmek saniyeler sürer, kablo ve devre kontrolü ise daha fazla zaman alır. Sürekli 1 okuyan girişte önce sensörü değil, pinin varsayılan elektrik seviyesini kontrol et. Sensör bozuk olabilir, ama önce pinin boştayken hangi seviyede durduğunu bilmen gerekir.
- Yazılım: Pin gerçekten input mu, koddaki numara bağladığın pinle aynı mı? Yanlışsa okuduğun değer butonla ilgisizdir.
- Pin yapılandırması: Pull-up mı, pull-down mı, yoksa hiçbiri mi seçili? Hiçbiri seçiliyse pin floating kalabilir.
- Direnç seçimi: Dahili pull yeterli mi, yoksa harici direnç mi gerekiyor? Harici direnç takılıysa yönü, yani 3.3 V'a mı GND'ye mi gittiği şemayla uyuşmalı.
- Fiziksel kablo: Kablo doğru pinde ve sağlam mı, ortak GND var mı? Gevşek ya da yanlış bağlantı, pini yine boşta bırakır.
Her katmanın ayrıntısı sonraki bölümlerde işleniyor. Önce yazılımla başlıyoruz.
Katman 1: Yazılımda pin yönü, numaralandırma ve ters mantık
İlk kontrol, pinin kodda input olarak ayarlandığıdır. İkincisi numaralandırmadır. RPi.GPIO'da GPIO.setmode() ile BCM (işlemci kanal numarası) ya da BOARD (kart üzerindeki fiziksel sıra) düzeninden birini seçersin. Aynı sayı iki düzende farklı pinlere denk gelir. Gpiozero ise BCM numaralandırmasını kullanır. Hiçbir kart için belirli bir numara varsaymak doğru olmaz; kendi kartının pin şemasına bak.
Aşağıdaki kod örnek amaçlıdır; 17 yalnızca örnek bir BCM numarasıdır, kendi bağlantına göre değiştir:
import RPi.GPIO as GPIO
ORNEK_PIN = 17 # örnek numara, kendi bağlantına göre değiştir
GPIO.setmode(GPIO.BCM)
GPIO.setup(ORNEK_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
print(GPIO.input(ORNEK_PIN))
GPIO.cleanup()
Buton doğru pine bağlıysa beklenen çıktı, basılmıyorken 1, basılıyken 0'dır. Butonu başka bir pine bağlayıp bu kodu çalıştırırsan, pull-up etkin olduğu için okuduğun pin boşta kalır ve butona ne kadar basarsan bas hep 1 görürsün. Basınca hiç değişmeyen bir 1, numara hatasının tipik belirtisidir.
RPi.GPIO'da pull_up_down vermezsen kütüphane pine ek bir pull ayarı yapmaz; pin floating kalabilir.
Gpiozero'da mantık farklıdır. Button sınıfı varsayılan olarak pull-up kullanır ve is_pressed basılı olduğunda True döndürür:
from gpiozero import Button
dugme = Button(17) # BCM numarası, örnek
print(dugme.is_pressed)
Butona basılmıyorken False, basılıyken True görürsün. Ham okumada basılınca 0 gelirken gpiozero'da basılınca True gelir. İkisini karıştırırsan doğru çalışan bir devreyi hatalı sanabilirsin.
Katman 2 ve 3: Dahili pull ayarı ve harici direnç ne zaman gerekir?
Giriş olarak tanımlanmış ama hiçbir seviyeye bağlanmamış bir pin kararsız (floating) kalır. Okuduğun 1 ya da 0, çevredeki elektrik gürültüsünün sonucu olabilir. Pull-up direnci pini 3.3 V'a, pull-down direnci GND'ye doğru çeker. Pin böylece butona basılmadığında bile bilinen bir seviyede durur.
Raspberry Pi'nin GPIO pinlerinde yazılımdan açılıp kapatılabilen dahili pull dirençleri bulunur. Ancak bunlar kodda açıkça istenmedikçe senin adına devreye girmez. Bazı pinlerin açılıştaki varsayılan pull durumu da diğerlerinden farklı olabilir. Bu yüzden kendi pininin varsayılanını varsaymak yerine kartının resmî GPIO dokümantasyonuna bak ve ayarı kodda her zaman kendin belirt.
Pull-up ile pull-down karışınca ne olur?
Buton GND'ye bağlıysa pini pull-up yapmalısın. Buton basılmayınca pin 1, basılınca 0 okur. Buton 3.3 V'a bağlıysa pull-down gerekir, mantık tersine döner. İkisini karıştırırsan basma etkisi görünmez: GND'ye bağlı butonda pull-down seçersen pin hep 0 kalır. Pull-up seçip butonu yanlış tarafa bağlarsan pin hep 1 kalır.
Hangi durumda hangisi?
- Kısa kablolu basit buton: Dahili pull çoğu zaman yeterlidir, ek parça gerekmez.
- Uzun kablo ya da gürültülü ortam: Kablo anten gibi davranıp parazit toplayabilir. Harici bir pull direnci pini daha sağlam tutabilir.
- Modül çıkışının belirli bir seviyeye ihtiyacı varsa: Bazı modüllerin çıkışı açık kollektör ya da açık drain yapıdadır ve harici pull ister. Bunu modülün veri sayfasından öğren.
- Dahili ve harici pull birlikte: Aynı pinde ikisini çelişen yönlerde kurma. Biri yukarı, diğeri aşağı çekerse pin ara bir seviyede kalabilir. Harici direnç kullanacaksan dahili pull'u kapat ya da aynı yöne ayarla.
Direnç değeri için tek bir sayı vermek yerine ölçüte bak. Çok düşük değer gereksiz akım çeker ve butona basılınca ısınma, güç kaybı yaratır. Çok yüksek değer pini gürültüye açık bırakır. Kullandığın buton ya da modülün resmî veri sayfası uygun aralığı verir; değeri oradan seç.
Katman 4: Kablo, pin ve ortak GND kontrolü (güvenlik dahil)

Yazılım ve pull ayarı doğruysa sıra fiziksel bağlantıdadır. Şunlara bak:
- Jumper kablolar kopuk ya da gevşek olabilir; breadboard deliğine tam oturmamış kablo temas etmez.
- Breadboard'da güç ve toprak hatları kartın üstünde ve altında ayrı olabilir. Ortada kesilen hatları kontrol et.
- Butonun bacak yönü önemlidir. Dört bacaklı butonlarda yan yana görünen bacaklar içeride zaten bağlı olabilir; bu durumda buton hiçbir zaman devreyi açmaz ya da kapatmaz.
- Kablo kod içindeki pine değil, komşu bir pine takılmış olabilir.
- Harici sensör kullanıyorsan sensörün GND'si ile Raspberry Pi'nin GND'si ortak olmalıdır. Ortak referans yoksa okuma anlamsız çıkar.
Pini açıkta bırakarak teşhis
- Önce beslemeyi kes, ardından butonu devreden ayır.
- Pinde yalnızca kod tarafındaki pull ayarı kalsın; beslemeyi geri ver ve değeri oku.
- Pull-up ile 1, pull-down ile 0 okuyorsan pin ve yazılım doğru çalışıyor demektir. Sorun butonda ya da kablodadır.
- Beklenenin tersini okuyorsan ya da değer rastgele oynuyorsa pull ayarına ya da pin numarasına dön.
- Butonu geri takıp bacakları ve kabloları tek tek yeniden kontrol et.
Elektrik güvenliği
GPIO pinleri 3.3 V mantık düzeyindedir. 5 V'luk bir sinyali doğrudan pine bağlama; pin zarar görebilir. Sensörün çıkışı 5 V ise seviye uyumlaması gerekir, bunu bileşenin veri sayfasından doğrula. 3.3 V çıkış pininden çekilecek akımın da bir sınırı vardır; ayrıntı için resmî Raspberry Pi dokümantasyonuna bak. Bağlantıyı değiştirmeden önce beslemeyi kes. 3.3 V ile GND'yi doğrudan birleştirme, çünkü bu kısa devre olur.
Güvenli buton senaryosu: basılmayınca 1, basılınca 0
Butonun bir bacağını seçtiğin GPIO pinine, diğer bacağını GND'ye bağla. Pini dahili pull-up ile yapılandırırsan basılmayan buton 1, basılan buton 0 verir. Aşağıdaki kodda 17 örnek pindir; kendi kartının pin şemasından doğrula. BCM numarası ile fiziksel pin numarasını da karıştırma.
import time
import RPi.GPIO as GPIO
PIN = 17 # örnek pin (BCM numarası)
GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
try:
while True:
print(GPIO.input(PIN))
time.sleep(0.3)
except KeyboardInterrupt:
pass
finally:
GPIO.cleanup()
setmode BCM numaralandırmasını seçer. setup pini giriş yapar ve dahili pull-up'ı açar. Döngü her 0,3 saniyede ham değeri yazdırır. finally bloğundaki GPIO.cleanup(), Ctrl+C ile çıkışta pinleri varsayılan duruma döndürür. RPi.GPIO'nun kullandığın Pi modeli ve işletim sistemiyle uyumunu resmî dokümantasyondan kontrol et. Uyumsuzsa gpiozero kütüphanesindeki Button sınıfı aynı işi görür.
Beklenen çıktı: buton basılı değilken satırlar 1, basılıyken 0, bıraktığında yine 1 olur. Basarken 1 kalıyorsa butonun GND bacağına ya da bacak yönüne (Katman 4) bak. Hep 0 geliyorsa pull ayarını (Katman 2) kontrol et. Değerler rastgele oynuyorsa pin yapılandırılmamış ya da bağlantı gevşektir.
Kodu okurken takıldığın yerler olduysa ücretsiz Python bilgi testi ile mevcut seviyeni ölçebilir, hangi konulara çalışman gerektiğini görebilirsin.
Hâlâ 1 okuyorsa: sensör modülleri ve kalan olasılıklar
Yazılım, pin yapılandırması, direnç ve kablo katmanları elendiyse sorun çoğunlukla bağladığın parçanın kendisindedir. Burada tek bir neden aramak yerine olasılıkları sırayla elemek daha güvenilir sonuç verir.
Modülün çıkış tipi ve mantığı
Hazır sensör modüllerinin çıkışı iki türlü olabilir. Aktif çıkışlı modül pini kendisi hem HIGH hem LOW yapar. Açık kollektör ya da açık drenli çıkış ise pini yalnızca LOW'a çeker, HIGH için bir pull-up gerekir. Bazı modüllerin kartında bu direnç hazır bulunur. Bu yüzden modül bağlıyken pin sürekli 1 okuyabilir.
Bazı modüller de ters mantıkla çalışır: algılama olduğunda çıkış LOW olur. Bu durumda sürekli 1 okuman arızaya değil, "algılama yok" durumuna işaret eder. Modülün veri sayfasında çıkışın hangi durumda hangi seviyeye gittiğine bak.
3.3 V uyumu
Raspberry Pi'nin GPIO girişleri 3.3 V mantıkla çalışır. 5 V ile beslenen aktif çıkışlı bir modül, pine 5 V verebilir. Modülün kendi pull-up'ı 5 V hattına bağlıysa aynı risk vardır. Bu hem okumayı bozar hem de pine zarar verebilir. Modülü 3.3 V ile beslemek ya da mantık düzeyi dönüştürücü kullanmak gerekir. Modülün çıkış seviyesinden emin değilsen bağlamadan önce çıkış pinini multimetreyle ölç.
Çıkarma yöntemini uygula
- Sensör modülünü ayır ve pini bir jumper ile GND'ye bağla. Pin giriş olarak ayarlıysa bu güvenlidir. Okuma 0 oluyorsa yazılım ve pin sağlam demektir.
- Aynı pine pini bilinen iyi bir butonu bağla. Doğru çalışıyorsa sorun önceki butonda ya da modülde olabilir.
- Şüpheli parçayı başka bir GPIO pinine taşı. Sonuç değişiyorsa ilk pin ya da o pinin yazılımdaki tanımı incelenmelidir.
- Jumper kablosunu değiştir. İçi kopmuş bir kablo pini yine havada bırakır.
Her adımda yalnızca bir şeyi değiştir; böylece neyin elendiği net kalır. Kusurlu buton, yapışmış kontak ya da bozuk jumper bu yöntemle ayrılır. Elektronik ve Python denemelerinde işine yarayacak diğer konular için blogdaki ilgili yazılara göz atabilirsin.
Sık Sorulan Sorular
Raspberry Pi GPIO girişi buton basmadan da rastgele 0 ve 1 arasında değişiyor, neden?
Pin pull-up ya da pull-down ile belirli bir seviyeye bağlanmamışsa floating durumda kalır ve çevredeki elektriksel gürültüyü okuyabilir. Dahili pull ayarını yapmak ya da harici direnç eklemek bu dalgalanmayı genellikle giderir.
Dahili pull-up kullanıyorsam harici direnç de gerekir mi?
Basit bir buton için genellikle gerekmez; dahili pull-up pini yüksek seviyede tutar. Uzun kablo, gürültülü ortam ya da modülün kendi gereksinimi varsa harici direnç düşünülebilir. İkisini birlikte kullanırken devrenin toplam davranışını kontrol et.
Pull-up mı pull-down mı seçmeliyim?
Başlangıç için pull-up pratiktir: buton pini GND'ye bağlar, basılmayınca 1, basılınca 0 okursun. Pull-down'da mantık tersine döner. Önemli olan seçimi koda doğru yansıtmaktır.
GPIO giriş pinine 5 V sinyal doğrudan bağlanabilir mi?
Hayır. Raspberry Pi GPIO pinleri 3.3 V mantıkla çalışır ve 5 V'a dayanıklı değildir. 5 V çıkışlı bir kaynak için mantık düzeyi dönüştürücü ya da uygun bir gerilim bölücü kullan.
Sürekli 1 okuyan bir giriş çoğu zaman tek bir noktayı gösterir: pinin hangi seviyeye bağlandığı. Parçaları tek tek eleyerek ilerlediğinde nedeni sakin biçimde bulabilirsin.