Proje hakkında
Bir trafik lambası, belirli bir sırayla belirli sürelerde değişen bir durum makinesidir. Bu projede araçlar için yeşil yanan lambayı, yaya butona bastığında güvenli bir sırayla kırmızıya çevireceğiz. Türkiye'deki trafik lambalarında olduğu gibi, yeşile dönmeden önce kırmızı ve sarı birlikte yanacak.
Butonu okumak için ek bir direnç kullanmayacağız; gpiozero Raspberry Pi'nin içindeki pull-up direncini otomatik olarak açar. Ayrıca butona basılana kadar programı bekleten wait_for_press() fonksiyonunu ve ışıkları tek satırda ayarlamayı sağlayan tuple yapısını öğreneceğiz.
- gpiozero'nun TrafficLights ve Button sınıflarını
- Dahili pull-up direncinin nasıl çalıştığını
- wait_for_press() ile olay beklemeyi
- Durumları tuple listesiyle tanımlayıp döngüyle oynatmayı
Malzeme listesi
Projeyi tamamlamak için aşağıdaki 8 çeşit malzemeye ihtiyacınız var. Raspberry Pi'niz hazırsa geri kalan parçaların çoğu elektronik başlangıç setlerinde bulunur.
Raspberry Pi 4 veya 5 1 adet
Raspberry Pi OS (Bookworm veya üstü) kurulu olmalı. Pi 3B+ ile de çalışır.
microSD kart 1 adet
En az 16 GB, Raspberry Pi OS yüklü.
Resmi güç adaptörü 1 adet
Pi 5 için 5V 5A USB-C, Pi 4 için 5V 3A USB-C.
Breadboard 1 adet
Yarım boy (400 delik) yeterlidir.
5 mm LED (kırmızı, sarı, yeşil) 3 adet
Her renkten bir tane.
330 Ω direnç 3 adet
Her LED için bir direnç.
Push buton 1 adet
4 bacaklı tactile buton.
Jumper kablo (dişi-erkek) 6 adet
Devre bağlantıları
Bağlantıları Raspberry Pi kapalıyken ve güç kablosu çıkarılmışken yapın. Her satırda önce GPIO (BCM) numarası, ardından kart üzerindeki fiziksel pin numarası yazar; çizgi rengi önerilen kablo rengidir.
Adım adım kurulum
Pi'yi kapatın
Güç kablosunu çıkarın.
Ortak GND hattını kurun
Pin 9'u (GND) breadboard'un mavi (−) hattına bağlayın. Tüm LED'lerin kısa bacakları bu hatta gidecek.
LED'leri sıralayın
Kırmızı, sarı ve yeşil LED'leri yukarıdan aşağıya dizin. Kısa bacakları − hattına bağlayın, uzun bacaklarının sütununa birer 330 Ω direnç takın.
LED'leri pinlere bağlayın
Kırmızının direncini pin 15'e (GPIO22), sarınınkini pin 13'e (GPIO27), yeşilinkini pin 11'e (GPIO17) bağlayın.
Butonu bağlayın
Butonu orta kanala yerleştirin. Bir bacağını pin 3'e (GPIO2), çapraz bacağını pin 6'ya (GND) bağlayın.
Kodu çalıştırın
Pi'yi açın, kodu trafik_lambasi.py olarak kaydedip çalıştırın. Yeşil yanmalı ve ekrana bekleme mesajı gelmeli.
Test edin
Butona basın: 1 saniye sonra sarı, ardından kırmızı yanar; 5 saniyelik yaya süresinden sonra kırmızı-sarı birlikte yanar ve tekrar yeşile döner.
Python kodu
Kodları Thonny editörüne yapıştırıp .py uzantısıyla kaydedin ve Run düğmesine basın ya da terminalden python3 dosya_adi.py komutuyla çalıştırın. Programı durdurmak için Ctrl+C tuşlarını kullanın.
Butonla tetiklenen yaya geçidi programı.
# Butonlu Yaya Geçidi Trafik Lambası
# RobotikHocasi.com
from gpiozero import TrafficLights, Button
from time import sleep
isiklar = TrafficLights(red=22, amber=27, green=17)
buton = Button(2) # Dahili pull-up otomatik açılır
isiklar.green.on()
print("Araclar geciyor. Yaya butonu bekleniyor...")
while True:
buton.wait_for_press() # Butona basılana kadar bekle
print("Yaya istegi alindi!")
sleep(1)
# Yeşil -> Sarı
isiklar.green.off()
isiklar.amber.on()
sleep(2)
# Sarı -> Kırmızı: yayalar geçer
isiklar.amber.off()
isiklar.red.on()
print("Yayalar gecebilir")
sleep(5)
# Kırmızı + Sarı: yeşil yanmak üzere
isiklar.amber.on()
sleep(1)
# Tekrar yeşil
isiklar.red.off()
isiklar.amber.off()
isiklar.green.on()
print("Araclar geciyor")
Bonus: Buton olmadan sürekli dönen kavşak lambası; durumlar tek bir listede tanımlanır.
# Otomatik trafik lambası döngüsü
from gpiozero import TrafficLights
from time import sleep
isiklar = TrafficLights(red=22, amber=27, green=17)
# (kırmızı, sarı, yeşil) durumları ve süreleri (saniye)
dongu = [
((0, 0, 1), 6), # Yeşil
((0, 1, 0), 2), # Sarı
((1, 0, 0), 6), # Kırmızı
((1, 1, 0), 1), # Kırmızı + sarı
]
while True:
for durum, sure in dongu:
isiklar.value = durum
sleep(sure)
Kod açıklaması
TrafficLights(red=22, amber=27, green=17)Üç LED'i tek bir nesnede toplar. isiklar.red, isiklar.amber ve isiklar.green ile her birine ayrı ayrı ulaşabilirsiniz.
Button(2)GPIO2'deki butonu temsil eder. Varsayılan olarak dahili pull-up açılır; buton basılı değilken pin 3,3V, basılınca 0V olur.
buton.wait_for_press()Program bu satırda durur ve butona basılmasını bekler. Bu sırada işlemciyi meşgul etmez.
((0, 0, 1), 6)İç içe tuple: ilk kısım (kırmızı, sarı, yeşil) LED durumları, ikinci kısım saniye cinsinden süre.
isiklar.value = durumÜç LED'in durumunu tek satırda ayarlar. (1, 1, 0) kırmızı ve sarıyı yakar, yeşili söndürür.
for durum, sure in dongu:Listedeki her tuple'ı açarak iki değişkene ayırır. Python'da buna tuple açma (unpacking) denir.
Nasıl çalışır?
Buton, iki bacağı arasındaki yolu basıldığında kapatan basit bir anahtardır. gpiozero, GPIO2 pinini Raspberry Pi'nin içindeki pull-up direnciyle 3,3V'a çeker. Butona basıldığında pin doğrudan GND'ye bağlanır ve 0V olur. Kütüphane bu düşüşü "basıldı" olarak yorumlar ve mekanik titreşimleri de kendi içinde filtreler.
Trafik lambası sırası güvenlik için tasarlanmıştır. Yeşilden doğrudan kırmızıya geçilmez; sarı, sürücülere durmaları için zaman tanır. Kırmızı ile sarının birlikte yanması ise sürücülere yeşilin gelmek üzere olduğunu haber verir. Gerçek kavşaklarda bu süreler trafik yoğunluğuna göre ayarlanır.
Sorun giderme
Butona basmadan program devam ediyor
Butona bastığım halde bir şey olmuyor
Yanlış LED yanıyor
Program kapandığında LED'ler yanık kalıyor
Geliştirme fikirleri
Projeyi tamamladıysanız, aşağıdaki fikirlerle bir adım öteye taşıyabilirsiniz.
Yaya için ikinci lamba
Kırmızı ve yeşil iki LED daha ekleyip yayalar için ayrı bir lamba yapın.
Geri sayım
Yaya süresi boyunca terminale kalan saniyeyi yazdırın veya buzzer ile bip sesi verin.
Gece modu
Belirli saatler arasında sadece sarı ışığın yanıp söndüğü bir mod ekleyin.
Web'den kontrol
Flask ile telefondan yaya isteği gönderilebilen bir arayüz yapın.