Симулятор светофора на Pico (3 светодиода по очереди)
Настоящий светофор на красном, жёлтом и зелёном светодиодах — первый проект серии Pico с 3 светодиодами! Зелёный 4 с «едем», жёлтый 1,5 с «внимание», красный 3 с «стоп» и красный + жёлтый 1 с «приготовиться» (европейская схема светофора). Изучи объявление функций (def all_off()), логику конечного автомата (последовательность) и синхронизацию нескольких GPIO. Простая схема: 3 светодиода на GP11 (зелёный), GP12 (жёлтый), GP13 (красный), у каждого токоограничивающий резистор 220Ω.

Видео
Схема

Исходный код
1# ─────────────────────────────────────────
2# BlueGrays · bluegrays.com
3# Симулятор светофора на Pico (3 светодиода по очереди)
4# ─────────────────────────────────────────
5# Настоящий цикл светофора на красном, жёлтом и зелёном светодиодах:
6# зелёный 4 с, жёлтый 1,5 с, красный 3 с, затем красный + жёлтый 1 с
7# (европейский вариант перед зелёным). Вспомогательная функция, которая
8# гасит все светодиоды, избавляет от повторов в коде.
9#
10# Пины:
11# GP11 -> Зелёный светодиод
12# GP12 -> Жёлтый светодиод
13# GP13 -> Красный светодиод (каждый светодиод с 220 ohm)
14# Катоды светодиодов -> GND
15
16from machine import Pin
17from time import sleep
18
19# ============ ПИНЫ ============
20# Пины светофора (соседние GP11-GP12-GP13)
21green_led = Pin(11, Pin.OUT) # Зелёный светодиод: ЕДЬ
22yellow_led = Pin(12, Pin.OUT) # Жёлтый светодиод: ВНИМАНИЕ
23red_led = Pin(13, Pin.OUT) # Красный светодиод: СТОП
24
25# ============ ВСПОМОГАТЕЛЬНАЯ ФУНКЦИЯ ============
26def all_off():
27 """
28 TR: Tum LED'leri sondur (DRY prensibi: tekrardan kacinmak icin)
29 EN: Turn off all LEDs (DRY principle: avoid repetition)
30 """
31 green_led.value(0)
32 yellow_led.value(0)
33 red_led.value(0)
34
35print("== BlueGrays · bluegrays.com ==")
36print("Trafik Lambasi / Traffic Light")
37print("Yesil: GP11 | Sari: GP12 | Kirmizi: GP13")
38
39# ============ ГЛАВНЫЙ ЦИКЛ ============
40while True:
41 # ЗЕЛЁНЫЙ: ЕДЬ (4 с)
42 all_off()
43 green_led.value(1)
44 print("[TRAFIK/TRAFFIC] YESIL / GREEN — GEC / GO")
45 sleep(4)
46
47 # ЖЁЛТЫЙ: ВНИМАНИЕ (1,5 с)
48 all_off()
49 yellow_led.value(1)
50 print("[TRAFIK/TRAFFIC] SARI / YELLOW — HAZIRLAN / READY")
51 sleep(1.5)
52
53 # КРАСНЫЙ: СТОП (3 с)
54 all_off()
55 red_led.value(1)
56 print("[TRAFIK/TRAFFIC] KIRMIZI / RED — DUR / STOP")
57 sleep(3)
58
59 # КРАСНЫЙ + ЖЁЛТЫЙ: ПРИГОТОВИТЬСЯ (1 с), европейский вариант
60 # Фаза перед стартом: водитель включает передачу
61 yellow_led.value(1)
62 print("[TRAFIK/TRAFFIC] KIRMIZI+SARI / RED+YELLOW — KALKIS / STARTING")
63 sleep(1)
64
Частые вопросы
Что значит, когда красный и жёлтый горят одновременно?
В некоторых светофорах Европы перед сменой красного на зелёный красный и жёлтый горят вместе; это сигнал водителям «приготовиться». Такая схема используется и в Турции.
Какая польза от объявления функции?
Функция вроде `all_off()` позволяет вызывать три повторяющиеся строки кода одним именем. Код становится короче и понятнее, а изменения вносятся в одном месте.
Как изменить длительности?
Измени значения в секундах внутри `sleep()` для каждого огня. Если задать значения константами в начале файла (например, GREEN_TIME = 4) и использовать их в вызовах вроде `sleep(GREEN_TIME)`, настраивать станет гораздо проще.
Можно ли добавить кнопку для пешеходов?
Да. Можно добавить кнопку, которая при нажатии переводит цикл на красный. Чтобы нажатие замечалось сразу, отсчитывай время через `ticks_ms()`, а не `sleep`; это объясняется в следующем проекте с выбором режимов.
