Arduino, running the sketch you wrote
arduino-cli compiles it, an AVR8 core executes it instruction by instruction, and the LCD shows what the ATmega328P actually put on the bus. Uno, Nano, Mega and ATtiny85, no board on your desk.

Hardware is all about iteration. Velxio lets you wire a circuit, program the board and run it in seconds, real firmware on a real solver, right in the browser.
DFRobot · M5Stack links on this page are affiliate links: a purchase through them earns Velxio a small commission at no extra cost to you.
Nothing on this page is a scripted animation: the firmware is compiled and executed, and the circuit around it is solved.
arduino-cli compiles it, an AVR8 core executes it instruction by instruction, and the LCD shows what the ATmega328P actually put on the bus. Uno, Nano, Mega and ATtiny85, no board on your desk.

arduino-cli or ESP-IDF compiles the sketch, then AVR8, RP2040, RISC-V, Xtensa or ARM executes it instruction by instruction. What the OLED draws and what the serial monitor prints is what the chip actually did.

ngspice compiled to WebAssembly runs a full nodal analysis about 60 times a second. GPIO pins drive real nets, ADC inputs read solved node voltages, and probes report RMS, DC and current wherever you drop them.

Adders, comparators, decoders, flip-flops and a 1-bit ALU slice: no microcontroller anywhere, just gates, switches and LEDs solved as a real net. The classroom half of electronics, without the breadboard.

The M5Stack Cardputer with its keyboard, Seeed's round display keeping time, Pimoroni's Badger 2350 driving e-paper, and DFRobot's UNIHIKER M10 in the catalogue alongside them. Their makers sent the hardware so the emulation could be checked against the real thing.




35 boards across 6 CPU architectures — AVR8, ARM Cortex-M, ARM Cortex-A, RISC-V, Xtensa, and Linux. Including partner boards from Pimoroni, M5Stack, Seeed Studio and DFRobot. All running locally, no cloud needed.
One institution contract gives every student in the class a full Pro account. No per-seat checkout, no card details in a classroom.
Private projects, BOM and schematic exports, GitHub Sync and the offline desktop app, for everyone enrolled.
Billed once to your institution, per semester or per year. Volume pricing on request for large cohorts.
Arduino, ESP32, RP2040, STM32, ATtiny and Raspberry Pi, with SPICE analog solved alongside the firmware. Not a sandboxed mock.
The simulator stays free forever, WiFi with internet included. Paid plans unlock the Linux and STM32 boards, custom WiFi networks, the local network gateway and the offline desktop app. Maker and Pro add the AI agent; No AI leaves it out.
Discover the simulator + light AI help.
The full workbench, zero AI. You write every line.
For makers shipping real circuits with AI help.
Private projects, GitHub Sync and BOM exports.
Questions, bugs and ideas: the Discord and the issue tracker are open, and so is every line of the simulator.
An interactive ESP32 circuit simulation you can run free in your browser on Velxio, by haot.
/*
* ESP32 船型开关 + 三路继电器 + 双感应器 + OLED + 巴法云MQTT控制
*
* 引脚:
* D18 船型开关(上拉输入,低有效)
* D23 1号继电器
* D32 2号继电器
* D33 3号继电器
* D26 1号感应器(上拉输入,低触发)
* D27 2号感应器(上拉输入,高触发)
* D22 OLED SCL
* D21 OLED SDA
*
* 巴法云 MQTT:
* 服务器 bemfa.com,端口 9501
* ClientID = 用户私钥
* 订阅主题,收到 "on" 启动一轮,收到 "off" 立即停止
*
* 顺序:
* R1 ON → (感应器1或超时) → R2 ON 10s → R3 ON
* → (感应器2或超时) → R3 OFF → R2 再 ON 10s → 完成
*/
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// ================== WiFi 配置 ==================
const char* WIFI_SSID = "MERCURY_7428";
const char* WIFI_PASSWORD = "woainizwx131";
// ================== 巴法云 MQTT 配置 ==================
const char* MQTT_SERVER = "bemfa.com";
const uint16_t MQTT_PORT = 9501;
const char* MQTT_UID = "9d0f5b1d502a4dbd822306385975e8b7"; // 用户私钥,作为 ClientID
const char* MQTT_TOPIC = "BfDFf29D8001"; // 订阅的主题
// ================== 引脚定义 ==================
#define SW_PIN 18
#define RELAY1_PIN 23
#define RELAY2_PIN 32
#define RELAY3_PIN 33
#define SENSOR1_PIN 26
#define SENSOR2_PIN 27
#define OLED_SCL 22
#define OLED_SDA 21
// ================== OLED 配置 ==================
#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 64
#define OLED_RESET -1
#define OLED_ADDR 0x3C
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);
// ================== 继电器触发电平 ==================
#define RELAY_OFF LOW
#define RELAY_ON HIGH
// ================== 时间参数 ==================
const uint32_t TIME_RELAY1 = 5000; // R1 兜底超时
const uint32_t TIME_RELAY2 = 10000; // R2 第一次运行 10 秒
const uint32_t TIME_RELAY3 = 30000; // R3 兜底超时
const uint32_t TIME_RELAY2B = 10000; // R2 第二次运行 10 秒
// ================== 状态机 ==================
enum State {
STATE_IDLE,
STATE_R1_ON,
STATE_R2_ON,
STATE_R3_ON,
STATE_R2_AGAIN // 新增:R3 完成后 R2 再运行
};
State state = STATE_IDLE;
uint32_t stateStartTime = 0;
bool sequenceDone = false;
// ================== 网络控制标志 ==================
bool netStartRequest = false;
bool netStopRequest = false;
// ================== MQTT 客户端 ==================
WiFiClient espClient;
PubSubClient mqttClient(espClient);
uint32_t lastMqttReconnect = 0;
const uint32_t MQTT_RECONNECT_INTERVAL = 5000;
// ================== OLED 刷新 ==================
uint32_t lastDisplayUpdate = 0;
const uint32_t DISPLAY_INTERVAL = 100;
// ---------------- 继电器控制 ----------------
void allRelaysOff() {
digitalWrite(RELAY1_PIN, RELAY_OFF);
digitalWrite(RELAY2_PIN, RELAY_OFF);
digitalWrite(RELAY3_PIN, RELAY_OFF);
}
bool switchClosed() { return digitalRead(SW_PIN) == LOW; }
bool sensor1Active() { return digitalRead(SENSOR1_PIN) == LOW; }
bool sensor2Active() { return digitalRead(SENSOR2_PIN) == HIGH; }
int remainSeconds(uint32_t duration) {
uint32_t elapsed = millis() - stateStartTime;
if (elapsed >= duration) return 0;
return (duration - elapsed + 99