Board

ESP32 simulator, the classic one, on an Xtensa core

Mokxi models the thirty-pin DOIT ESP32 DevKit V1: an ESP32-WROOM-32 with its Xtensa LX6 at 240 MHz, the GPIO matrix, IO_MUX, all three UARTs, timer group 0, ADC1 and the LEDC PWM controller, at the real addresses. One core, not two, and no radio (WiFi here is simulated, and says so), and the contract says exactly where every edge is.

Start building free
  • 10peripheral areas modeled
  • 24projects ready to run
  • Real timeon your own machine
ESP32 DevKit V1: blinklive0.000 s 0.00x
Click to open it in the editor
The board is running real firmware right now. Click it to open the circuit in the editor.
The model

What is modeled

Taken from the board's own contract document and put in plain words, with what is missing beside it.

Modeled

Core
Xtensa LX6 in the windowed ABI, sixty-four address registers, the window overflow and underflow handlers, one instruction per cycle at 240 MHz
Memory
128 KB of instruction RAM at 0x4008_0000 and 192 KB of data RAM at 0x3FFB_0000, kept apart the way ESP-IDF keeps them
GPIO matrix and IO_MUX
Forty pins with the real two-register split, pulls and input enable per pad, and GPIO 34 to 39 refused as outputs, because the chip has no driver on them
UART0
Paced at the configured baud rate, wired to the serial monitor
UART1 and UART2
Serial1 and Serial2 on whatever pins begin() names, through the GPIO matrix: real frames on the wire, bit by bit, at the rate the divider really gives, with the core driver’s receive buffer
Timer group 0
Timer 0 at a tick a microsecond behind millis() and micros(); delay() parks the core on CCOMPARE0 rather than spinning on it
ADC1
Twelve bits on the eight real channels (GPIO 36, 37, 38, 39, 32, 33, 34 and 35) with the four attenuations, and 11 dB following a real part’s curve to 4095 at about 3.1 V
LEDC
The high-speed group: four timers and eight channels on any pin with an output driver, behind analogWrite, ledcAttach and ledcWrite
The interrupt matrix
Its sources routed the way the hardware routes them, so attachInterrupt is three writes rather than one
WiFi, simulated
WiFi.h, HTTPClient.h and WebServer.h over a network written in software: no radio, no 802.11, and real internet only when you sign in and switch it on

Not modeled

  • A radio of any kind. There is no 802.11 and no Bluetooth radio in the model. WiFi and Bluetooth are simulated instead (the Arduino API over a network of ours which reaches the real internet only when you sign in and switch it on, and a phone in the editor’s Bluetooth pane), and every page that mentions them says so.
  • The second core. A real ESP32 has two LX6 cores; this model runs the PRO core, so anything that starts a task on core 1 will not run.
  • The FPU: a hard-float binary built elsewhere faults on its first float instruction. Sketches built here are soft float, so float math works.
  • The cache, flash and PSRAM, the RTC and ULP, deep sleep, ADC2, the touch and hall sensors, I2C, SPI, I2S and RMT.
  • Several addresses (the IO_MUX pad order, the timer group and LEDC layouts, the SENS offsets, the interrupt matrix numbers and the GPIO matrix signal indices LEDC uses) are this model’s belief rather than something it can stand behind. Section 6 of the contract names every one.
Start here

Open one and press Run

Each of these opens in the editor exactly as it is drawn here.

Questions

Is it free?

Yes. Every board and every part is on the free plan, with no account needed.

Can I compile my own sketch for it?

Yes. Edit the sketch and press Run: it compiles in the tab with clang for Xtensa, and the build panel shows every step. Nothing is uploaded. Floating-point math works: the browser builds it soft float, as on every other board here.

Does it simulate WiFi or Bluetooth?

Both, simulated, and it says plainly that they are. Bluetooth is a phone in the editor’s Bluetooth pane, not a radio. Your sketch uses the real Arduino calls (WiFi.begin, WiFi.status, HTTPClient, WebServer), and the board joins a network, fetches a page and serves one. Underneath there is no radio and no 802.11. Four made-up addresses under .mokxi answer inside this tab. Signed in, you can switch on Real internet in the Cloud panel, and HTTP and HTTPS requests to real hosts go out through Mokxi’s gateway.

Why will pinMode(34, OUTPUT) not work?

Because it does not work on the chip either. GPIO 34 to 39 have an input buffer and no output driver at all. Mokxi refuses the write the way the silicon does, counts it, and puts a small amber mark on the board rather than letting you believe the pin is driving something.

Why does my potentiometer reach 4095 before the end of its travel?

Because at the default 11 dB attenuation a real ESP32’s raw reading saturates at about 3.1 V, short of the 3.3 V rail, and bends on the way there: the middle of the pot reads about 1890, not 2048. Mokxi models that curve, and the knob example prints the raw number so it is not a mystery.

Is this the 30-pin or the 38-pin board?

The thirty-pin DOIT DevKit V1. The 38-pin Espressif DevKitC is a full inch between header rows and brings out six more pins: the GPIO numbers are the same chip’s, the positions are not.

Does it run both cores?

One. The PRO core runs; there is no APP CPU and no FreeRTOS to schedule across them, so a setup()/loop() sketch is fine and xTaskCreatePinnedToCore is not.

Try it on your own firmware

What you build here runs on the board on your desk, unchanged. Nothing to install and no account needed.