#158Orta

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

5.0(1)
15 tamamlandı
Raspberry Pi Pico Trafik Lambası 4 Mod Buton Seçici (State Machine, GP11-13 + GP4)
Gerçek trafik ışıkları gece sarı yanıp söner, gerekince kırmızıda kalır; bu projede hepsini tek butonla seçersin. Her basışta sıradaki moda geçilir: kırmızı, sarı ve yeşilin sırayla yandığı normal döngü, yalnız kırmızı, yanıp sönen sarı ve tamamen kapalı. Raspberry Pi Pico ışıkları yönetirken butonu da hiç kaçırmadan dinler.

Video

Devre Şeması

Raspberry Pi Pico Trafik Lambası 4 Mod Buton Seçici (State Machine, GP11-13 + GP4) - Circuit

Kaynak Kodu

MicroPython
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)
84

Sı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.

Raspberry Pi Pico Trafik Lambası 4 Mod Buton Seçici (State Machine, GP11-13 + GP | BlueGrays