[嵌入式]嵌入式在线仿真平台 —— Wokwi 入门指南

[嵌入式]嵌入式在线仿真平台 ------ 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. 简单入门

  1. 打开浏览器,访问 https://wokwi.com
  2. 点击右上角头像,可直接使用 GitHub 账号 登录(推荐,方便保存项目)
  3. 点击 "New Project",选择目标开发板(如 ESP32 或 STM32)

    面板介绍:
区域 作用
左侧 代码编辑器
左上方 文件管理器(管理 diagram.json等项目文件)
右侧 电路图可视化区(显示开发板、LED、传感器等元件的布局)
右下方 Serial Monitor(串口监视器,查看 Serial.print 输出)
右上方 ▶️ 启动仿真、⏸️ 暂停、🔄 复位

注意:电路连接有两种方式:

  1. 通过编辑 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/464431280903798785

  1. 新建项目,访问 https://wokwi.com/projects/new/esp32 。 创建之后默认会有开发板和初始化代码,点击运行,观察效果
  2. 编辑 diagram.json(电路连接)。可以通过直接改文件或者直接通过页面直接修改。下面我们演示页面直接修改
  • 点击加号,添加LED灯

  • 我们添加之后会发现diagram.json会同步修改
  1. 选中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": {}
}
  1. 编写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 毫秒
}
  1. 启动仿真,点击顶部 ▶️ Start Simulation。可以看到LED灯闪烁

实战项目:STM32 点亮 LED

最后完整项目链接🔗:https://wokwi.com/projects/464439559624093697

  1. 新建项目,访问 https://wokwi.com/projects/new/st-nucleo-l031k6 ,新建一个stm32项目
  2. 编辑 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": {}
}
  1. 编写 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);
}
  1. 运行仿真。点击 ▶️ 后,LED 开始闪烁。

本地使用:插件

官方的云编译资源有限,如果没开订阅,可能比较耗时。如果习惯使用 VS Code + PlatformIO 进行嵌入式开发的,Wokwi 提供了官方插件,可以在离线环境下获得与在线版一致的仿真体验,且能直接使用你现有的编译产物(firmware.bin)。

1. 安装配置

  1. 插件安装:打开 VS Code
  • 进入扩展商店(快捷键 Cmd+Shift+X)
  • 搜索 "Wokwi Simulator"(发布者:Wokwi)
  • 点击安装
  1. 获取许可证:插件需要免费许可证才能使用(只需一次)
  • 在 VS Code 中按 F1,运行命令 Wokwi: Request a new License
  • 浏览器会自动打开 Wokwi 官网,使用 GitHub 账号登录授权
  • 授权成功后,VS Code 中会显示"License installed"
  1. 配置仿真项目,假设你已经有一个 PlatformIO 项目(例如 ESP32 或 STM32),编译后会在 .pio/build/xxx/ 目录下生成 firmware.bin 文件。

  2. 在项目根目录创建 wokwi.toml

toml 复制代码
[wokwi]
version = 1
# 相对路径指向 PlatformIO 生成的固件
firmware = '.pio/build/esp32dev/firmware.bin'    # 请根据实际开发板修改路径
elf = '.pio/build/esp32dev/firmware.elf'
  1. 可选 -- 创建 diagram.json

如果你需要自定义电路(添加 LED、传感器等),可以在项目根目录或 wokwi 文件夹中创建 diagram.json。若不创建,Wokwi 会使用默认的空白电路。

  1. 启动仿真
  • 先用 PlatformIO 编译项目(点击底部状态栏的 ✓ Build)
  • 按 F1,运行 Wokwi: Start Simulator
  • 仿真窗口会在 VS Code 内部打开,点击 ▶️ 开始运行

2. 项目实战:中断计数器

通过VSCode + PlatformIO + Wokwi实现一个外部中断计数器的需求,每点击一次按钮,在我们松手时会计数,使计数器加1.

PlatformIO也为插件,直接在VSCode中安装即可,安装后左侧会出现PlatformIO的图标。

  1. 通过PlatformIO插件创建项目,填写对应项目名、开发框架、保存位置即可。
  2. 配置platform的配置文件,告知我们使用的芯片、框架类型
    platform.ini
bash 复制代码
[env:nucleo_l031k6]
platform = ststm32
board = nucleo_l031k6
framework = arduino
  1. 配置wokwi文件,告知我们的编译好的程序路径,方便后续模拟
    wokwi.toml:
toml 复制代码
[wokwi]
version = 1
firmware = '.pio/build/nucleo_l031k6/firmware.bin'
elf = '.pio/build/nucleo_l031k6/firmware.elf'
  1. 编写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": {}
}
  1. 编写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); // 主循环延时
}
  1. 执行Command+Shift+P 或 Ctrl+Shift+P或F1,打开VSCode命令行(),输入PlatformIO: Build命令,执行编译动作

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

  3. 执行Wokwi: Start Simulator。开启模拟
  4. 点击按钮,在我们松手时,计数器对应值加1
相关推荐
小手智联老徐3 小时前
Arduino IDE环境搭建与点亮ESP32 D1板载LED
嵌入式硬件·esp32·arduino
坤坤藤椒牛肉面3 小时前
stm32学习1--新建工程
stm32·单片机·学习
yong99903 小时前
STM32 LoRaWAN Ping-Pong 节点方案
stm32·单片机·嵌入式硬件
安生生申4 小时前
uni-app 连接 JDY-31 蓝牙串口模块实践
c语言·前端·javascript·stm32·单片机·嵌入式硬件·uni-app
番茄灭世神4 小时前
Vscode开发/调试ARM单片机最新教程
c语言·arm开发·vscode·stm32·嵌入式·gd32
chao18984416 小时前
STM32 HAL库驱动AT24C02 EEPROM例程
stm32·单片机·嵌入式硬件
lularible16 小时前
从沙子到车辙(3.3):数据通路与控制器的“双人舞“
开源·嵌入式·汽车电子
猫猫的小茶馆19 小时前
【Python】函数与模块化编程
linux·开发语言·arm开发·驱动开发·python·stm32
feifeigo12319 小时前
STM32矩阵键盘驱动(库函数版)实现
stm32·矩阵·计算机外设