[嵌入式]嵌入式在线仿真平台 —— 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. 简单入门
- 打开浏览器,访问 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/464431280903798785
- 新建项目,访问 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:
{"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
constintledPin=26;// LED 正极连接 GPIO26;负极直接接地voidsetup(){Serial.begin(115200);Serial.println("Hello, ESP32!");pinMode(ledPin,OUTPUT);// 设置 GPIO26 为输出模式}voidloop(){digitalWrite(ledPin,HIGH);// 高电平,点亮 LEDSerial.println("LED ON");delay(500);// 持续 500 毫秒digitalWrite(ledPin,LOW);// 低电平,熄灭 LEDSerial.println("LED OFF");delay(500);// 熄灭 500 毫秒}- 启动仿真,点击顶部 ▶️ Start Simulation。可以看到LED灯闪烁
实战项目:STM32 点亮 LED
最后完整项目链接🔗:https://wokwi.com/projects/464439559624093697
- 新建项目,访问 https://wokwi.com/projects/new/st-nucleo-l031k6 ,新建一个stm32项目
- 编辑 diagram.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:
#include<Arduino.h>voidsetup(){pinMode(PB3,OUTPUT);// PB3对应D13引脚}voidloop(){digitalWrite(PB3,HIGH);// 点亮 LEDdelay(1000);digitalWrite(PB3,LOW);// 熄灭 LEDdelay(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
[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
[env:nucleo_l031k6]platform=ststm32 board=nucleo_l031k6 framework=arduino- 配置wokwi文件,告知我们的编译好的程序路径,方便后续模拟
wokwi.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"消除了抖动。
{"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,程序的核心逻辑,即:如何实现我们的需求
#include<Arduino.h>// 必须包含,提供 pinMode, attachInterrupt 等定义#include<stdint.h>// 使用 volatile 确保编译器不会优化掉对 count 的访问volatileuint32_tcount=0;// 中断服务程序 (ISR)// 注意:STM32 不需要 IRAM_ATTR,直接定义即可voidincrementCount(){count++;}// 辅助函数:安全地读取计数值uint32_tgetCount(){noInterrupts();// 关闭中断uint32_tc=count;// 复制数据interrupts();// 开启中断returnc;}voidsetup(){Serial.begin(115200);// 等待串口就绪(可选,防止启动时丢失首条日志)// 注意:某些 STM32 核心可能不支持 while(!Serial),如果卡住可注释掉此行while(!Serial){;}pinMode(2,INPUT_PULLUP);// 绑定中断// digitalPinToInterrupt 将物理引脚映射到中断号attachInterrupt(digitalPinToInterrupt(2),incrementCount,RISING);}voidloop(){// 获取安全的计数副本uint32_tcurrentCount=getCount();// 仅在计数变化时输出,减少串口负载staticuint32_tlastCount=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
