

Wallet dmm
A multimeter the size of a credit card: DC volts, resistance, continuity and diode test, shown on a 0.91" OLED, with three buttons, an RGB LED and a piezo beeper.
- Size
- 85.6 × 54 mm
- Copper layers
- 2
- Thickness
- 0.8 mm
- Parts
- 70
- Nets
- 58
- Pads
- 217
- Tracks, vias
- 499, 147
- Pours
- 2
- Routed
- Yes
- KiCad
- KiCad 10.0 (file 20260206)
- Created
- 21 Jul 2024
- Updated
- 2 Oct 2026
Overview
Wallet dmm is an open-source printed circuit board by ArgonautGit, from the ArgonautGit/wallet_dmm repository on GitHub. It is a 2-layer board of 85.6 × 54 mm with 70 parts on 58 nets, routed with 499 tracks and 147 vias.
It is built around the STM32L051K8T6, MCP73831T-2ACI/OT-HXY and TL431AIDBZR, with the XC6206P302MR-G, CC0603KRX7R9BB104 and BAV199,215-JSM among its other parts. Its parts include 30 resistors, 14 capacitors, 5 connectors, 5 switches and 4 ICs. It belongs with the STM32 boards of this library.
Main components
12STM32L051K8T6
LQFP-32(7x7)-40℃~+85℃ 1.65V~3.6V 12bit 27 2KB 32 Bit 32MHz 64KB 8KB ARM Cortex-M0+ Built-in FLASH LQFP-32(7x7) Microcontrollers (MCU/MPU/SOC) ROHSSTMicroelectronicsMicrocontrollers (MCU/MPU/SOC)MCP73831T-2ACI/OT-HXY
SOT-23-5LBattery ManagementHXY MOSFETTL431AIDBZR
SOT-23-40℃~+85℃ 100mA 2.495V~36V 2.495V~36V 2uA 400uA Adjustable Parallel ±1% SOT-23 Voltage Reference ROHSNexperiaVoltage ReferenceXC6206P302MR-G
SOT-23-40℃~+85℃ 1 1uA 250mA 250mV@(100mA) 3V 6V Fixed Over Current Protection Positive SOT-23 Voltage Regulators - Linear, Low Drop Out (LDO) Regulators ROHSTorex SemiconductorVoltage Regulators - Linear, Low Drop Out (LDO) RegulatorsCC0603KRX7R9BB104
0603100nF 50V X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHSYAGEOMultilayer Ceramic Capacitors MLCC - SMD/SMTBAV199,215-JSM
SOT-23-65℃~+150℃ 1 Pair Series Connection 140mA 1V@10mA 250mW 3us 4A 5nA@75V 85V SOT-23 Switching Diodes ROHSJSMSEMISwitching DiodesRT1206BRD0710KL
1206-55℃~+155℃ 10kΩ 200V 250mW Thin Film Resistor ±0.1% ±25ppm/℃ 1206 Chip Resistor - Surface Mount ROHSYAGEOChip Resistor - Surface Mount0603B103K500NT
060310nF 50V X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHSGuangdong Fenghua Advanced Tech (FH)Multilayer Ceramic Capacitors MLCC - SMD/SMTAO3401A
SOT-231 P-Channel 14nC@10V 30V 47mΩ@10V、60mΩ@4.5V、85mΩ@2.5V 4A 55pF 645pF 80pF 900mV SOT-23 MOSFETs ROHSAlpha & Omega SemiconductorMOSFETsTS-1187A-B-A-B
SMD-4P,5.1x5.1mm-30℃~+85℃ 1.5mm 1.6N 100,000 cycles 12V 5.1mm 5.1mm 50mA Gold No Round Button SPST Surface Mount,Vertical Without Bracket SMD-4P,5.1x5.1mm Tactile Switches ROHSXKB ConnectionTactile SwitchesKT-0603R
0603-40℃~+85℃ 1.6mm x 0.8mm square LED 1.8V~2.4V 120° 20mA 300mcd 40mW 615nm~630nm 645nm Discrete Diode Red Water Clear 0603 LED Indication - Discrete ROHSHubei KENTO ElecLED Indication - DiscretePKLCS1212E4001-R1
SMD,12x12mm-20℃~+70℃ 12mm 12mm 3mm 4kHz 84dB Passive (Externally Driven) Piezoelectric ±12.5V SMD,12x12mm Buzzers ROHSMurataBuzzers
README
README.mdwallet_dmm
A multimeter the size of a credit card: DC volts, resistance, continuity and diode test, shown on a 0.91" OLED, with three buttons, an RGB LED and a piezo beeper. It runs from a small LiPo that charges over USB-C and is built around an STM32L051K8, with Rust firmware and a simulation of the whole thing.

This is revision 3. Rev 1 (the October 2024 JLCPCB order) is commit a01ea68;
rev 2 is the v2 branch.
| Inputs | COM, V (10 MΩ) and Ω (resistance, continuity, diode) on a 2.54 mm header |
| Voltage | −30 V to +31 V; negative readings through a 1.55 V mid-rail bias |
| Resistance | 0–200 kΩ against a 0.1 % 10 kΩ reference, 150 kΩ–10 MΩ against 1 MΩ, autoranging |
| Continuity, diode | 0.3 mA test current, open-circuit 3.0 V |
| Overload | both inputs survive ±30 V DC; not for mains or anything above 30 V |
| Power | 3.7 V LiPo (protected cell), 100 mA USB-C charging, 3.0 V rail, about 5 µA off |
| Board | 85.6 × 54 mm (ID-1 card), 2 layers, 0.8 mm FR4 |
Changes from rev 1 and rev 2
- Power. The CR1025 (rated 0.1 mA continuous) could not run an OLED. It is replaced by a LiPo charged from USB-C (MCP73831), a 1 µA 3.0 V LDO that stays on while the MCU sleeps in Stop mode, a slide switch that disconnects the battery, bulk decoupling, and a load switch (Q1/Q2) that cuts the OLED module's supply.
- Piezo. The always-running 555 and its two MOSFETs are gone. The MCU drives the piezo push-pull from TIM22 CH1/CH2 on PB4/PB5, which gives 6 Vp-p from 3 V and draws nothing when silent.
- Programming. SWD is on PA13/PA14 with NRST, with nothing else on those pins. USART1 (PA9/PA10, also the ROM bootloader) is on test pads.
- Measurement. Separate V and Ω inputs. The V input is a 9.87 MΩ divider biased to a mid-rail reference, with a hold capacitor because the ADC wants a source below 50 kΩ. The Ω input has two reference ranges; its drive nodes are clamped to ground and the battery, so a voltage on it pushes at most 2.5 mA into the cell instead of into the MCU or the 3.0 V rail. What the MCU pins' own clamps still pass would lift the rail while the MCU sleeps (the LDO cannot sink current), so a TL431 (U4) holds it below 3.32 V.
- Everything else. A resistor for each LED colour, with the anode on the battery so green and blue have headroom. The MCU's calibrated internal sensor replaces the TO-92 MCP9700. Decoupling sits at the pins. Every part is stocked by JLCPCB and carries its LCSC number. All libraries are in the repo.
Layout of the repository
hardware/: KiCad 10 project (schematic, board, project rules, footprints for the RGB LED and the OLED module, 3D models for every part)scripts/: generators for the schematic, board and 3D models, the autorouter wrapper, the fab-file export and the rendersfab/: Gerbers, drill files, BOM and pick-and-place for JLCPCB, schematic and assembly PDFsfirmware/: Rust firmware and its simulation (see firmware/README.md)docs/: renders of the board and the simulation results
Building
Everything runs in the dev shell (nix develop, or direnv).
./scripts/build.sh # schematic -> ERC -> board -> DRC -> fab/The schematic and board are generated by scripts/gen_schematic.py and
scripts/gen_pcb.py; edit those rather than the KiCad files, or the next
build will overwrite the change. Tracks come from hardware/routes.json.
After moving parts or changing the netlist, route again with Freerouting:
kicad-cli sch export netlist --format kicadsexpr -o build/wallet_dmm.net hardware/wallet_dmm.kicad_sch
python3 scripts/autoroute.py build/wallet_dmm.netThe build stops on any ERC or DRC error and checks that the board matches the schematic.
The renders in docs/renders/ and a GLB of the populated board
(build/wallet_dmm.glb, for any glTF viewer) come from:
./scripts/render.shMost parts use KiCad's own 3D models; the switches, buzzer, USB-C socket and
RGB LED use the manufacturers' models (via EasyEDA). The OLED module and the
battery are drawn by scripts/gen_models.py, which lights the OLED's pixels
with the firmware's volts screen:
nix develop .#models -c uv run --with cadquery python scripts/gen_models.pyOrdering from JLCPCB
Upload fab/wallet_dmm-gerbers.zip: 2 layers, 0.8 mm, 1 oz, any colour,
HASL lead-free or ENIG. For assembly, choose top side and upload
fab/bom-jlcpcb.csv and fab/cpl-jlcpcb.csv. In the placement preview,
check the orientation of U1 (pin 1 dot), U2, U3, Q1, Q2, D2, D3, D1 (cathode)
and D4 (anode corner, the dot in the silkscreen) before confirming.
Solder these by hand afterwards:
- J3: a 0.91" 128×32 SSD1306 I2C module, flat on the board, header pins cut short. Match the module's pin labels to the silkscreen (GND VCC SCL SDA).
- J2: a 3-pin header or the probe leads (COM, V, Ω).
- J5: the battery wires from the back, BAT+ to the square pad.
- J4 stays empty; hold a header in it for an ST-Link, or solder one while developing.
Battery
A LiPo pouch cell with its own protection circuit, up to 30 × 40 × 4 mm, taped to the marked area on the back (no pins poke through there). Charging runs at 100 mA, so use 150 mAh or more; R3 sets the current (1000 V / R3).
Bring-up
- Before connecting anything, check that BAT and 3V0 (TP3, TP4) are not shorted to GND.
- Connect the battery and slide SW5 to ON. TP4 reads 2.94–3.06 V. If it
reads 0 V, the switch is the other way round from the silkscreen: fix the
labels in
scripts/gen_pcb.py. - Plug in USB-C: the CHG LED lights while the cell charges and goes out when it is full.
- Flash over SWD (ST-Link on J4: 3V0, SWDIO, SWCLK, NRST, GND). Holding RESET while connecting works if firmware has put the MCU to sleep.
- With the firmware running (firmware/README.md):
short V to COM in DC V and hold C for 3 s to store the zero; do the same
with the Ω leads in Ω mode. Then put 5–30 V on the V input, measure it with another
meter, and send
cal <volts>over the UART (TP2) to set the gain.
Firmware
The firmware is in firmware/: Rust and Embassy, with all the maths and the UI in a host-tested crate. Its README covers the buttons, calibration, flashing and the simulation. The pins:
| Pin | Use |
|---|---|
| PA0 ADC_IN0 | E_LO: the low-range drive node, through R18 |
| PA1 ADC_IN1 | VMID, the bias under the V divider |
| PA2 | VMID_EN: high while measuring volts |
| PA3 | OHM_HI: high-range drive (1 MΩ), analog otherwise |
| PA4 ADC_IN4 | V input divider |
| PA5 ADC_IN5 | Ω input, through R21 into C13 |
| PA6 | OHM_LO: low-range drive (10 kΩ), analog otherwise |
| PA7 | VBUS present (high on USB) |
| PB1 ADC_IN9 | switched battery ÷ 2 |
| PA8, PA15, PB3 | LED blue, red, green (low = on; PA15/PB3 are TIM2 CH1/CH2) |
| PB4, PB5 | piezo, TIM22 CH1/CH2 in antiphase, about 4 kHz |
| PB6, PB7 | I2C1 to the OLED (address 0x3C) |
| PC15 | OLED power: high = on |
| PA11, PA12, PC14 | buttons A, B, C to GND (enable pull-ups) |
| PA9, PA10 | USART1 TX/RX on TP1/TP2 |
Simulation
firmware/simulate.sh runs the front end in ngspice, feeds it through a
model of the ADC into the firmware's own maths, and runs the release binary
in Renode on an emulated STM32L051. Across 200 simulated boards with 1 %
parts, calibrated volts are within ±4 mV up to ±5 V and ±33 mV at ±30 V,
and ohms within ±0.34 % from 1 kΩ to 100 kΩ. The details and plots are in
firmware/README.md and
docs/simulation/.

Renders
| Front | Back, with the battery |
|---|---|
![]() | ![]() |
Parts
70| Qty | Value | Footprint | References |
|---|---|---|---|
| 5 | 1k | Resistor_SMD:R_0603_1608Metric | R4, R15, R16, R19, R25 |
| 4 | 100nF | Capacitor_SMD:C_0603_1608Metric | C5, C6, C7, C10 |
| 4 | 10k | Resistor_SMD:R_0603_1608Metric | R3, R5, R9, R18 |
| 4 | 1M | Resistor_SMD:R_0603_1608Metric | R7, R8, R20, R30 |
| 4 | 1uF | Capacitor_SMD:C_0603_1608Metric | C3, C8, C12, C14 |
| 3 | 5.1k | Resistor_SMD:R_0603_1608Metric | R1, R2, R14 |
| 2 | 100k | Resistor_SMD:R_0603_1608Metric | R22, R23 |
| 2 | 220 | Resistor_SMD:R_0603_1608Metric | R27, R28 |
| 2 | 4.7M | Resistor_SMD:R_1206_3216Metric | R10, R11 |
| 2 | 4.7uF | Capacitor_SMD:C_0603_1608Metric | C1, C2 |
| 2 | BAV199 | Package_TO_SOT_SMD:SOT-23 | D2, D3 |
| 1 | 10k 0.1% | Resistor_SMD:R_1206_3216Metric | R17 |
| 1 | 10nF | Capacitor_SMD:C_0603_1608Metric | C9 |
| 1 | 10uF | Capacitor_SMD:C_0603_1608Metric | C4 |
| 1 | 15k | Resistor_SMD:R_0603_1608Metric | R6 |
| 1 | 22nF | Capacitor_SMD:C_0603_1608Metric | C13 |
| 1 | 2N7002 | Package_TO_SOT_SMD:SOT-23 | Q2 |
| 1 | 330 | Resistor_SMD:R_0603_1608Metric | R26 |
| 1 | 330k | Resistor_SMD:R_0603_1608Metric | R29 |
| 1 | 3V0 | TestPoint:TestPoint_Pad_D1.5mm | TP4 |
| 1 | 4.7k | Resistor_SMD:R_0603_1608Metric | R13 |
| 1 | 470k | Resistor_SMD:R_0603_1608Metric | R12 |
| 1 | 47k | Resistor_SMD:R_0603_1608Metric | R21 |
| 1 | 47nF | Capacitor_SMD:C_0603_1608Metric | C11 |
| 1 | 680 | Resistor_SMD:R_0603_1608Metric | R24 |
| 1 | AO3401A | Package_TO_SOT_SMD:SOT-23 | Q1 |
| 1 | BATT | TestPoint:TestPoint_Pad_D1.5mm | TP3 |
| 1 | BUTTON A | Button_Switch_SMD:SW_Push_1P1T_XKB_TS-1187A | SW1 |
| 1 | BUTTON B | Button_Switch_SMD:SW_Push_1P1T_XKB_TS-1187A | SW2 |
| 1 | BUTTON C | Button_Switch_SMD:SW_Push_1P1T_XKB_TS-1187A | SW3 |
| 1 | CHG red | LED_SMD:LED_0603_1608Metric | D1 |
| 1 | GND | TestPoint:TestPoint_Pad_D1.5mm | TP5 |
| 1 | LiPo 3.7 V | Connector_Wire:SolderWire-0.25sqmm_1x02_P4.5mm_D0.65mm_OD2mm | J5 |
| 1 | MCP73831T-2ACI/OT | Package_TO_SOT_SMD:SOT-23-5 | U2 |
| 1 | OLED 0.91in 128x32 I2C | wallet_dmm:OLED_0.91in_128x32_Module | J3 |
| 1 | PKLCS1212E4001 | Buzzer_Beeper:Buzzer_Murata_PKLCS1212E | BZ1 |
| 1 | POWER | Button_Switch_SMD:SW_SPDT_Shouhan_MSK12C02 | SW5 |
| 1 | PROBES | Connector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_Vertical | J2 |
| 1 | RESET | Button_Switch_SMD:SW_Push_1P1T_XKB_TS-1187A | SW4 |
| 1 | RGB | wallet_dmm:LED_RGB_1615_CA | D4 |
| 1 | STM32L051K8T6 | Package_QFP:LQFP-32_7x7mm_P0.8mm | U1 |
| 1 | SWD | Connector_PinHeader_2.54mm:PinHeader_1x05_P2.54mm_Vertical | J4 |
| 1 | TL431AIDBZR | Package_TO_SOT_SMD:SOT-23 | U4 |
| 1 | UART_RX | TestPoint:TestPoint_Pad_D1.5mm | TP2 |
| 1 | UART_TX | TestPoint:TestPoint_Pad_D1.5mm | TP1 |
| 1 | USB-C (charge only) | Connector_USB:USB_C_Receptacle_HRO_TYPE-C-31-M-12 | J1 |
| 1 | XC6206P302MR (3.0 V) | Package_TO_SOT_SMD:SOT-23-3 | U3 |
Questions
How big is the Wallet dmm PCB?
It measures 85.6 × 54 mm and has 2 copper layers, 0.8 mm thick.
What parts does the Wallet dmm use?
70 parts, built around the STM32L051K8T6, MCP73831T-2ACI/OT-HXY, TL431AIDBZR and XC6206P302MR-G. The full list of its parts is on this page, with links to each part's symbol and footprint where PCBKit's library has them.
Where can I download the Wallet dmm KiCad files?
From the ArgonautGit/wallet_dmm repository on GitHub, at the commit this page was made from: the board is hardware/wallet_dmm.kicad_pcb and its schematic hardware/wallet_dmm.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the Wallet dmm design in my own project?
Its repository states no licence, so its author keeps all rights: ask ArgonautGit before reusing the design.
Similar boards
- 2 layers125 × 125 mm

- 2 layers112 × 202 mm

RIAA
leicht-io/BeoGram-4002-RIAA
Open-source RIAA phono preamp for the Bang & Olufsen BeoGram 4002/4004 turntable (KiCad)
63 parts5CERN-OHL-S-2.0 - 2 layers100 × 100 mm

- 2 layers64 × 46 mm

- 2 layers54.6 × 14 mm

- 4 layers60.7 × 27.2 mm

- 4 layers66.1 × 66.5 mm

Light Doorbell KiCad
Estylos/Light-Doorbell-HW
KiCad project for a custom, battery-powered doorbell with dual-color LED feedback and 4-layer circular PCB design. Optimized for low power and compact integration
87 parts1MIT - 2 layers101 × 101.5 mm


