[嵌入式]嵌入式在线仿真平台 ------ Wokwi 入门指南
对于想入门嵌入式或者远程办公没在公司的朋友来说,如果没有硬件,极大阻碍了开发,今天给大家分享一个在线网站,可以帮我们模拟硬件,辅助我们开发。

基本介绍
介绍:Wokwi 是一个在线的电子电路仿真平台,由 Uri Shaked 创建。它允许你在浏览器中直接模拟 ESP32、STM32、Arduino 等主流微控制器,并实时运行代码、观察电路行为。
官方平台: https://wokwi.com
| 功能类别 | 具体支持 |
|---|---|
| 芯片/开发板 | ESP32(DevKit V1、S3、C3)、STM32(F103、NUCLEO系列)、Arduino(Uno、Nano、Mega)、Raspberry Pi Pico |
| 外设与传感器 | LED、按键、OLED/LCD 显示屏、DHT22 温湿度、超声波测距、Wi-Fi 仿真、蓝牙(BLE)、GPS 模块等 |
| 编程框架 | Arduino (C++)、MicroPython / CircuitPython、ESP‑IDF、Rust |
| 调试能力 | 调试能力 串口监视器、虚拟逻辑分析仪、GDB 断点调试 |
在线使用:网站
1. 简单入门
- 打开浏览器,访问 https://wokwi.com
- 点击右上角头像,可直接使用 GitHub 账号 登录(推荐,方便保存项目)
- 点击 "New Project",选择目标开发板(如 ESP32 或 STM32)

面板介绍:
| 区域 | 作用 |
|---|---|
| 左侧 | 代码编辑器 |
| 左上方 | 文件管理器(管理 diagram.json等项目文件) |
| 右侧 | 电路图可视化区(显示开发板、LED、传感器等元件的布局) |
| 右下方 | Serial Monitor(串口监视器,查看 Serial.print 输出) |
| 右上方 | ▶️ 启动仿真、⏸️ 暂停、🔄 复位 |
注意:电路连接有两种方式:
- 通过编辑 diagram.json 文件实现,例如:
"led1:A", "esp:2", "green"\] 表示 LED 正极接 ESP32 的 GPIO 2 引脚。

2. 项目实战
不给大家讲复杂的操作,只教大家如何使用这个平台,因此这里就选择嵌入式世界中的"Hello World",即:点亮LED灯。
- 底层原理:本质就是产生电势差,LED正极接芯片的引脚,并让该芯片引脚输出高电平,LED负极接GND(地),即0,这样就存在一个高低电平,有一个电势差,LED灯就会被点亮。
- PS:Wokwi 仿真中 LED 可省略电阻,但实际制作电路时,务必在 LED 正极与 GPIO 之间串联 220Ω 限流电阻。否则电流过大会烧毁 LED 或芯片
实战项目:ESP32 点亮 LED
- 新建项目,访问 https://wokwi.com/projects/new/esp32 。 创建之后默认会有开发板和初始化代码,点击运行,观察效果

- 编辑 diagram.json(电路连接)。可以通过直接改文件或者直接通过页面直接修改。下面我们演示页面直接修改
- 点击加号,添加LED灯


- 我们添加之后会发现diagram.json会同步修改

- 选中LED引脚,进行连线。我这里选择GPIO26作为正极,LED另一端直接接GND
官方文档:https://documentation.espressif.com/esp32-wroom-32e_esp32-wroom-32ue_datasheet_en.pdf
diagram.json:
json
{
"version": 1,
"author": "Ziyi",
"editor": "wokwi",
"parts": [
{ "type": "board-esp32-devkit-c-v4", "id": "esp", "top": -163.2, "left": -71.96, "attrs": {} },
{
"type": "wokwi-led",
"id": "led1",
"top": -195.6,
"left": -188.2,
"attrs": { "color": "red" }
}
],
"connections": [
[ "esp:TX", "$serialMonitor:RX", "", [] ],
[ "esp:RX", "$serialMonitor:TX", "", [] ],
[ "led1:A", "esp:26", "green", [ "v0" ] ],
[ "led1:C", "esp:GND.1", "green", [ "v0" ] ]
],
"dependencies": {}
}
- 编写main.cpp
cpp
const int ledPin = 26; // LED 正极连接 GPIO26;负极直接接地
void setup() {
Serial.begin(115200);
Serial.println("Hello, ESP32!");
pinMode(ledPin, OUTPUT); // 设置 GPIO26 为输出模式
}
void loop() {
digitalWrite(ledPin, HIGH); // 高电平,点亮 LED
Serial.println("LED ON");
delay(500); // 持续 500 毫秒
digitalWrite(ledPin, LOW); // 低电平,熄灭 LED
Serial.println("LED OFF");
delay(500); // 熄灭 500 毫秒
}
- 启动仿真,点击顶部 ▶️ Start Simulation。可以看到LED灯闪烁

实战项目:STM32 点亮 LED
- 新建项目,访问 https://wokwi.com/projects/new/st-nucleo-l031k6 ,新建一个stm32项目
- 编辑 diagram.json(电路图)
json
{
"version": 1,
"author": "Ziyi",
"editor": "wokwi",
"parts": [
{
"type": "board-st-nucleo-l031k6",
"id": "nucleo",
"top": -46.79,
"left": -34.85,
"attrs": {}
},
{
"type": "wokwi-led",
"id": "led1",
"top": -70.8,
"left": -197.8,
"attrs": { "color": "red" }
}
],
"connections": [
[ "$serialMonitor:TX", "nucleo:VCP_RX", "", [] ],
[ "$serialMonitor:RX", "nucleo:VCP_TX", "", [] ],
[ "led1:A", "nucleo:D13", "green", [ "v0" ] ],
[ "led1:C", "nucleo:GND.2", "green", [ "v0" ] ]
],
"dependencies": {}
}
- 编写 main.cpp
PB3是 STM32 芯片的 GPIO 引脚,而 D13 是开发板遵循 Arduino 接口定义的丝印标号。两者在硬件上通过 PCB 线路连通,因此控制 PB3 等同于控制D13接口上的 LED。
官方手册:https://www.st.com.cn/resource/en/user_manual/um1956-stm32-nucleo32-boards-mb1180-stmicroelectronics.pdf
main.cpp:
cpp
#include <Arduino.h>
void setup() {
pinMode(PB3, OUTPUT); // PB3对应D13引脚
}
void loop() {
digitalWrite(PB3, HIGH); // 点亮 LED
delay(1000);
digitalWrite(PB3, LOW); // 熄灭 LED
delay(1000);
}
- 运行仿真。点击 ▶️ 后,LED 开始闪烁。

本地使用:插件
官方的云编译资源有限,如果没开订阅,可能比较耗时。如果习惯使用 VS Code + PlatformIO 进行嵌入式开发的,Wokwi 提供了官方插件,可以在离线环境下获得与在线版一致的仿真体验,且能直接使用你现有的编译产物(firmware.bin)。
1. 安装配置
- 插件安装:打开 VS Code
- 进入扩展商店(快捷键 Cmd+Shift+X)
- 搜索 "Wokwi Simulator"(发布者:Wokwi)
- 点击安装
- 获取许可证:插件需要免费许可证才能使用(只需一次)
- 在 VS Code 中按 F1,运行命令 Wokwi: Request a new License
- 浏览器会自动打开 Wokwi 官网,使用 GitHub 账号登录授权
- 授权成功后,VS Code 中会显示"License installed"
-
配置仿真项目,假设你已经有一个 PlatformIO 项目(例如 ESP32 或 STM32),编译后会在
.pio/build/xxx/目录下生成firmware.bin文件。 -
在项目根目录创建 wokwi.toml
toml
[wokwi]
version = 1
# 相对路径指向 PlatformIO 生成的固件
firmware = '.pio/build/esp32dev/firmware.bin' # 请根据实际开发板修改路径
elf = '.pio/build/esp32dev/firmware.elf'
- 可选 -- 创建 diagram.json
如果你需要自定义电路(添加 LED、传感器等),可以在项目根目录或 wokwi 文件夹中创建 diagram.json。若不创建,Wokwi 会使用默认的空白电路。
- 启动仿真
- 先用 PlatformIO 编译项目(点击底部状态栏的 ✓ Build)
- 按 F1,运行 Wokwi: Start Simulator
- 仿真窗口会在 VS Code 内部打开,点击 ▶️ 开始运行
2. 项目实战:中断计数器
通过VSCode + PlatformIO + Wokwi实现一个外部中断计数器的需求,每点击一次按钮,在我们松手时会计数,使计数器加1.
PlatformIO也为插件,直接在VSCode中安装即可,安装后左侧会出现PlatformIO的图标。
- 通过PlatformIO插件创建项目,填写对应项目名、开发框架、保存位置即可。

- 配置platform的配置文件,告知我们使用的芯片、框架类型
platform.ini
bash
[env:nucleo_l031k6]
platform = ststm32
board = nucleo_l031k6
framework = arduino
- 配置wokwi文件,告知我们的编译好的程序路径,方便后续模拟
wokwi.toml:
toml
[wokwi]
version = 1
firmware = '.pio/build/nucleo_l031k6/firmware.bin'
elf = '.pio/build/nucleo_l031k6/firmware.elf'
- 编写diagram.json文件,即:画电路结构
真实硬件按键会产生抖动,通常需要在中断服务程序中增加 20-50ms 的延时去抖,或使用状态机滤波。本例为仿真演示,在diagram.json仿真中设置了
"bounce": "0"消除了抖动。
bash
{
"version": 1,
"author": "Ziyi",
"editor": "wokwi",
"parts": [
{ "type": "board-st-nucleo-l031k6", "id": "nucleo", "top": 0, "left": 0, "attrs": {} },
{
"type": "wokwi-pushbutton",
"id": "btn1",
"top": 54.2,
"left": -96,
"attrs": { "color": "green", "bounce": "0", "key": "i" }
}
],
"connections": [
[ "$serialMonitor:TX", "nucleo:VCP_RX", "", [] ],
[ "$serialMonitor:RX", "nucleo:VCP_TX", "", [] ],
[ "nucleo:D2", "btn1:2.r", "green", [ "h-25.25", "v10.81" ] ],
[ "nucleo:GND.1", "btn1:1.r", "black", [ "h0" ] ]
],
"dependencies": {}
}
- 编写src/main.cpp,程序的核心逻辑,即:如何实现我们的需求
cpp
#include <Arduino.h> // 必须包含,提供 pinMode, attachInterrupt 等定义
#include <stdint.h>
// 使用 volatile 确保编译器不会优化掉对 count 的访问
volatile uint32_t count = 0;
// 中断服务程序 (ISR)
// 注意:STM32 不需要 IRAM_ATTR,直接定义即可
void incrementCount() {
count++;
}
// 辅助函数:安全地读取计数值
uint32_t getCount() {
noInterrupts(); // 关闭中断
uint32_t c = count; // 复制数据
interrupts(); // 开启中断
return c;
}
void setup() {
Serial.begin(115200);
// 等待串口就绪(可选,防止启动时丢失首条日志)
// 注意:某些 STM32 核心可能不支持 while(!Serial),如果卡住可注释掉此行
while (!Serial) {
;
}
pinMode(2, INPUT_PULLUP);
// 绑定中断
// digitalPinToInterrupt 将物理引脚映射到中断号
attachInterrupt(digitalPinToInterrupt(2), incrementCount, RISING);
}
void loop() {
// 获取安全的计数副本
uint32_t currentCount = getCount();
// 仅在计数变化时输出,减少串口负载
static uint32_t lastCount = 0;
if (currentCount != lastCount) {
Serial.print("Interrupt count: ");
Serial.println(currentCount);
lastCount = currentCount;
}
delay(100); // 主循环延时
}
- 执行Command+Shift+P 或 Ctrl+Shift+P或F1,打开VSCode命令行(),输入PlatformIO: Build命令,执行编译动作


- 编译完成后,会在.pio/build文件下生成目标文件


- 执行Wokwi: Start Simulator。开启模拟

- 点击按钮,在我们松手时,计数器对应值加1


