Arduino trafik lambası projesi, kırmızı, sarı ve yeşil üç LED'i 220 ohm dirençlerle Arduino pinlerine bağlayıp belirli sürelerle sırayla yakan bir devredir. İlk kod delay() ile basitçe yazılır. Yaya butonu eklemek için millis() kullanılır; böylece Arduino beklerken de butonu okuyabilir. Devre yalnızca USB üzerinden gelen 5 V ile çalışır.
Trafik lambası, Arduino öğrenmeye başlayan öğrencilerin en sık yaptığı ilk projedir. Bu yazı ortaokul, lise ve meslek lisesi öğrencileri için hazırlandı. Önce üç LED'li temel devreyi ve delay() ile yazılan kodu, sonra yaya butonunu ve millis() ile yazılan kodu anlatıyoruz. Sonda ödevinizi nasıl sunacağınızı ve hangi ölçümleri yapabileceğinizi bulacaksınız.
Arduino trafik lambası projesi nedir?
Arduino trafik lambası, kırmızı, sarı ve yeşil LED'leri gerçek bir trafik ışığı gibi sırayla yakan küçük bir maket devredir. Arduino, LED'lerin ne zaman yanıp ne zaman söneceğini koddaki sürelere göre belirler. Proje dijital çıkış, zamanlama ve buton okuma konularını öğretir.
Türkiye'de trafik ışıklarında yeşilden önce kısa bir süre kırmızı ve sarı birlikte yanar. Bu yazıdaki kod da bu sırayı izler: kırmızı, kırmızı ve sarı, yeşil, sarı ve yeniden kırmızı. Arduino'yu ilk kez kullanıyorsanız öğrenciler için Arduino proje fikirleri yazısı iyi bir başlangıçtır.
Hangi malzemeler gerekir?
Proje için bir Arduino kartı, üç renkli LED, üç direnç, bir buton ve breadboard yeterlidir. Malzeme listesi aşağıdaki tabloda:
| Malzeme | Adet | Ne işe yarar? |
|---|---|---|
| Arduino Uno R3 | 1 | Kodu çalıştırır, LED'leri yakıp söndürür |
| 5 mm LED (kırmızı, sarı, yeşil) | 1'er | Trafik ışığının üç rengi |
| 220 ohm direnç | 3 | LED'den geçen akımı sınırlar |
| 6x6 mm tact buton | 1 | Yaya geçiş isteği butonu |
| 830 pin breadboard | 1 | Lehimsiz bağlantı yapmayı sağlar |
| Erkek-erkek jumper kablo | 6-8 | Arduino pinlerini breadboard'a bağlar |
Direnç neden 220 ohm? Arduino pini 5 V verir, kırmızı LED üzerinde yaklaşık 2 V düşer. Kalan 3 V, 220 ohm dirençten yaklaşık 3 / 220 ≈ 0,014 A, yani 14 mA akım geçirir. Bu değer LED için güvenlidir. Hesabın ayrıntısı LED direnci hesaplama yazısında var.
Trafik lambası devresi adım adım nasıl kurulur?
Trafik lambası devresi, her LED'i bir dirençle ayrı bir Arduino pinine bağlayarak kurulur. LED'in uzun bacağı anot (+), kısa bacağı katottur (−). Bağlantı sırası:
- Breadboard'un mavi (−) hattını Arduino'nun GND pinine bağlayın.
- Kırmızı LED'in kısa bacağını − hattına takın. Uzun bacağını 220 ohm dirençle Arduino'nun D12 pinine bağlayın.
- Sarı LED'i aynı şekilde 220 ohm dirençle D11 pinine bağlayın.
- Yeşil LED'i aynı şekilde 220 ohm dirençle D10 pinine bağlayın.
- Butonu breadboard'un ortasındaki boşluğun üzerine takın. Bir bacağını D2 pinine, çapraz karşısındaki bacağı − hattına (GND) bağlayın.
- Arduino'yu USB kablosuyla bilgisayara bağlayın ve önce aşağıdaki basit kodu yükleyin.
const int KIRMIZI = 12, SARI = 11, YESIL = 10;
void yak(int k, int s, int y, unsigned long sure) {
digitalWrite(KIRMIZI, k);
digitalWrite(SARI, s);
digitalWrite(YESIL, y);
delay(sure);
}
void setup() {
pinMode(KIRMIZI, OUTPUT); pinMode(SARI, OUTPUT); pinMode(YESIL, OUTPUT);
}
void loop() {
yak(HIGH, LOW, LOW, 5000); // kırmızı 5 s
yak(HIGH, HIGH, LOW, 1000); // kırmızı + sarı 1 s
yak(LOW, LOW, HIGH, 5000); // yeşil 5 s
yak(LOW, HIGH, LOW, 2000); // sarı 2 s
}
Breadboard'a yeniyseniz hangi deliklerin birbirine bağlı olduğunu breadboard nasıl kullanılır yazısından öğrenebilirsiniz.
Yaya butonu nasıl eklenir?
Yaya butonu, millis() fonksiyonuyla yazılan bir kodla eklenir; çünkü delay() çalışırken Arduino butonu okuyamaz. delay(5000) komutu Arduino'yu 5 saniye boyunca tamamen bekletir. Bu sürede butona basarsanız basış kaybolur.
millis(), Arduino açıldığından beri geçen süreyi milisaniye olarak verir. Kod her turda "bu ışık ne zamandır yanıyor?" diye bakar ve süre dolunca bir sonraki ışığa geçer. Arada butonu da okur. Aşağıdaki kodda yeşil ışık normalde 10 saniye yanar; yaya butona basarsa yeşil en az 3 saniye yandıktan sonra sarıya geçer.
const int KIRMIZI = 12, SARI = 11, YESIL = 10, BUTON = 2;
const unsigned long sure[4] = {5000, 1000, 10000, 2000};
int durum = 0; // 0 kırmızı, 1 kırmızı+sarı, 2 yeşil, 3 sarı
bool istek = false;
unsigned long basla = 0;
void setup() {
pinMode(KIRMIZI, OUTPUT); pinMode(SARI, OUTPUT); pinMode(YESIL, OUTPUT);
pinMode(BUTON, INPUT_PULLUP); // basılınca LOW okunur
}
void loop() {
if (digitalRead(BUTON) == LOW) istek = true;
unsigned long gecen = millis() - basla;
bool bitti = gecen >= sure[durum];
if (durum == 2 && istek && gecen >= 3000) bitti = true;
if (bitti) {
durum = (durum + 1) % 4;
basla = millis();
if (durum == 2) istek = false;
}
digitalWrite(KIRMIZI, durum <= 1);
digitalWrite(SARI, durum == 1 || durum == 3);
digitalWrite(YESIL, durum == 2);
}
INPUT_PULLUP, Arduino'nun içindeki direnci açar. Bu sayede buton için ayrı direnç gerekmez: buton bırakıkken pin HIGH, basılıyken LOW okunur. Hazır bir parça tercih ederseniz LED trafik lambası modülü üç LED'i ve dirençlerini tek kartta toplar.
Hangi güvenlik kurallarına dikkat edilmeli?
Bu proje yalnızca USB'den gelen 5 V ile çalışır; prize (220V) hiçbir parça bağlanmaz. Yine de şu kurallara uyun:
- LED'i dirençsiz bağlamayın. Fazla akım hem LED'i hem Arduino pinini bozabilir.
- Kablo değiştirmeden önce USB kablosunu çıkarın.
- 5V ve GND pinlerini bir kabloyla doğrudan birleştirmeyin; bu kısa devredir.
- Maketi powerbank ya da pil ile çalıştıracaksanız şişmiş veya ısınan pili kullanmayın.
- Maket için maket bıçağı ve sıcak silikon tabancası kullanırken bir yetişkin yanınızda olsun.
Ödevinizi nasıl sunarsınız?
Ödevinizi, trafik ışığının sürelerini bir araştırma sorusuna bağlayarak sunarsanız proje sıradan bir LED devresinden öteye geçer. Örnek bir kurgu:
- Araştırma sorusu: "Yaya butonu, yayanın bekleme süresini ne kadar kısaltır?"
- Hipotez: "Butonlu sistemde yayanın ortalama bekleme süresi, butonsuz sisteme göre daha kısadır."
- Ölçüm: Yeşil yanarken rastgele anlarda butona basın. Basış ile kırmızının yanması arasındaki süreyi kronometreyle 10 kez ölçün. Aynı ölçümü butonsuz kodla da yapın.
- Sunum: İki ortalamayı bir sütun grafikte karşılaştırın.
- Sonuç: Farkı saniye olarak yazın ve gerçek kavşaklardaki yaya butonlarıyla ilişkilendirin.
Maketi kartondan bir kavşak üzerine kurmak sunumu güçlendirir. LED'lerin diğer renk ve boyutlarını diyot ve LED kategorisinde bulabilirsiniz.
Sık sorulan sorular
LED yanmıyorsa ne yapmalıyım?
Önce LED'in yönünü kontrol edin; uzun bacak dirence ve Arduino pinine, kısa bacak GND'ye gitmelidir. Sonra kodda pin numaralarının kablolarla aynı olduğuna bakın. Breadboard'da LED bacaklarının aynı sıraya takılmadığından emin olun. Hâlâ yanmıyorsa LED'i doğrudan 220 ohm dirençle 5V ve GND arasına bağlayıp sağlamlığını deneyin.
220 ohm yerine başka direnç kullanılabilir mi?
Evet, 220 ile 1.000 ohm arasındaki dirençler 5 V'ta LED'ler için güvenlidir. Direnç büyüdükçe akım azalır ve LED daha sönük yanar. Örneğin 1 kOhm ile kırmızı LED'den yaklaşık 3 mA geçer. 100 ohm'un altına inmeyin; akım LED'in ve pinin sınırına yaklaşır.
delay ile millis arasındaki fark nedir?
delay(), Arduino'yu verilen süre boyunca tamamen durdurur; bu sırada buton ya da sensör okunamaz. millis() ise geçen zamanı ölçer ve Arduino'nun çalışmayı sürdürmesine izin verir. Bu yüzden birden fazla işi aynı anda yapan projelerde, örneğin buton okuyan trafik lambasında, millis() kullanılır. Basit gösterimler için delay() yeterlidir.
Butona basınca neden hemen yeşil yanmıyor?
Kod bilerek böyle yazıldı: buton, araçlar için yanan yeşili kısaltır ve yayaya kırmızı ışık sırasında geçiş verir. Yeşil en az 3 saniye yanar, sonra sarı ve kırmızı gelir. Gerçek kavşaklarda da araçların aniden durmaması için benzer bir bekleme vardır. Süreleri kodun başındaki sayılarla değiştirebilirsiniz.
İki yönlü kavşak yapabilir miyim?
Evet, ikinci bir LED üçlüsünü D7, D6 ve D5 gibi boş pinlere bağlayarak iki yönlü kavşak yapabilirsiniz. Bir yön yeşilken diğer yön kırmızı olmalıdır. Kodda her durum için altı LED'in ne yapacağını yazmanız yeter. Bu ek, projeyi ortaokul seviyesinden lise seviyesine taşır.
Özet
- Arduino trafik lambası; üç LED, üç 220 ohm direnç ve bir Arduino ile kurulur.
- Bu yazıda kırmızı D12, sarı D11, yeşil D10 pinine, yaya butonu D2 pinine bağlıdır.
- delay() ile yazılan kod basittir ama beklerken butonu okuyamaz.
- millis() ile yazılan kod hem ışıkları yönetir hem de yaya butonunu sürekli okur.
- Ödevde yaya bekleme süresini ölçüp butonlu ve butonsuz sistemi karşılaştırabilirsiniz.
