Первая программа: мигаем встроенным светодиодом
Пишем «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работает только на плате, а чистую арифметику можно проверить и в браузере.