Raspberry Pi Pico Trafik Lambası 4 Mod Buton Seçici (State Machine, GP11-13 + GP4)
1 buton ile trafik lambasının 4 farklı modu! Butona her basışta mod değişir: **Normal döngü** (kırmızı → sarı → yeşil sırayla), **Sadece Kırmızı** (dur emri), **Sarı Flash** (dikkat/gece modu), **Kapalı** (bakım). Öğrenme: **state machine** (durum makinesi — `mode` değişkeni hangi davranışın çalışacağını belirler), **modulo mod cycling** (`(mode + 1) % 4` → 0→1→2→3→0 sonsuz döngü), **non-blocking timing** (LED fazları `time.ticks_ms()` + `time.ticks_diff()` ile zamanlanır; ancak kod mod değişimi

Video
Devre Şeması

Kaynak Kodu
1# ─────────────────────────────────────────
2# BlueGrays · bluegrays.com
3# Raspberry Pi Pico Trafik Lambası 4 Mod Buton Seçici (State Machine, GP11-13 + GP4)
4# ─────────────────────────────────────────
5# Tek butonla 4 mod arasında geçilir: Normal döngü (kırmızı -> sarı ->
6# yeşil), yalnız kırmızı, sarı flaş ve kapalı. Durum makinesi ve
7# time.ticks_ms() ile beklemesiz zamanlama kullanılır; buton her an
8# algılanır.
9#
10# Pinler:
11# GP11 -> Yeşil LED
12# GP12 -> Sarı LED
13# GP13 -> Kırmızı LED (her LED 220 ohm dirençle)
14# GP4 -> Buton (diğer ucu GND)
15
16from machine import Pin
17import time
18
19# ============ LED'LER ============
20green = Pin(11, Pin.OUT) # Yeşil
21yellow = Pin(12, Pin.OUT) # Sarı
22red = Pin(13, Pin.OUT) # Kırmızı
23
24# ============ BUTON ============
25button = Pin(4, Pin.IN, Pin.PULL_UP) # Basınca 0
26
27# ============ DURUM ============
28# Mod: 0 normal döngü, 1 yalnız kırmızı, 2 sarı flaş, 3 kapalı
29mode = 0
30last_btn = 1 # Önceki buton değeri
31blink_state = False # Sarı flaş durumu
32last_tick = time.ticks_ms() # Son flaş değişimi
33
34# ============ NORMAL DÖNGÜ ============
35normal_step = 0 # 0: kırmızı, 1: sarı, 2: yeşil
36normal_last = time.ticks_ms() # Adımın başlangıcı
37NORMAL_TIMES = [3000, 1000, 3000] # Kırmızı, Sarı, Yeşil
38LEDS = [red, yellow, green]
39
40def all_off():
41 # Tüm LED'leri söndür
42 red.off(); yellow.off(); green.off()
43
44# ============ ANA DÖNGÜ ============
45while True:
46 btn = button.value()
47
48 # ---- Buton basıldı (1 -> 0): mod değişimi ----
49 if last_btn == 1 and btn == 0:
50 mode = (mode + 1) % 4
51 all_off()
52 normal_step = 0
53 normal_last = time.ticks_ms()
54 time.sleep_ms(200) # Zıplama önleme
55 last_btn = btn
56
57 now = time.ticks_ms()
58
59 # ---- Mod 0: Normal trafik lambası döngüsü ----
60 if mode == 0:
61 if time.ticks_diff(now, normal_last) > NORMAL_TIMES[normal_step]:
62 normal_step = (normal_step + 1) % 3
63 normal_last = now
64 all_off()
65 LEDS[normal_step].on()
66
67 # ---- Mod 1: Sadece kırmızı (dur) ----
68 elif mode == 1:
69 all_off(); red.on()
70
71 # ---- Mod 2: Sarı flaş, 0.4 sn (dikkat/gece) ----
72 elif mode == 2:
73 if time.ticks_diff(now, last_tick) > 400:
74 blink_state = not blink_state
75 yellow.value(blink_state)
76 last_tick = now
77 red.off(); green.off()
78
79 # ---- Mod 3: Kapalı ----
80 else:
81 all_off()
82
83 time.sleep_ms(10)
84Sıkça Sorulanlar
State machine (durum makinesi) nedir?▾
Programın o anki davranışını tek bir değişken (mode) belirler. Butona her basışta mode değişir; döngü yalnızca mevcut moda ait kodu çalıştırır. Karmaşık davranışları düzenli tutmanın standart yöntemidir.
(mode + 1) % 4 ne işe yarar?▾
Modu bir artırır ve 4'e ulaşınca başa (0'a) döndürür. Böylece mod 0, 1, 2, 3, 0, 1... şeklinde sonsuz bir döngüde değişir.
time.sleep() yerine ticks_ms() neden kullanılıyor?▾
sleep() sırasında Pico butonu okuyamaz ve mod değişikliği gecikir. ticks_ms() ve ticks_diff() LED fazları boyunca uzun süre beklemeyi önler. Ancak bu sürümde mod değişiminde debounce için 200 ms ve her döngü sonunda 10 ms bekleme vardır; bu aralıklarda buton tekrar okunmaz.
Yeni bir mod ekleyebilir miyim?▾
Evet, mod sayısını 5'e çıkarıp yeni mod için ayrı bir davranış bloğu yazman yeterli. Örneğin yeşil flaş ya da tüm ışıkların sırayla yanması gibi.
