Arduino ile Trafik Lambası Yapımı ve Kodları
Temel seviye bir LED yakıp söndürme (Blink) uygulamasını başarıyla tamamladıktan sonra atılacak en mantıklı ve öğretici ikinci adım, gerçek hayattaki kavşak sinyalizasyonunu simüle eden **"Trafik Lambası Projesi"**dir. Bu proje; birden fazla dijital çıkış pinini eşzamanlı ve sıralı olarak yönetmeyi, zamanlama mantığını kurmayı ve gerçek dünya kurallarını koda dökmeyi öğretir.
Bu rehberde; gerekli malzemeleri, renk kodlarına göre direnç bağlantılarını, devre şemasını, tam çalışan Arduino C++ kodlarını ve projeyi yayalar için butonlu akıllı kavşağa dönüştürme yöntemlerini adım adım inceliyoruz.
---
1. Projenin Amacı ve Trafik Lambası Çalışma Mantığı
Gerçek bir trafik lambası rastgele yanıp sönmez; belirli bir matematiksel ve güvenlik odaklı algoritmayı takip eder:
1. **Kırmızı Işık Yanar:** Araçlar durur (Örneğin 6 saniye).
2. **Kırmızı + Sarı Işık Birlikte Yanar:** Araçlar kalkışa hazırlanır (2 saniye).
3. **Kırmızı ve Sarı Söner, Yeşil Işık Yanar:** Araçlar geçer (6 saniye).
4. **Yeşil Söner, Sarı Işık Yanar:** Araçlar yavaşlar ve durmaya hazırlanır (2 saniye).
5. **Sarı Söner, Tekrar Kırmızı Yanar:** Döngü başa döner.
Bu projedeki amacımız, Arduino Uno'nun 3 farklı dijital pinini kullanarak bu zamanlama döngüsünü milisaniyelik hassasiyetle çalıştırmaktır.
---
2. Gerekli Malzemeler Listesi
| Malzeme | Miktar | Görevi |
|---|---|---|
| **Arduino Uno R3** | 1 Adet | Ana kontrol kartı |
| **Kırmızı 5mm LED** | 1 Adet | "Dur" sinyali göstergesi |
| **Sarı 5mm LED** | 1 Adet | "Hazırlan" sinyali göstergesi |
| **Yeşil 5mm LED** | 1 Adet | "Geç" sinyali göstergesi |
| **220Ω Direnç** | 3 Adet | Her bir LED için akım sınırlama direnci |
| **Breadboard (Devre Tahtası)** | 1 Adet | Devreyi lehimsiz kurmak için |
| **Jumper Kablolar (Erkek-Erkek)**| 4-5 Adet | Pin bağlantıları ve ortak GND için |
---
3. Devre Şeması ve Pin Bağlantı Tablosu
[Pin 10] ---> [220Ω] ---> [Kırmızı LED (+)] ---|
[Pin 9] ---> [220Ω] ---> [Sarı LED (+)] ---|---> [Ortak GND Hattı] ---> [Arduino GND]
[Pin 8] ---> [220Ω] ---> [Yeşil LED (+)] ---|
---
4. Tam ve Çalışan Arduino C++ Kodları
/*
* RobotKodla.com - Arduino Uygulamalı Dersler
* Proje: Klasik Trafik Lambası Simülasyonu
*/
const int kirmiziPin = 10;
const int sariPin = 9;
const int yesilPin = 8;
void setup() {
pinMode(kirmiziPin, OUTPUT);
pinMode(sariPin, OUTPUT);
pinMode(yesilPin, OUTPUT);
}
void loop() {
// 1. AŞAMA: Kırmızı Işık Yanar
digitalWrite(kirmiziPin, HIGH);
digitalWrite(sariPin, LOW);
digitalWrite(yesilPin, LOW);
delay(6000);
// 2. AŞAMA: Kırmızı + Sarı Birlikte Yanar
digitalWrite(sariPin, HIGH);
delay(2000);
// 3. AŞAMA: Yeşil Işık Yanar
digitalWrite(kirmiziPin, LOW);
digitalWrite(sariPin, LOW);
digitalWrite(yesilPin, HIGH);
delay(6000);
// 4. AŞAMA: Sarı Işık Yanar
digitalWrite(yesilPin, LOW);
digitalWrite(sariPin, HIGH);
delay(2000);
}
---
5. Projeyi Bir Adım Öteye Taşıyın: Butonlu Yaya Geçidi Ekleme
Gerçek hayattaki modern trafik ışıklarında yayalar için bir talep butonu bulunur. Butona basılmadığı sürece araçlara sürekli yeşil yanar; yayalar butona bastığında ise sistem güvenli bir şekilde araçlara sarı ve kırmızı yakarak yayaların geçişine izin verir.
Butonlu Yaya Geçidi Algoritması:
1. Normal durumda yeşil LED sürekli yanar.
2. 2 numaralı pine bağlı bir buton `digitalRead(2)` ile sürekli dinlenir.
3. Butona basıldığı an (`if (butonDurum == HIGH)`):
---
6. Trafik Işıklarında Millis() ile Asenkron Zamanlama (İleri Seviye)
Standart kodda kullanılan `delay()` fonksiyonu işlemciyi tamamen dondurur. Bu durum gerçek dünyada büyük bir güvenlik zaafıdır; çünkü araçlara kırmızı ışık yanarken acil bir ambulans sireni veya yaya butonu basıldığında sistem o `delay` bitene kadar hiçbir girdiye yanıt veremez.
Bunun profesyonel çözümü Arduino'nun dahili zaman sayacı olan `millis()` fonksiyonunu kullanmaktır:
---
7. Sık Yapılan Hatalar ve Pratik Çözümleri
| Hata Durumu | Muhtemel Neden | Kesin Çözüm |
|---|---|---|
| Işıklardan biri hiç yanmıyor | LED'in yönü ters takılmış | İlgili LED'i söküp bacaklarını 180 derece ters çevirerek takın. |
| Tüm ışıklar aynı anda yanıp sönüyor | Koddaki pin numaraları çakışmış | Kod satırlarında her bir LED'in tanımlandığı pinlerin farklı olduğunu kontrol edin. |
| Işıklar çok soluk yanıyor | Yanlış direnç seçimi | 220Ω yerine 10kΩ veya 100kΩ direnç takmış olabilirsiniz. |
| Devre bir süre çalışıp kilitleniyor | Güç dalgalanması | Arduino'yu doğrudan ana USB portuna bağlayın. |
---
---
8. Trafik Işıklarında Millis() ile Asenkron Zamanlama Mimarisi
Geleneksel Arduino kodlarında kullanılan `delay()` fonksiyonu işlemciyi belirlenen süre boyunca tamamen kilitler. Gerçek bir kavşakta ise kırmızı ışık yanarken acil bir ambulans sireni veya yaya butonu basıldığında sistemin anında tepki vermesi gerekir.
Bu problemi çözmek için Arduino'nun arka planda çalışan dahili saat sayacı olan `millis()` fonksiyonu kullanılır:
---
9. Proje İçin Kendini Geliştirme Görevleri (Challenges)
1. **Sesli Yaya Uyarısı (Görme Engelliler İçin):** Devreye bir buzzer ekleyin. Yayalara kırmızı yanarken saniyede bir yavaş 'bip', yeşil yandığında ise yayaların güvenle geçebilmesi için hızlı 'bip-bip-bip' sesi çalsın.
2. **Dört Yol Ağzı Simülasyonu:** Devreye 3 LED daha ekleyerek birbirini kesen iki farklı caddenin trafik ışıklarını senkronize edin (bir caddeye kırmızı yanarken diğerine yeşil yansın).
3. **Gece Modu:** Bir LDR sensörü ekleyin; hava karardığında trafik ışıkları normal döngüyü durdursun ve kavşak kontrolsüz geçiş moduna geçerek sadece sarı ışığı fasılalı (yanıp sönen) olarak yaksın.
---
Sonuç
Trafik lambası projesi, kodlamada zaman yönetimi ve çoklu çıkış kontrolünün temelini oluşturur. Bu projedeki mantığı anlayan bir öğrenci; yürüyen merdiven otomasyonları, endüstriyel ikaz lambaları ve acil durum uyarı sistemlerini kolaylıkla kodlayabilir. Diğer eğlenceli ve öğretici projeler için sitemizin [Arduino Projeleri](/projeler) sayfasını inceleyebilirsiniz!