MicroPython на ESP32

  • Михаил
  • 8 мин. на прочтение
  • 9
  • 09 Apr 2026
  • 09 Apr 2026

MicroPython открывает мир программирования микроконтроллеров, делая его простым и увлекательным. Особенно это заметно на платформе ESP32, где Python встречается с «железом». В этой статье мы не только разберемся с основами, но и реализуем вашу идею: научим ESP32 запускать разные программы по нажатию физических кнопок.

🚀 Введение: Что такое MicroPython и зачем он для ESP32?

MicroPython — это эффективная и компактная реализация языка Python 3, созданная специально для работы на микроконтроллерах-22. ESP32, в свою очередь, — это мощная и доступная плата со встроенными модулями Wi-Fi и Bluetooth.

Их союз даёт новичкам возможность начать программировать «железо», используя простой и понятный синтаксис Python, а опытным разработчикам — быстро создавать прототипы-5.

Главные преимущества MicroPython на ESP32:

Интерактивная отладка (REPL): Вы можете писать команды и сразу видеть результат, без долгой компиляции и прошивки-5.

Простота и скорость: Код на Python гораздо короче и понятнее, чем на C++. Например, веб-сервер можно написать всего в 10 строк-5.

Мощные библиотеки: Для работы с Wi-Fi, датчиками, дисплеями и другим оборудованием есть готовые модули-22.

Сравнение подходов к разработке:

MicroPython: Низкий порог входа, высокая скорость разработки, подходит для большинства задач, но уступает в производительности C++-22.

Arduino (C++): Средняя сложность, хорошая производительность, больше подходит для проектов, где важен каждый такт процессора-5.

ESP-IDF (официальный фреймворк): Высокая сложность, максимальная производительность и контроль.

💻 Установка и настройка: С чего начать?

1. Что вам понадобится

Плата ESP32: Любая плата с этим чипом (например, ESP32-WROOM-32 или ESP32-S3)-14.

Компьютер с ОС Windows, Linux или macOS.

Кабель micro-USB/USB-C для подключения платы.

Кнопки и провода для экспериментов в конце статьи.

2. Установка прошивки (Firmware)

Прошивка — это специальное программное обеспечение, которое «оживляет» микроконтроллер и позволяет ему понимать команды MicroPython-22.

Шаг 1: Скачайте прошивку
Перейдите на официальный сайт MicroPython (https://micropython.org/download/) и найдите раздел для вашей платы. Если точной модели нет, скачайте generic-версию (например, для ESP32)-14. Вам нужен файл с расширением .bin.

Шаг 2: Установите esptool
Это официальный инструмент от Espressif для работы с прошивками чипов ESP. Установите его через командную строку (терминал) с помощью менеджера пакетов pip:

pip install esptool

Шаг 3: Подготовьте ESP32 к прошивке
Подключите ESP32 к компьютеру через USB-кабель. Узнайте, под каким именем определилась плата:

На Windows это будет COM3, COM4 и т.д.

На Linux/dev/ttyUSB0, /dev/ttyACM0.

На macOS/dev/cu.usbmodem01-11.

В терминале перейдите в папку, куда вы скачали прошивку (файл .bin), и выполните команду для удаления старой прошивки:

esptool.py --port PORT_NAME erase_flash

(Замените PORT_NAME на имя вашего порта, например, COM3)-11.

Шаг 4: Загрузите новую прошивку
Теперь загрузите новую прошивку на плату, указав адрес 0x1000 (или 0x0 в зависимости от инструкций к вашей плате) и имя вашего файла:

esptool.py --port PORT_NAME --baud 460800 write_flash -z 0x1000 your_firmware_file.bin

После успешной загрузки ESP32 перезагрузится, и на ней уже будет запущен MicroPython.

✍️ Средства для написания кода

Вы можете использовать как простые текстовые редакторы, так и мощные IDE. Для новичков настоятельно рекомендуется Thonny.

Thonny IDE: Лучший выбор для старта. Эта среда имеет встроенную поддержку MicroPython, что позволяет вам подключаться к ESP32, видеть REPL, загружать файлы и отлаживать код в одном окне. Просто выберите интерпретатор «MicroPython (ESP32)»-22-5.

uPyCraft IDE: Ещё одна специализированная среда для MicroPython, также удобная для начинающих-34.

Visual Studio Code (VS Code): Мощный редактор, который с помощью расширений (например, Pymakr) можно превратить в полноценную среду для разработки на MicroPython-.

Другие варианты: Более опытные пользователи могут использовать mpremote (официальный инструмент командной строки)-17, MU Editor- или даже онлайн-симуляторы, такие как Wokwi и BIPES--.

🔌 Управление пинами (GPIO) на ESP32

Основой взаимодействия с внешним миром является модуль machine и, в частности, класс Pin.

Импорт модуля: from machine import Pin

Управление светодиодом (выход): led = Pin(2, Pin.OUT). Чтобы включить, используйте led.on() или led.value(1). Выключить — led.off() или led.value(0)-5.

Чтение кнопки (вход): button = Pin(0, Pin.IN, Pin.PULL_UP). Здесь мы включаем внутренний подтягивающий резистор, чтобы пин всегда имел стабильное значение. На большинстве плат, когда кнопка нажата, пин подключается к земле (GND), и мы читаем 0-27.

🎮 Практическое задание: Запуск разных программ по нажатию кнопок

Теперь перейдём к самому интересному — реализации вашей задачи. Мы создадим устройство, которое выполняет разные действия в зависимости от того, какую кнопку нажал пользователь.

Схема подключения

Подключите первую кнопку к пину GPIO 15 и GND.

Подключите вторую кнопку к пину GPIO 16 и GND.

Для наглядности подключите светодиод к пину GPIO 2 через резистор (второй конец резистора — на GND).

Внутренние подтягивающие резисторы ESP32 (которые мы включим в коде) будут удерживать пины в состоянии «высокого уровня» (1), когда кнопка не нажата. При нажатии пин замкнётся на землю, и мы прочитаем 0-27.

1. Простой опрос кнопок (Polling)

Этот метод подходит для простых программ, которые выполняют одно действие. Главный цикл while True постоянно проверяет состояние кнопок.

import time
from machine import Pin
# Настройка пинов
led = Pin(2, Pin.OUT)        # Светодиод на GPIO2
button1 = Pin(15, Pin.IN, Pin.PULL_UP)  # Кнопка 1 на GPIO15
button2 = Pin(16, Pin.IN, Pin.PULL_UP)  # Кнопка 2 на GPIO16
# Определяем "программы" (функции), которые будем запускать
def program_a():
   print("Запущена ПРОГРАММА А: Мигаем LED")
   for i in range(3):
       led.on()
       time.sleep(0.2)
       led.off()
       time.sleep(0.2)
   print("Программа А завершена.")
def program_b():
   print("Запущена ПРОГРАММА Б: Сообщение в консоль")
   for i in range(5):
       print(f"Сообщение {i+1}: Работает программа Б")
       time.sleep(0.5)
   print("Программа Б завершена.")
print("Готов к работе. Нажмите одну из кнопок.")
while True:
   if button1.value() == 0:  # Если кнопка 1 нажата (ведет на GND)
       time.sleep(0.05)      # Небольшая задержка для подавления дребезга
       if button1.value() == 0:
           program_a()       # Запуск программы А
           while button1.value() == 0:  # Ждём, пока кнопку отпустят
               time.sleep(0.05)
   elif button2.value() == 0: # Если кнопка 2 нажата
       time.sleep(0.05)
       if button2.value() == 0:
           program_b()       # Запуск программы Б
           while button2.value() == 0:  # Ждём отпускания
               time.sleep(0.05)
   time.sleep(0.05) # Небольшая пауза, чтобы снизить нагрузку на процессор

Этот код просто и наглядно показывает логику выбора программы. Однако, если одна из программ будет долго выполняться (например, мигать светодиодом 20 раз), ESP32 не сможет проверить состояние второй кнопки до её завершения.

2. Более продвинутый способ: Прерывания (Interrupts)

Прерывания позволяют ESP32 мгновенно реагировать на нажатие кнопки, даже если в данный момент выполняется другой код. Это идеально подходит для создания «горячих клавиш».

import time
from machine import Pin
led = Pin(2, Pin.OUT)
button1 = Pin(15, Pin.IN, Pin.PULL_UP)
button2 = Pin(16, Pin.IN, Pin.PULL_UP)
# Глобальный флаг для выбранной программы
selected_program = None
last_press_time = 0
DEBOUNCE_MS = 200  # Время антидребезга в миллисекундах
# Функция-обработчик прерывания
def button_handler(pin):
   global selected_program, last_press_time
   current_time = time.ticks_ms()
   # Простая защита от дребезга по времени
   if time.ticks_diff(current_time, last_press_time) > DEBOUNCE_MS:
       if pin == button1:
           selected_program = 'A'
           print("Выбрана программа А")
       elif pin == button2:
           selected_program = 'B'
           print("Выбрана программа Б")
       last_press_time = current_time
# Назначаем обработчик на оба пина по "спадающему фронту" (переход из 1 в 0)
button1.irq(trigger=Pin.IRQ_FALLING, handler=button_handler)
button2.irq(trigger=Pin.IRQ_FALLING, handler=button_handler)
# Те же самые программы А и Б
def program_a():
   print("Запущена ПРОГРАММА А: Мигаем LED")
   for i in range(3):
       led.on()
       time.sleep(0.2)
       led.off()
       time.sleep(0.2)
   print("Программа А завершена.")
def program_b():
   print("Запущена ПРОГРАММА Б: Сообщение в консоль")
   for i in range(5):
       print(f"Сообщение {i+1}: Работает программа Б")
       time.sleep(0.5)
   print("Программа Б завершена.")
print("Готов к работе. Нажимайте кнопки для запуска программ.")
# Основной цикл теперь занимается только выполнением выбранных программ
while True:
   if selected_program == 'A':
       program_a()
       selected_program = None
   elif selected_program == 'B':
       program_b()
       selected_program = None
   time.sleep(0.1)  # Небольшая пауза

Теперь, даже если программа А мигает светодиодом, вы можете нажать кнопку программы Б, и её выполнение начнётся сразу после завершения текущей.

3. Мультипрограммность: асинхронное выполнение (Asynchronous)

Настоящая мультизадачность без блокировок достигается с помощью модуля asyncio. Это позволяет запускать несколько задач «одновременно», создавая сложные и отзывчивые системы.

import asyncio
from machine import Pin
led = Pin(2, Pin.OUT)
button1 = Pin(15, Pin.IN, Pin.PULL_UP)
button2 = Pin(16, Pin.IN, Pin.PULL_UP)
# Асинхронные "программы"
async def blinking_led_program():
   print("Асинхронная программа: мигающий LED запущен")
   for i in range(10):  # Помигает 10 раз
       led.on()
       await asyncio.sleep(0.2)
       led.off()
       await asyncio.sleep(0.2)
   print("Асинхронная программа: мигание LED завершено")
async def counter_program():
   print("Асинхронная программа: счетчик запущен")
   for i in range(1, 6):
       print(f"Счетчик: {i}")
       await asyncio.sleep(1)
   print("Асинхронная программа: счетчик завершен")
async def check_buttons():
   # Главная задача, которая следит за кнопками и запускает другие
   while True:
       if button1.value() == 0:
           print("Запуск мигающей программы по кнопке 1")
           asyncio.create_task(blinking_led_program())
           await asyncio.sleep(0.2)  # Антидребезг
           while button1.value() == 0:
               await asyncio.sleep(0.05)
       if button2.value() == 0:
           print("Запуск программы-счетчика по кнопке 2")
           asyncio.create_task(counter_program())
           await asyncio.sleep(0.2)
           while button2.value() == 0:
               await asyncio.sleep(0.05)
       await asyncio.sleep(0.05)  # Даем время другим задачам
# Запуск главной асинхронной задачи
asyncio.run(check_buttons())

В этом примере, если нажать кнопку 1, LED начнет мигать, и в то же время вы сможете нажать кнопку 2, чтобы запустить счетчик. Обе задачи будут выполняться «параллельно», не мешая друг другу.

💡 Полезные советы

Автозапуск при включении: Чтобы ваша программа запускалась автоматически после подачи питания на ESP32, сохраните её на устройство под именем main.py--22.

Управление файлами: Используйте встроенный файловый менеджер Thonny для просмотра, загрузки и удаления файлов (boot.py, main.py, config.json и т.д.) прямо на плате ESP32.

Борьба с дребезгом контактов: Механические кнопки при нажатии создают множество ложных сигналов. Для борьбы с этим используйте программные задержки (как в примерах выше) или дополнительную схему из резистора и конденсатора-27.

Надеюсь, эта статья помогла вам сделать первый шаг в мир MicroPython на ESP32. Теперь у вас есть все необходимые инструменты и знания, чтобы начать создавать свои собственные проекты, управляемые нажатием одной кнопки.