Первый светодиод с gpiozero

Классическое "Hello World" железного мира — это не текст на экране, а мигающий светодиод в твоих руках.

Когда лампочка загорается от твоей строчки кода, происходит магия: программа впервые тронула физический мир. Это не забывается.

Светодиод (LED) — самый простой компонент: подал напряжение — горит. Но подключать его напрямую нельзя: нужен резистор на 330 Ом, который ограничивает ток и спасает и светодиод, и пин Pi.

Если до этого ты программировал только то, что живёт на экране — сайты, игры, ботов, — то первый светодиод ощущается совсем иначе. Текст в консоли можно стереть и забыть, а вот настоящая лампочка, которая загорается ровно тогда, когда ты этого захотел в коде, оставляет другое чувство. Это момент, когда ты понимаешь: программа — не просто буквы в редакторе, она может двигать вещами в реальном мире. С этого маленького мигания начинались карьеры инженеров, которые сейчас собирают роботов и спутники.

Как работает под капотом

У светодиода две ножки: длинная (анод, плюс) и короткая (катод, минус). Ток должен течь от GPIO-пина через резистор и светодиод к земле. Когда программа делает пин "высоким" (3.3В), появляется напряжение, ток течёт — светодиод горит.

   GPIO17 (физ. 11)
       |
      [резистор 330 Ом]
       |
      [+ светодиод -]   (длинная ножка к резистору)
       |
      GND (физ. 6)

Почему вообще нужен резистор и почему именно 330 Ом? Светодиод — жадный компонент: если дать ему течь свободно, он "выпьет" весь доступный ток и сгорит за доли секунды, а заодно может повредить пин Pi, который не рассчитан отдавать больше ~16 мА. Резистор работает как сужение в шланге: он намеренно "поджимает" поток до безопасного уровня. 330 Ом — золотая середина: светодиод горит ярко, но ток остаётся в безопасных рамках. Поставишь резистор больше — светодиод будет тусклее; поставишь сильно меньше или совсем уберёшь — рискуешь железом.

   3.3В от пина        резистор          земля
   +---------+        +--------+        +-------+
   |  поток  |  -->   | сужение|  -->   |  0В   |
   |  тока   |        | 330 Ом |        |       |
   +---------+        +--------+        +-------+
                      ток ограничен -> светодиод цел

Библиотека gpiozero прячет всю сложность за простым классом LED. Но этот код использует железо, поэтому в браузере он не запустится — запускай его на самом Pi:

from gpiozero import LED
from time import sleep

led = LED(17)        # GPIO17 по BCM

while True:
    led.on()
    sleep(1)
    led.off()
    sleep(1)

Обрати внимание на структуру: бесконечный цикл while True, внутри которого мы включаем светодиод, ждём секунду, выключаем и снова ждём. Именно паузы sleep делают мигание видимым — без них светодиод переключался бы миллионы раз в секунду, и глаз видел бы просто ровное свечение. Время в железных проектах так же важно, как и сами команды.

А вот логику мигания без железа можно отладить прямо здесь, в браузере, на чистом Python. Это полезно: сначала проверяем алгоритм, потом переносим на Pi. Попробуй сам ▶

# Симуляция мигания: печатаем состояние светодиода
def blink(times):
    state = False
    for tick in range(times):
        state = not state          # переключаем вкл/выкл
        symbol = "ON " if state else "off"
        print(f"тик {tick}: светодиод {symbol}")

blink(6)

Можно пойти дальше и смоделировать не просто мигание, а "дыхание" — когда яркость плавно нарастает и спадает. На настоящем Pi это делают через ШИМ (широтно-импульсную модуляцию), но саму идею легко проверить на чистых числах в браузере:

# Имитация плавной яркости (0..100 и обратно)
def breathe(steps):
    for level in list(range(0, 101, 20)) + list(range(80, -1, -20)):
        bar = "#" * (level // 10)
        print(f"яркость {level:3}% | {bar}")

breathe(1)

Частые ошибки

  • Светодиод не горит. Перепутаны ножки — переверни светодиод (длинная к плюсу).
  • Забыли резистор. Без него светодиод и пин могут сгореть.
  • Указали не тот пин. Помни про BCM: LED(17) — это физический пин 11.
  • Светодиод горит еле-еле. Возможно, резистор слишком большой (например, 10 кОм вместо 330 Ом) — ток слишком зажат.
  • Цепь собрана, но мертва. Проверь, что обе ножки действительно вставлены в макетную плату до контакта, а не "висят" над отверстиями.

Best practices

  • Используй макетную плату (breadboard), чтобы не паять для экспериментов.
  • Отлаживай логику отдельно от железа — как мы сделали выше.
  • Для мигания есть готовый метод led.blink() — не обязательно писать цикл вручную.
  • Держи под рукой несколько резисторов разного номинала и проверяй маркировку по цветным полоскам.
  • Перед сборкой всегда обесточивай Pi, а перепроверяй схему уже после.

Итоги. Светодиод подключают через резистор 330 Ом от GPIO к земле — резистор ограничивает ток и спасает железо. Класс LED(17) из gpiozero включает и выключает его, а паузы sleep делают мигание видимым. Логику можно отлаживать на чистом Python в браузере. Дальше научимся читать кнопку.

Проверьте себя
1. Зачем при подключении светодиода нужен резистор на 330 Ом?
AДля красоты
BЧтобы ограничить ток и не сжечь светодиод и пин GPIO
CЧтобы светодиод горел ярче
DРезистор не нужен
2. Почему код с import gpiozero нельзя запустить в браузере?
AОн написан с ошибкой
Bgpiozero обращается к реальным пинам железа, которых в браузере нет
CБраузер не знает Python
DОн слишком длинный