Практика на Wokwi
Инициализация проекта в Wokwi
Wokwi — это онлайн-симулятор (эмулятор) электроники. Wokwi позволяет вам собрать схему на экране компьютера, написать для нее программу и сразу увидеть, как она работает (зажигаются виртуальные светодиоды, крутятся виртуальные моторы). И все это бесплатно и без риска сжечь плату!
Среда Wokwi формирует изолированное рабочее пространство при создании нового проекта на базе ESP32 с интерпретатором MicroPython.
Платформа генерирует базовую структуру каталогов, содержащую конфигурационный файл схемы, файл прошивки и журнал симуляции. Пользователь получает доступ к встроенному редактору кода, панели компонентов и консоли последовательного порта.
Система автоматически связывает виртуальные выводы микроконтроллера с программными объектами, обеспечивая точное соответствие физической распиновки ESP32 и программного интерфейса.
Когда вы создаете новый проект ESP32 с MicroPython в Wokwi, вы видите три главных окна (рабочих пространства):
- Схема (Слева или в центре): Здесь нарисована ваша виртуальная плата ESP32. Вы можете мышкой перетаскивать на нее датчики, резисторы, светодиоды и соединять их проводами.
- Редактор кода (Справа или снизу): Большое поле, где вы пишете программу на MicroPython (или C++). Вы прямо здесь печатаете код, и он сразу готов к запуску.
- Консоль (Терминал): Это "Монитор порта". Когда ваша программа выводит что-то через print() — этот текст появляется здесь. Как если бы вы подключили микроконтроллер к компьютеру по USB.
В реальной жизни, чтобы зажечь светодиод на ESP32, вы должны физически подключить его ножку к определенному пину на плате (например, GPIO 2), а потом в коде написать pin = Pin(2, Pin.OUT).
В Wokwi это работает так:
- Вы перетаскиваете светодиод на схему.
- Тянете от него проводок и тыкаете им в любой пиксель на картинке ESP32 (допустим, это GPIO 13).
- Wokwi сам запоминает, что светодиод висит на 13-м пине.
Теперь, когда вы в коде пишете Pin(13, Pin.OUT) и включаете его, виртуальный светодиод на схеме реально загорается (становится желтым/красным).
Вам не нужно думать о сложной настройке симуляции — система просто знает: «Ага, пользователь написал "GPIO 13", значит я должен зажечь тот светодиод, который висит на 13-м пине на картинке».
Когда вы нажимаете "Создать новый проект", платформа генерирует для вас набор файлов. Самые важные из них:
sketch.inoилиmain.py- ваш главный код. Именно здесь вы пишете программу на C++ или MicroPython. Это "мозг" вашего проекта.diagram.json- "карта". В этом файле записано, какие детали (компоненты) нарисованы на схеме, как они соединены проводами и к каким пинам ESP32 подключены. Вы обычно не трогаете его руками — он создается автоматически, когда вы перетаскиваете детали мышкой.wokwi.toml- настройки проекта (например, версия прошивки).
Wokwi — это симуляция. Он ведет себя очень близко к реальности, но есть нюансы:
- Время: В симуляторе время течет точно так же, как в реальности (задержки работают корректно).
- Тайминг: Очень точные задержки (наносекунды) могут работать не идеально, так как симуляция зависит от скорости вашего браузера.
- Аналоговые сигналы: Вы можете подключить потенциометр и крутить его мышкой, но реальные шумы, помехи и дрейф напряжения в симуляторе отсутствуют.
Конфигурация аппаратной схемы (diagram.json)
Файл diagram.json определяет топологию виртуального стенда.
Документ содержит массивы компонентов, соединений и параметров отладки. Каждый элемент схемы описывается уникальным идентификатором, типом устройства и координатами размещения.
Соединения задаются через пары контактов, указывающие электрическую связь между выводами платы и периферийными модулями.
Система интерпретирует описание и создаёт виртуальную электрическую цепь с учётом параметров питания, подтягивающих резисторов и протоколов обмена данными.
{
"version": 1,
"author": "Симуляция ESP32 MicroPython",
"parts": [
{ "type": "board-esp32-devkit-c-v4", "id": "esp32", "top": 0, "left": 0, "attrs": {} },
{ "type": "led", "id": "led1", "top": 120, "left": 180, "attrs": { "color": "red" } },
{ "type": "pushbutton", "id": "btn1", "top": 120, "left": 60, "attrs": {} },
{ "type": "dht22", "id": "dht1", "top": 200, "left": 240, "attrs": { "temperature": 25.5, "humidity": 60 } }
],
"connections": [
[ "esp32:TX", "$serialMonitor:RX", "", [] ],
[ "esp32:RX", "$serialMonitor:TX", "", [] ],
[ "esp32:GND.1", "led1:C", "black", [ "h-60", "v40" ] ],
[ "esp32:25", "led1:A", "red", [ "v-20", "h40" ] ],
[ "esp32:GND.1", "btn1:1.l", "black", [ "v40" ] ],
[ "esp32:27", "btn1:2.l", "green", [ "v40" ] ],
[ "esp32:33", "dht1:DATA", "yellow", [ "v-20", "h60" ] ],
[ "esp32:3V3", "dht1:VCC", "red", [ "v20" ] ],
[ "esp32:GND.1", "dht1:GND", "black", [ "v20" ] ]
]
}
Разработка прошивки (main.py)
Файл main.py содержит исполняемый код на MicroPython.
Среда выполнения использует модуль machine для доступа к аппаратным ресурсам, модуль time для управления задержками и стандартные конструкции управления потоком выполнения.
Программа инициализирует объекты ввода-вывода, устанавливает режимы работы выводов, опрашивает датчики и формирует управляющие сигналы.
Интерпретатор выполняет код последовательно, обрабатывает исключения и передаёт диагностические сообщения в виртуальный UART.
import machine
import time
import dht
# Инициализация интерфейсов ввода-вывода
led_pin = machine.Pin(25, machine.Pin.OUT)
btn_pin = machine.Pin(27, machine.Pin.IN, machine.Pin.PULL_UP)
sensor = dht.DHT22(machine.Pin(33))
# Основной цикл исполнения
while True:
# Считывание состояния кнопки
button_state = btn_pin.value()
# Управление светодиодом
if button_state == 0:
led_pin.value(1)
else:
led_pin.value(0)
# Запрос данных с датчика температуры и влажности
try:
sensor.measure()
temp = sensor.temperature()
hum = sensor.humidity()
print(f"TEMP: {temp:.1f} C | HUM: {hum:.1f} % | BTN: {'PRESSED' if button_state == 0 else 'RELEASED'}")
except OSError as e:
print(f"SENSOR_ERROR: {e}")
# Циклическая задержка выполнения
time.sleep(2)
Взаимодействие аппаратного и программного слоёв
Среда синхронизирует программные объекты machine.Pin с виртуальными контактами, описанными в diagram.json.
Номер вывода в конструкторе Pin совпадает с физическим номером GPIO на плате ESP32.
Режим работы (OUT, IN, PULL_UP) определяет электрическое поведение контакта в симуляции.
Датчик DHT22 генерирует фиксированные значения, указанные в атрибутах компонента, и отвечает на команды measure() по протоколу 1-Wire.
Последовательный порт UART0 перенаправляет вывод функции print() в панель Serial Monitor.
Система обеспечивает детерминированное выполнение циклов, корректную обработку прерываний кнопок и синхронизацию тактирования с реальным временем симуляции.
Запуск симуляции и мониторинг состояния
Платформа загружает интерпретатор MicroPython, применяет конфигурацию схемы и передаёт управление исполняемому файлу. Процесс симуляции отображает состояние выводов в реальном времени, визуализирует логические уровни на контактах и регистрирует события нажатия кнопок.
Консоль последовательного порта выводит текстовые сообщения, сгенерированные функциями вывода, и фиксирует ошибки выполнения.
Система предоставляет инструменты анализа временных диаграмм, позволяет отслеживать задержки между событиями и контролировать частоту опроса датчиков.
Среда сохраняет стабильное состояние до завершения выполнения цикла или получения команды остановки.
Таблица соответствия компонентов и ресурсов
| Виртуальный компонент | GPIO ESP32 | Режим работы | Программный объект | Протокол обмена |
|---|---|---|---|---|
| Красный светодиод | 25 | Выход | machine.Pin(25, OUT) | Цифровой уровень |
| Кнопка | 27 | Вход, подтяжка вверх | machine.Pin(27, IN, PULL_UP) | Цифровой уровень |
| Датчик DHT22 | 33 | Вход/Выход | dht.DHT22(Pin(33)) | 1-Wire |
| Последовательный порт | TX/RX | UART | print() / sys.stdout | UART 115200 бод |
Среда обеспечивает полное соответствие между описанием схемы, программным интерфейсом и поведением интерпретатора.
Файлы diagram.json и main.py формируют единый конфигурационный контур, определяющий аппаратную топологию и алгоритм управления.
Система выполняет симуляцию с точностью до такта, воспроизводит электрические характеристики контактов и поддерживает отладку через последовательный интерфейс.