ChipCode 接入 Wokwi:没有开发板也能跑完一次联调
大部分嵌入式教程教你做的第一件事是点灯。
问题是:你手上得有块板子。
板子要买,要等,可能还会被物流弄坏。更现实的情况是——你想先验证一个想法,但不想为它投入硬件。
Wokwi 是个浏览器里的硬件仿真器,能跑 Arduino、ESP32、STM32 的一部分外设。ChipCode 把它接进来,走的是 http 通道。
这篇讲这条通道能干什么、不能干什么,以及什么时候值得用。
它能仿什么
先说清楚边界,省得有人拿它去仿一个高速 SPI 时序。
能仿的:
- GPIO 电平、按键、LED
- 常见的 I2C / SPI 传感器(温湿度、气压、加速度)
- 串口输出(这是最有用的部分)
- 简单的显示屏(LCD1602、OLED)
- 定时器行为(在毫秒级精度上大致可信)
不能仿的:
- 真实时序精度。仿真器不是周期精确的,
delay(10)在仿真里可能只花 2 毫秒 - 模拟电路。ADC 读到的值是你设的,不是真实分压出来的
- 电源相关的一切。掉电、电压跌落、电流不足——这些是真实硬件故障的大头,仿真里不存在
- 无线。WiFi 连接、蓝牙配对,仿真只能给个假的
- 机械。舵机堵转、限位、力矩,一个都仿不了
这条清单决定了它的合理用途:验证逻辑,不验证硬件。
它接进来之后是什么样
插件清单里就是一条 http 能力:
{
"capabilities": {
"simulate": {
"transport": "http",
"baseUrl": "127.0.0.1:9012",
"endpoints": {
"start": {
"method": "POST", "path": "/api/sim/start" },
"serial": {
"method": "GET", "path": "/api/sim/serial" },
"stop": {
"method": "POST", "path": "/api/sim/stop" }
}
}
}
}
用户在“联调”那一步可以选择“先仿真跑一遍”,然后才会走到烧录。
这一步的产物是一段串口日志,会被写进证据:
{
"kind":"simulate","board":"esp32-devkit-v1","seconds":12,
"serial_lines":87,"result":"pass","notes":"检测到 3 次按键事件"}
注意 result: pass 在这里的含义很窄:它只表示“仿真跑完了,没有异常退出”。 它不代表“功能正确”——功能对不对还是得人看日志。
我们在界面上把这一点写得很明确,因为“仿真通过”这四个字太容易让人放心了。
实际能拦住什么
举三个真实的例子。
一是逻辑死循环。 有个用户写了个状态机,某个分支忘了 break,进入之后再也出不来。真机上表现是“板子没反应”,仿真里会直接卡住,串口停止输出——很容易定位。
二是初始化顺序。 I2C 设备没初始化就读,真机上读回来的是 0xFF,看起来像“传感器坏了”。仿真里会直接报“设备未响应”,指向更准。
三是引脚冲突。 两处代码同时驱动同一个引脚,一个输出高一个输出低。真机上表现为“电平不对”,仿真里能看到最后写入者取胜,日志里能对上时间。
这三个的共同点是:它们在真机上表现为“没反应”,在仿真里表现为“有日志”。
这就是仿真最大的价值——不是它能替代硬件,而是它让失败变得可读。
什么时候不该用它
说几个明确的“别用”场景。
别用它调 PID。 仿真里没有真实的惯性和延迟,调出来的参数上真机必然要重调。
别用它验证功耗。 它不模拟电流。
别用它做交付前的最后确认。 交付前必须上真板子,这一点没有例外。
别用它仿你没把握的外设。 仿真器对冷门外设的支持是“能编译,行为是桩”。你以为在验证,实际上在验证一个假实现。
我们把这个提醒直接写在了界面的入口处,因为“仿真通过所以没问题”是这套东西最危险的误用方式。
它改变了什么
最直接的变化是第一次上手的时间。
以前一个新手要跑通第一个项目,得先有板子、装驱动、解决端口占用、处理下载模式。任何一步卡住,他可能就放弃了。
现在可以先用仿真跑通逻辑,看到串口有输出,知道“我写的东西是对的”,再去买板子。等他拿到板子,剩下的只是把同一个程序烧进去。
这个顺序的调整看起来很小,但它把“硬件不确定性”和“软件不确定性”分开了。
同时面对两个未知,是最容易让人放弃的状态。
一个设计上的取舍
我们没有让仿真变成默认。
新建项目时,联调阶段的默认路径仍然是“烧录到真板子”。仿真是可选项,需要主动选。
理由:仿真太顺了。它会给你一种“做完了”的错觉,而这种错觉在硬件项目里代价很高——你以为验证过了,实际上什么都没验证。
让容易的路稍微难走一点,是有必要的。
最后
Wokwi 这条通道我们做得不复杂,就是三个 HTTP 接口加一次日志采集。
它解决的不是技术难题,是“门槛”问题——让一个还没买板子的人,能在半小时内看到自己的代码跑起来。
这件事对老手没什么用,对新手是决定性的。