

ESP32-Geiger Counter
Handheld ESP32-S3 Geiger counter with a firmware-regulated 400 V boost, SBM-20 tube, USB-C charging and OLED display.
- Size
- 137 × 84 mm
- Copper layers
- 2
- Thickness
- 1.6 mm
- Parts
- 89
- Nets
- 80
- Pads
- 321
- Tracks, vias
- 398, 614
- Pours
- 15
- Routed
- Yes
- KiCad
- KiCad 10.0 (file 20260206)
- Created
- 21 Apr 2026
- Updated
- 28 Oct 2026
Overview
ESP32-Geiger Counter is an open-source printed circuit board by AronASzucs, from the AronASzucs/Avalanche32 repository on GitHub. It is a 2-layer board of 137 × 84 mm with 89 parts on 80 nets, routed with 398 tracks and 614 vias.
It is built around the ESP32-S3-WROOM-1-N8, AP63203WU and UCC27517DBVR-TP, with the BQ25886RGE, USBLC6-2SC6 and AO3401A among its other parts. Its parts include 28 resistors, 26 capacitors, 6 ICs, 6 diodes and 4 transistors. It belongs with the sensors and measurement and lEDs and displays boards and the ESP32 boards of this library.
Main components
9ESP32-S3-WROOM-1-N8
SMD,25.5x18mm-40℃~+85℃ -98.2dBm 2.4GHz 20.5dBm 355mA 3V~3.6V 95mA Bluetooth5.0 ESP32-S3 Chip On-board PCB Antenna UART、SPI、I2C、I2S、USB SMD,25.5x18mm WiFi Modules ROHSEspressif SystemsWiFi ModulesAP63203WU
TSOT-23-6-40℃~+85℃@(TA) 1 1.1MHz 22uA 2A 3.3V 3.8V~32V Buck Built-in Fixed Overcurrent Protection、Light load efficient mode、Cycle-by-cycle current limiting、Hiccup current limiting、EMI optimization (spread spectrum) Step-down type Yes TSOT-23-6 DC-DC Converters ROHSDiodes IncorporatedDC-DC ConvertersUCC27517DBVR-TP
SOT-23-50℃~+125℃ 1 100uA 11ns 12ns 1V~1.2V 2.4V~2.6V 300mA 33ns 33ns 4.5V~18V 600mA Enable shutdown、Interleaved conduction protection Low Side MOSFET SOT-23-5 Gate Drivers ROHSTECH PUBLICGate DriversBQ25886RGE
VQFN-24-EP(4x4)-40℃~+85℃ 12uA 2 2.2A 4.3V~6.2V 8.8V Charging IC Lithium Battery Support Support VQFN-24-EP(4x4) Battery Management ROHSTexas InstrumentsBattery ManagementUSBLC6-2SC6
SOT-23-60.35pF、0.8pF 100nA 150W@8/20us 15V 2 5V 6A@8/20us 6V ESD SOT-23-6 ESD and Surge Protection (TVS/ESD) ROHSUMWESD And Surge Protection (TVS/ESD)AO3401A
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 SemiconductorMOSFETsMMBT3904
SOT-23-55℃~+150℃ 1 NPN 100 100nA 200mA 200mW 300MHz 300mV 40V 6V NPN SOT-23 Bipolar (BJT) ROHSJiangsu Changjing Electronics Technology (CJ)Bipolar (BJT)STN1HNK60
SOT-223-55℃~+150℃ 1 N-channel 10nC@10V 156pF 23.5pF 3.3W 3.7V 3.8pF 400mA 600V 8.5Ω@10V N-Channel SOT-223 MOSFETs ROHSSTMicroelectronicsMOSFETsUS1M
SMA-55℃~+150℃ 1 Independent 1.65V@1A 1A 1kV 30A 5uA@1kV 75ns SMA Fast Recovery / High Efficiency Diodes ROHSMDDFast Recovery / High Efficiency Diodes
README
README.mdAvalanche32: ESP32-S3 Geiger Counter
A handheld, battery-powered Geiger counter built around the ESP32-S3-WROOM-1 and a Soviet SBM-20 Geiger–Müller tube. It has a firmware-regulated 400 V supply, an audible click for each count, a 2.42" OLED display, and a single USB-C port for both charging and programming.

Status: Rev A, in progress. The perfboard prototype is working: it regulates the tube supply at 370–400 V, counts background radiation, and clearly detects real radioactive sources (see Measurements). The Rev A schematic and PCB layout are complete, and the boards and parts have been ordered. Assembly and testing are next.
| Front | Back |
|---|---|
![]() | ![]() |
Hardware Overview
| Block | Implementation |
|---|---|
| MCU | ESP32-S3-WROOM-1, native USB (no USB-UART bridge), BOOT and RESET buttons |
| Battery | 2S Li-ion / LiPo pack (7.4 V nominal, 6.0–8.4 V) on a JST-XH connector |
| Charger | TI BQ25886 2-cell boost charger with power-path management, charge-status and power-good LEDs |
| USB-C | 5 V input (5.1 kΩ CC pull-downs, no USB PD), 3 A polyfuse on VBUS, USBLC6-2 ESD protection on the data lines |
| Power switch | Slide switch driving an AO3401A P-FET load switch. The charger stays active, so the pack charges with the unit switched off. |
| 3.3 V rail | Diodes AP63203 synchronous buck converter |
| High voltage | Firmware-regulated boost from the system rail to ~400 V (details below) |
| Detection | SBM-20 cathode pulse → MMBT3904 pulse shaper → ESP32 interrupt |
| Audio | Piezo transducer switched by a 2N7002 low-side MOSFET, one click per count |
| Display | 2.42" 128×64 SSD1309 OLED module over SPI |
| Battery monitor | 1 MΩ / 330 kΩ divider into an ESP32 ADC input |
High-Voltage Supply
- Topology: discontinuous-mode boost converter. The ESP32 drives a UCC27517 gate driver, which switches an STN1HNK60 600 V MOSFET into a 10 mH inductor, with a US1M fast-recovery rectifier.
- Regulation: closed-loop hysteretic control. A 3 × 100 MΩ + 680 kΩ divider (with a 2.2 nF filter cap) feeds the ESP32 ADC, and the firmware gates the boost pulses to hold the setpoint.
- Protection: a 450 V Zener clamp (3 × 150 V in series) on the output, plus a firmware overvoltage shutdown.
- Filtering: a 20 nF / 1 kV reservoir, then a 1 MΩ / 10 nF RC ripple filter, then a 5.1 MΩ anode resistor into the tube.
- Layout: the HV section sits in its own isolated area with a "400V High Voltage" marking on the silkscreen.
GPIO Map (Rev A PCB)
| Signal | ESP32-S3 GPIO |
|---|---|
| HV_PWM (gate driver input) | IO4 |
| HV_SENSE (HV divider, ADC1) | IO2 |
| PULSE (tube pulse, active low) | IO5 |
| PIEZO | IO6 |
| VBAT_SENSE (ADC1) | IO1 |
| OLED SCK / MOSI / CS / DC / RST | IO12 / IO11 / IO10 / IO13 / IO21 |
| USB D− / D+ | IO19 / IO20 |
Test points are provided for 3.3 V, GND, PULSE and HV_SENSE.
PCB
| Parameter | Value |
|---|---|
| Dimensions | 137 × 84 mm |
| Layers | 2 (1.6 mm FR-4, 1 oz copper) |
| Finish | Black solder mask, white silkscreen, HASL |
| Mounting | 4 × M3 mounting holes |
Measurements
These readings are from the perfboard prototype, with each sample placed directly against the SBM-20 tube. Dose rates use the firmware's conversion factor of 0.0057 µSv/h per CPM (SBM-20, Cs-137 basis), so they are indicative only.
| Source | CPM | × Background | Indicated µSv/h |
|---|---|---|---|
| Normal indoor background | 15–25 | 1× | ~0.09–0.14 |
| Uranium glass plate | 300–400 | ~17× | ~1.7–2.3 |
| Vintage radium-dial watch | 350–450 | ~20× | ~2.0–2.6 |
| Watch + plate together | 550–650 | ~30× | ~3.1–3.7 |
| Fiestaware red-orange saucer (uranium glaze) | ~8,700 | ~435× | ~50 |
| Fiestaware cup resting on saucer | ~13,400 | ~670× | ~76 |
Contact readings on glazed ceramics are mostly beta from the uranium decay chain, so the µSv/h values overstate the actual dose.
Known Issue: Tube Re-Firing
The current SBM-20 is degraded and sometimes fires a burst of 100–1000+ pulses instead of a single one. The firmware works around this with a burst filter (BURST_FILTER) that merges each burst into one count, at the cost of undercounting at very high rates. A replacement tube is on the way.
Firmware
Firmware/HV_Test/HV_Test.ino is a bench test for the HV supply and counting chain, written for the Arduino ESP32 core. It provides:
- Hysteretic HV regulation (370 V setpoint, 5 V hysteresis) with a 460 V overvoltage shutdown.
- An interrupt-driven pulse counter with the optional burst filter (2.5 ms window).
- A 60-second rolling CPM and an estimated µSv/h.
- A 4 kHz piezo click for each count.
- Serial output at 115200 baud showing HV, boost on-time, total and raw counts, CPM and µSv/h. To change the boost on-time, send a number from 5 to 120 (µs).
Note: this sketch targets the perfboard prototype, which uses a classic ESP32 dev board. Its pin assignments (IO4, IO35, IO27, IO25) do not match the Rev A PCB. Update the constants at the top of the file using the GPIO map before running it on the PCB.
Repository Layout
| Path | Contents |
|---|---|
ESP32-Geiger-Counter.kicad_* | KiCad project: schematic, PCB and design rules |
Custom Parts.kicad_sym, libs/ | Custom symbols, footprints and 3D models |
production/ | JLCPCB fabrication outputs: Gerber/drill archive, BOM, pick-and-place and IPC netlist |
bom/ibom.html | Interactive BOM for hand assembly |
Images/ | 3D renders (3D/) and per-layer plots (Layers/) |
scripts/generate_images.py | Regenerates everything in Images/ using kicad-cli |
Firmware/ | ESP32 firmware |
Draft1.asc | LTspice simulation of the HV boost |
To regenerate the images (requires KiCad 9+ and, for PNG layer plots, pip install pymupdf):
python scripts/generate_images.pyRoadmap
- HV boost designed and simulated in LTspice
- Perfboard HV prototype with regulation verified at 370–400 V
- SBM-20 background count test (15–25 CPM indoors)
- Source tests: uranium glass, radium-dial watch and uranium-glazed Fiestaware detected (up to ~670× background)
- Bench-test firmware: hysteretic HV control, rolling CPM, µSv/h estimate, piezo click
- Full schematic: power, charger, ESP32-S3, HV supply, detector and display
- Rev A PCB layout and fabrication outputs
- Rev A boards and parts ordered
- Rev A assembly and bring-up
- Application firmware: OLED UI, menus, dose alarm, logging, battery monitoring
Tools
KiCad · LTspice · Arduino (ESP32 core) · C++
Safety
This device generates ~400 V DC. The stored energy is small, but do not touch the HV section while the unit is powered. Before handling the board, let the capacitors discharge: wait for the HV reading to fall to 0 V.
Store radioactive test samples (radium dials, uranium glass, uranium-glazed ceramics) sealed and away from living spaces. Never open radium-dial watches or gauges, and never eat or drink from uranium-glazed dishware.
Parts
89| Qty | Value | Footprint | References |
|---|---|---|---|
| 5 | 100nF | Capacitor_SMD:C_0805_2012Metric | C14, C18, C20, C29, C31 |
| 5 | 10uF | Capacitor_SMD:C_1206_3216Metric | C8, C11, C15, C19, C30 |
| 5 | 22uF | Capacitor_SMD:C_1206_3216Metric | C7, C10, C16, C17, C32 |
| 4 | 10K | Resistor_SMD:R_0805_2012Metric | R3, R7, R12, R13 |
| 4 | MountingHole | MountingHole:MountingHole_3.2mm_M3 | H1, H2, H3, H4 |
| 3 | 100M | Resistor_SMD:R_1206_3216Metric | R14, R15, R16 |
| 3 | 100k | Resistor_SMD:R_0805_2012Metric | R20, R27, R28 |
| 3 | 10k | Resistor_SMD:R_0805_2012Metric | R21, R22, R24 |
| 3 | 10nF 1kV | Capacitor_SMD:C_1206_3216Metric | C24, C25, C27 |
| 3 | 150V Zener | Diode_SMD:D_SMA | D4, D5, D6 |
| 3 | 1uF | Capacitor_SMD:C_0805_2012Metric | C12, C22, C28 |
| 2 | 1k | Resistor_SMD:R_0805_2012Metric | R25, R26 |
| 2 | 2.2K | Resistor_SMD:R_0805_2012Metric | R8, R9 |
| 2 | 5.1K | Resistor_SMD:R_0805_2012Metric | R1, R2 |
| 2 | LED | LED_SMD:LED_0805_2012Metric | D1, D2 |
| 1 | 10 | Resistor_SMD:R_0805_2012Metric | R23 |
| 1 | 10mH | Inductor_THT:L_Radial_D12.5mm_P7.00mm_Fastron_09HCP | L3 |
| 1 | 10uF 25V | Capacitor_SMD:C_1206_3216Metric | C23 |
| 1 | 1M | Resistor_SMD:R_0805_2012Metric | R10 |
| 1 | 1M | Resistor_SMD:R_1206_3216Metric | R18 |
| 1 | 1uH | SRP4020TA-1R0M:IND_SRP4020TA-1R0M | L1 |
| 1 | 2.2nF | Capacitor_SMD:C_0805_2012Metric | C26 |
| 1 | 200K | Resistor_SMD:R_0805_2012Metric | R4 |
| 1 | 2N7002 | Package_TO_SOT_SMD:SOT-23 | Q3 |
| 1 | 2s1p Lipo Battery Pack (8.4V-6V) | Connector_JST:JST_XH_S2B-XH-A_1x02_P2.50mm_Horizontal | J1 |
| 1 | 3.3V | TestPoint:TestPoint_Keystone_5015_Micro_Mini | 3.3V |
| 1 | 3.83k | Resistor_SMD:R_0805_2012Metric | R5 |
| 1 | 3.9uH | Inductor_SMD:L_Bourns-SRN6028 | L2 |
| 1 | 330k | Resistor_SMD:R_0805_2012Metric | R11 |
| 1 | 383 | Resistor_SMD:R_0805_2012Metric | R6 |
| 1 | 3A Polyfuse | Fuse:Fuse_2920_7451Metric | F1 |
| 1 | 4.7uF | Capacitor_SMD:C_0805_2012Metric | C13 |
| 1 | 47nF | Capacitor_SMD:C_0805_2012Metric | C9 |
| 1 | 47uF | Capacitor_SMD:C_1206_3216Metric | C21 |
| 1 | 5.1M | Resistor_SMD:R_1206_3216Metric | R19 |
| 1 | 680k | Resistor_SMD:R_0805_2012Metric | R17 |
| 1 | AO3401A | Package_TO_SOT_SMD:SOT-23 | Q4 |
| 1 | AP63203WU | Package_TO_SOT_SMD:TSOT-23-6 | U2 |
| 1 | BOOT | Button_Switch_THT:SW_PUSH_6mm | BOOT |
| 1 | BQ25886RGE | Package_DFN_QFN:Texas_RGE0024H_VQFN-24-1EP_4x4mm_P0.5mm_EP2.7x2.7mm_ThermalVias | U1 |
| 1 | Buzzer | CPT_1203_78_SMT_TR:XDCR_CPT-1203-78-SMT-TR | BZ1 |
| 1 | Conn_01x07 | footprints:OLED_2.42in_SSD1309_SPI_7pin | J5 |
| 1 | ESP32-S3-WROOM-1 | RF_Module:ESP32-S3-WROOM-1 | U3 |
| 1 | GND | TestPoint:TestPoint_Keystone_5015_Micro_Mini | GND |
| 1 | HV_SENSE | TestPoint:TestPoint_Keystone_5015_Micro_Mini | SENSE |
| 1 | MMBT3904 | Package_TO_SOT_SMD:SOT-23 | Q5 |
| 1 | PULSE | TestPoint:TestPoint_Keystone_5015_Micro_Mini | PULSE |
| 1 | RESET | Button_Switch_THT:SW_PUSH_6mm | RESET |
| 1 | SBM-20 Geiger Mueller Tube | 3529:SBM-20 Tube | U6 |
| 1 | STN1HNK60 | Package_TO_SOT_SMD:SOT-223-3_TabPin2 | Q1 |
| 1 | SW_SPDT | Button_Switch_THT:SW_Slide_SPDT_Angled_CK_OS102011MA1Q | SW1 |
| 1 | UCC27517DBVR | UCC27517:DBV5_TEX | U4 |
| 1 | US1M | Diode_SMD:D_SMA | D3 |
| 1 | USBLC6-2SC6 | Package_TO_SOT_SMD:SOT-23-6 | U5 |
| 1 | USB_C_Receptacle_USB2.0_16P | Connector_USB:USB_C_Receptacle_GCT_USB4105-xx-A_16P_TopMnt_Horizontal | J2 |
Similar boards
- 2 layers83 × 32.8 mm

- 4 layers

Power board v1
N-Pulse/EEG-HW-System
EEG acquisition board, power board and headset development
79 parts - 4 layers124.6 × 101 mm

- 2 layers70 × 50 mm

Billy
ryandrake08/billy
Offline Big Mouth Billy Bass voice jokester powered by an ESP32-S3 and a local GPU backend.
82 partsApache-2.0 - 2 layers95 × 55 mm

Wifi geiger counter
atomicra1n/wifi-geiger-counter
A DIY Geiger counter PCB which can detect ionizing radiation and log readings over Wi-Fi. Built with an ESP32, and a HV multiplier circuit that steps up 3.7V to 400V for the GM tube.
64 parts - 4 layers94 × 65.9 mm

- 4 layers60 × 34.1 mm

Power v3.3
N-Pulse/BMI-EMG-HW
Find the schematics and PCB layout for the hardware of the EMG Bracelet
63 parts - 2 layers55.5 × 53.5 mm

Debug board v1
proveskit/antenna-board
The PROVES Kit Antenna Boards! By convention the Z+ Top Cap of the satellite.
29 partsCERN-OHL-W-2.0
Questions
How big is the ESP32-Geiger Counter PCB?
It measures 137 × 84 mm and has 2 copper layers, 1.6 mm thick.
What parts does the ESP32-Geiger Counter use?
89 parts, built around the ESP32-S3-WROOM-1-N8, AP63203WU, UCC27517DBVR-TP and BQ25886RGE. 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 ESP32-Geiger Counter KiCad files?
From the AronASzucs/Avalanche32 repository on GitHub, at the commit this page was made from: the board is ESP32-Geiger-Counter.kicad_pcb and its schematic ESP32-Geiger-Counter.kicad_sch. PCBKit opens the board in the browser, with nothing to install.
Can I use the ESP32-Geiger Counter design in my own project?
Its repository states no licence, so its author keeps all rights: ask AronASzucs before reusing the design.

