#150Новичок

Симулятор светофора на Pico (3 светодиода по очереди)

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

4.0(1)
12 собрано
Симулятор светофора на Pico (3 светодиода по очереди)
Ты переносишь светофор, мимо которого проходишь каждый день, прямо на свой стол. Зелёный горит 4 секунды, жёлтый коротко предупреждает, красный держит тебя 3 секунды, затем красный и жёлтый загораются вместе, говоря «приготовься, сейчас будет зелёный», и цикл начинается снова. Самый простой способ по очереди управлять тремя светодиодами с Raspberry Pi Pico.

Видео

Схема

Симулятор светофора на Pico (3 светодиода по очереди) - Circuit

Исходный код

MicroPython
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`; это объясняется в следующем проекте с выбором режимов.