Первая программа: мигаем встроенным светодиодом

Пишем «Hello, World» мира электроники — мигающий светодиод.

Blink — первая программа embedded-разработчика: светодиод включается и выключается в цикле. Если он мигает — значит, плата и прошивка работают.

Встроенный светодиод

На многих платах ESP32 DevKit есть встроенный светодиод, подключённый к выводу GPIO2. Им можно управлять, не подключая ничего внешнего. (На некоторых платах номер другой или светодиода нет — тогда подключим внешний.)

Код мигания

from machine import Pin
import time

led = Pin(2, Pin.OUT)   # GPIO2 как выход

while True:
    led.value(1)        # включить (3.3 В)
    time.sleep(0.5)     # ждать полсекунды
    led.value(0)        # выключить (0 В)
    time.sleep(0.5)

Этот код использует модуль machine, поэтому он не запускается в браузере — только на самой плате. Разберём каждую строку.

Создаём объект пина

Pin(2, Pin.OUT) — берём вывод GPIO2 и настраиваем его как выход (output). Теперь мы можем подавать на него напряжение.

Управляем уровнем

led.value(1) подаёт высокий уровень (3.3 В) — светодиод горит. led.value(0) — низкий уровень (0 В), гаснет. Вместо чисел можно писать led.on() и led.off().

Задержка

time.sleep(0.5) приостанавливает программу на 0.5 секунды. Без задержки светодиод переключался бы миллионы раз в секунду, и глаз увидел бы просто тусклое свечение.

Тайминг: считаем период

Логику расчёта периода мигания можно прикинуть на обычном Python — здесь нет модуля machine, только арифметика, поэтому пример запускается в браузере:

on_time = 0.5
off_time = 0.5
period = on_time + off_time
freq = 1 / period
print("Период мигания:", period, "с")
print("Частота:", freq, "Гц")
print("Морганий за минуту:", round(60 / period))

Вывод:

Период мигания: 1.0 с
Частота: 1.0 Гц
Морганий за минуту: 60

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

Когда вы вызываете led.value(1), MicroPython обращается к аппаратному регистру вывода GPIO2 и устанавливает там бит. Электрически это подключает ножку к шине 3.3 В через транзистор внутри чипа. Ток течёт через светодиод и резистор на землю — диод светится. Встроенный резистор-ограничитель на плате не даёт сжечь светодиод. time.sleep() при этом просто крутит пустой цикл нужное число тактов, удерживая состояние пина.

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

  • Забыть time.sleep. Без задержки моргание не видно глазу.
  • Неверный номер пина. На вашей плате встроенный светодиод может быть не на GPIO2 — сверьтесь с распиновкой.
  • Инверсная логика. На отдельных платах светодиод горит при 0, а не при 1 (подключён к питанию, а не к земле).
  • Бесконечный while True без выхода. Плата перестанет отвечать в REPL — спасает Ctrl+C.

Итог

  • Blink — проверка того, что плата и прошивка живы.
  • Pin(2, Pin.OUT) настраивает вывод на выход, value(1/0) включает и выключает.
  • time.sleep() задаёт паузу, формируя видимое мигание.
  • Код с machine работает только на плате, а чистую арифметику можно проверить и в браузере.
Проверьте себя
1. Что делает строка Pin(2, Pin.OUT)?
AЧитает значение с GPIO2
BНастраивает GPIO2 как выход для подачи напряжения
CУдаляет пин из памяти
DВключает Wi-Fi
2. Зачем в программе Blink нужен time.sleep(0.5)?
AЧтобы экономить заряд
BЧтобы переключения были видимы глазу, а не сливались
CЧтобы подключиться к Wi-Fi
DЭто обязательная команда любого кода
3. Почему пример с machine.Pin нельзя запустить кнопкой в браузере?
AОн содержит ошибку
BМодуль machine есть только на реальной плате, а не в браузерном Python
CОн слишком длинный
DБраузер не поддерживает циклы