Перейти к основному содержимому

Практика на 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)Цифровой уровень
Датчик DHT2233Вход/Выходdht.DHT22(Pin(33))1-Wire
Последовательный портTX/RXUARTprint() / sys.stdoutUART 115200 бод

Среда обеспечивает полное соответствие между описанием схемы, программным интерфейсом и поведением интерпретатора.

Файлы diagram.json и main.py формируют единый конфигурационный контур, определяющий аппаратную топологию и алгоритм управления.

Система выполняет симуляцию с точностью до такта, воспроизводит электрические характеристики контактов и поддерживает отладку через последовательный интерфейс.