Component reference
Generated from the same part documentation the app ships: footprints, behavior notes, pin meanings, and sharp edges, by category.
Basics
props.resistance in ohms; props.maxPower rating in watts (0.25 default); exceed it long enough and it burns open.
props.inductance in henries (e.g. 0.01 = 10 mH). ~1 Ω winding resistance modeled; DC = near-short.
props.color: red|green|blue|yellow. Pin a = anode (+), k = cathode. ALWAYS use a series resistor (220–470 Ω at 5 V); sustained >30 mA burns it out.
props.capacitance in farads (100e-6 = 100 µF).
Text annotation with NO electrical function. Anchor on any free hole; props.text is the displayed string. Use to title boards or explain circuit sections.
Momentary SPST between pins a and b; the user clicks it to close.
props.resistance = track ohms, props.position 0–1 = wiper spot. Pins a / wiper / b.
4×4 matrix keypad: pressing key (row r, col c) connects pin r0-r3 to c0-c3, so standard MCU scanning firmware works. The user clicks keys on the canvas (click latches, click again releases).
Common-cathode RGB LED: r/g/b anodes + shared k. Series resistor per channel.
props.kind: "active" (DC in → 2.4 kHz beep) or "passive" (follows drive frequency, e.g. from a 555).
4 independent SPST switches: a0/b0 … a3/b3, straddling the channel. User toggles them.
Rotary encoder: quadrature a/b close to com as the user turns it. Add pull-ups on a and b.
Power
Anchor ON a "B+n" rail hole; the − lead lands on "B-n" below it. Provides the ground reference automatically. props.voltage 1.5–12 V.
props.currentRating in amps (0.5/1/2/5). Blows open on sustained over-current (i²t); place in series with the supply.
SPDT. Energize the coil (~70 Ω, needs ~45 mA through coilA→coilB) to switch com from nc to no. The coil is inductive, so put a flyback diode across it (cathode to the driven side).
Linear 5 V regulator, pins in/gnd/out. Needs ≥7 V at in; out holds 5 V.
12 V wall supply. Anchor ON a "B+n" rail hole like the battery; − lands on "B-n". props.voltage.
DC-DC step-down: vin/gnd in, vout/gnd2 out. props.outputVoltage (default 5).
Semis
Silicon 1N4148, ~0.7 V drop. Pin a = anode, k = cathode; conducts a→k only.
props.breakdownVoltage (3.3/5.1/6.8/9.1/12). Wire CATHODE toward + for a shunt clamp at Vz.
Low-drop diode (~0.3 V). Pin a = anode, k = cathode.
2N2222-style BJT. Pin order on the board: e, b, c (left to right).
N-MOSFET. Pin order: g, d, s.
ICs
LM741 in a DIP-8 that must STRADDLE the channel: anchor on row e; the dy:-3 pins land on row f. Needs vcc and vee supplies.
555 timer, DIP-8 straddling the channel (anchor row e). Classic astable: see the examples.
Quad NAND, DIP-14 straddling the channel (anchor row e). Wire VCC and GND or outputs float.
Hex inverter, DIP-14 straddling the channel.
Quad AND, DIP-14 straddling the channel.
Quad OR, DIP-14 straddling the channel.
Quad XOR, DIP-14 straddling the channel.
Serial-in/parallel-out shift register, DIP-16 straddling the channel. Tie mr HIGH and oe LOW. Clock data on shcp, latch to q0–q7 with stcp. q7s cascades.
Displays
Common-cathode 7-segment, straddles the channel (anchor row e). Segment pins a–g + dp, common = com. Series resistors per segment.
SSD1306 128×64 OLED, I²C address 0x3C. Wire scl/sda to the MCU scl/sda pins and run firmware "example:oled-hello".
NeoPixel strip, 8 addressable RGB LEDs. Wire din from an MCU pin and run firmware "example:neopixel" (uses D2). 5 V on vcc.
HD44780 16×2 character LCD, 4-bit mode. Pair with firmware "example:lcd-hello": D4–D7 = MCU d2–d5, e = d6, rs = d7.
SH1106 1.3" 128×64 OLED, I²C address 0x3C. Like the SSD1306 but page-addressed with a 2-column RAM offset: a correct SH1106 driver sets the column pointer to 2. Pins: gnd/vcc/scl/sda.
1.5″ 128×128 monochrome OLED (SH1107) on I²C at address 0x3D (so it coexists with a 0x3C SSD1306/SH1106). Page-addressed: 16 pages × 128 columns, no column offset; select page 0xB0+p, column via low nibble 0x00-0x0F + high 0x10-0x17, then write 128 data bytes. 0x20/0x21 are standalone addressing-mode commands (no argument, unlike the SSD1306). Init: 0xAE, config, 0xAF.
8×8 LED matrix driven by a MAX7219 over SPI. Pins: vcc/gnd/din/cs/clk. Clock 16-bit words MSB-first (register in high byte, data low byte); registers 1–8 are the 8 rows, 0x0C shutdown (send 1 for normal), 0x0F display-test. Use SoftSPI/bit-bang from MCU GPIOs. Powers up blank in shutdown; send 0x0C,0x01 first.
32×8 LED matrix: four cascaded MAX7219s (FC16 4-in-1 bar) over SPI. Pins: vcc/gnd/din/cs/clk. Shift 4×16-bit words per CS-low window, MSB first: the FIRST word addresses the LEFTMOST 8×8 block; register 0x00 is a no-op filler. Registers 1–8 are rows, 0x0C shutdown (send 1 per chip to wake), 0x0F test. MicroPython max7219.Matrix8x8(spi, cs, 4) drives it exactly like hardware.
E-paper 1.54″ 200×200 (SSD1681), 4-wire SPI. Pins: vcc(3V3)/gnd/din/clk/cs/dc/rst/busy. Drive with SoftSPI + GPIO for dc/cs/rst and poll busy (input): writes to RAM (0x24) show NOTHING until Master Activation (0x20) completes a ~1 s refresh (BUSY is high throughout). Standard init: rst pulse, 0x12 SW reset, 0x11 0x03 entry mode, 0x44/0x45 window, 0x4E/0x4F counters, stream 5000 bytes (MONO_HLSB, 1 = white), 0x22 0xF7, 0x20, wait BUSY. The image persists with power removed.
E-paper 2.13″ 250×122 (SSD1680), same 8-pin SPI header and command set as eink154. Controller RAM is PORTRAIT 122×250 (16 bytes × 250 rows, 4000 bytes); the panel mounts landscape (RAM y runs along the long edge), so draw into a 128×250 MONO_HLSB framebuf and rotate your content 90° like real drivers do. Refresh via 0x20 takes ~1 s (BUSY high); the image persists unpowered.
Sensors
I²C air-quality sensor (Sensirion command set). Wire sda/scl to the MCU sda/scl pins and run firmware "example:i2c-sen55".
DS3231 real-time clock, I²C at 0x68 (BCD time registers). Time advances with simulation time from props.baseTime (ISO string), so it is deterministic. Pins: gnd/vcc(3V3)/scl/sda.
Bosch BME280 environment sensor, real I²C protocol at 0x76 (chip-id, calibration, compensation). Standard MicroPython/Arduino BME280 drivers read the temperature/humidity/pressure configured in the Inspector. Pins: gnd/vcc(3V3)/scl/sda.
MPU-6050 6-axis IMU, real I²C protocol at 0x68 (WHO_AM_I, sleep/wake, full-scale ranges). Standard drivers read the acceleration/rotation configured in the Inspector. Pins: gnd/vcc(3V3)/scl/sda.
TMP36: out = 0.5 V + 10 mV/°C. props.tempC is the simulated temperature (user slider).
LDR: ~1 kΩ bright to ~1 MΩ dark. props.lightLevel 0–1 (user slider). Use in a divider.
Ultrasonic ranger: ≥10 µs pulse on trig → echo high 58 µs/cm. props.distanceCm 2–200 (user slider). Pair with firmware "example:ultrasonic" (trig=d9, echo=d8).
Single-wire temp/humidity sensor. props.tempC, props.humidity (user sliders). Pair with firmware "example:dht11" (data=d2).
PIR motion sensor (HC-SR501). Pins: vcc/out/gnd. OUT is a ~3.3 V push-pull logic output that pulses high for props.holdSec seconds when motion is triggered (Inspector "Trigger motion" button).
MQ-2 gas/smoke sensor (LM393 breakout). Pins: vcc/gnd/aout/dout. aout ≈ 0.4 V clean air → 3.75 V dense smoke (ADC-readable); dout is push-pull and drops LOW when gas exceeds props.threshold. The heater warms up ~5 s after power (readings run high until settled; poll like real firmware does). props.gas 0–1 and props.threshold 0–1 (Inspector sliders).
Analog soil-moisture / water-level probe. Pins: vcc/gnd/aout. aout is an absolute analog voltage (~2.5 V dry → ~0.2 V saturated) an ADC reads. props.moisture 0–1 (Inspector slider).
Modules
Arduino-Nano-style MCU straddling the channel (anchor row e). props.firmware = "example:<id>" (see FIRMWARE PROGRAMS below) or a full Intel HEX string. Wire vcc and gnd.
Classic Arduino Uno (real emulated ATmega328P). Header pins: d2-d13, a0/a1, sda(A4)/scl(A5), gnd/vin/5v/3v3. Power via vin or 5v. props.firmware = "example:blink" | "example:serial-hello" | Intel HEX from the Arduino IDE (Sketch → Export Compiled Binary). Best placed free on the bench and wired pin-to-pin.
Raspberry Pi Pico (real emulated RP2040, 3.3 V logic!) straddling the channel, anchor row e, 11 columns. Wire gnd + vsys (5 V in); the 3v3 pin is a real 3.3 V output. props.firmware = "example:<pico id>" or "uf2:<base64>".
Classic ESP32 DevKit (real emulated dual-core Xtensa LX6 at 240 MHz, 3.3 V logic). Boots unmodified ESP-IDF apps, official MicroPython (ESP32_GENERIC), and compiled Arduino-ESP32 sketches. Wire gnd + vin (≥3.7 V; the onboard LDO makes the 3v3 output). Pins: gnd/vin/3v3/en + g2 (onboard LED), g4, g5, g18, g19, g21, g22, g23. props.firmware = "example:esp32classic-blink" | "bin:<base64 0xE9 image>" | "elf:<base64>". I²C defaults SDA=g21/SCL=g22; ADC on g2/g4 (ADC2, 0–3.3 V, 12-bit). Serial monitor = UART0. Wi-Fi radio initializes (wlan.active/scan/connect API works) but the ether is empty, like real hardware in a shielded room.
ESP32-C3 module (real emulated RISC-V RV32IMC at 160 MHz, 3.3 V logic) straddling the channel, anchor row e, 11 columns. Wire gnd + vin (5 V in); the 3v3 pin is a real 3.3 V output. props.firmware = "example:esp32-blink" | "example:esp32-echo" | "bin:<base64 0xE9 image>" | "elf:<base64>". Serial monitor = UART0. Wi-Fi radio initializes (wlan.active/scan/connect API works) but the ether is empty, like real hardware in a shielded room.
Real emulated ESP32-S3 (dual-core Xtensa LX7, 240 MHz). Boots unmodified ESP-IDF, Arduino-ESP32, and MicroPython firmware; same pin footprint as esp32c3 (gnd/vin/3v3 + g0-g10, g18-g21); serial console in the serial monitor. Wi-Fi radio initializes (wlan.active/scan/connect API works) but the ether is empty, like real hardware in a shielded room.
ESP32-C6 module (real emulated single RISC-V RV32IMAC at 160 MHz, 512 KB SRAM, 3.3 V logic) straddling the channel, anchor row e, 11 columns. Wire gnd + vin (5 V in); the 3v3 pin is a real 3.3 V output. Boots unmodified ESP-IDF, Arduino-ESP32, and MicroPython firmware. Pins: gnd/vin/3v3 + g0-g9, g18-g20, g22, g23. props.firmware = "example:esp32c6-blink" | "bin:<base64 0xE9 image>" | "elf:<base64>". I²C defaults SDA=g23/SCL=g22; ADC1 ch0-6 on g0-g6. Serial monitor = UART0. The radio is not modeled, so there is no Wi-Fi on this board.
RC servo: 50 Hz pulses on sig, 1–2 ms width = 0–180°.
Small DC motor (~20 Ω winding). Spins proportional to voltage.
4-pin 120 mm fan: gnd, v12 (needs 12 V!), tach (open-collector, add a pull-up), pwm control input. props.maxRpm.
KY-008 laser emitter. Pins: s (signal), vcc, gnd. Power vcc (≥2.7 V) and drive s HIGH to emit; tie s to vcc for always-on. Pairs with a photoresistor as a break-beam tripwire.
Two-axis analog joystick (KY-023). Pins: vcc/gnd/vrx/vry/sw. VRx/VRy are wiper voltages (0..VCC) an ADC reads; sw closes to GND when pressed (add a pull-up). props.x, props.y (0–1), props.pressed set by the Inspector.
Instruments
Signal source. props: waveform (sine|square|triangle|sawtooth), frequency Hz, amplitude V, offset V. Square 0–5 V = amplitude 2.5, offset 2.5.
High-impedance meter between pos and neg; reading shows on the canvas.
Near-zero-ohm shunt in series; reading shows on the canvas.