Skip to the content
2 layers213.7 × 144.8 mmUV Curing Box, the printed circuit board in 3D

UV PCB resin curing box controller using WCH CH32V003 RISC-V MCU, 4x4 keypad, TM1637 display, and KiCad PCB

Size
213.7 × 144.8 mm
Copper layers
2
Thickness
1.6 mm
Parts
151
Nets
120
Pads
325
Tracks, vias
282, 3
Pours
4
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
29 Sep 2026
Updated
29 Sep 2026

Overview

UV Curing Box is an open-source printed circuit board by koko69420, from the koko69420/UV-Curing-Box repository on GitHub. It is a 2-layer board of 213.7 × 144.8 mm with 151 parts on 120 nets, routed with 282 tracks and 3 vias.

It is built around the CH32V003A4M6, AMS1117-5.0 and AO3400A, with the SS54 among its other parts. Its parts include 100 diodes, 36 resistors, 5 connectors, 4 capacitors and 2 ICs. It belongs with the lEDs and displays and keyboards and input boards and the RISC-V boards of this library.

Main components

4

README

README.md

UV PCB Curing Box

A dedicated, safety-interlocked UV exposure and resin curing chamber controller powered by the ultra-low-cost WCH CH32V003 RISC-V microcontroller, featuring a 4x4 matrix keypad, a 4-digit TM1637 7-segment display, software PWM brightness control, and custom KiCad hardware.


Features

  • RISC-V Microcontroller Core:
    • Implemented on the WCH CH32V003A4M6 (QingKe 32-bit RISC-V2A core @ 48 MHz, 16 KB Flash, 2 KB SRAM).
    • Built with the PlatformIO Community CH32V Arduino core (ch32v003fun HAL).
  • Fail-Safe UV Safety Interlocking:
    • The high-power UV LED MOSFET (pin A2) is strictly energized ONLY during the active RUNNING state.
    • Transitions to BOOT, IDLE, READY, PAUSED, or FINISHED instantly and continuously force the gate LOW.
  • Dual Timing Modes:
    • Timer Mode: Countdown timer with customizable duration (capped at 8:00 minutes) and automated shutoff.
    • Stopwatch Mode: Elapsed time counter with live LED toggling.
  • Fast Presets & Matrix Keypad Input:
    • 4x4 matrix keypad interface for direct numeric entry, pause/resume, and reset.
    • One-touch curing duration presets:
      • A: 1:00 min
      • B: 1:30 min
      • C: 2:00 min
      • D: 3:00 min
    • On-the-fly cycle extension (# button adds +5 seconds, clamped to 8:00).
  • PWM Exposure Brightness Regulation:
    • 50 Hz sampled software PWM (0–100%) designed to eliminate flicker and ensure accurate optical dose delivery.
    • Dedicated on-screen brightness tuning menu (b 0 to b100).
  • Telemetry & Status Display:
    • TM1637 4-digit 7-segment display showing MM:SS with blinking colon indicators during exposure.
  • Custom Hardware & PCB:
    • Designed in KiCad with full schematics, PCB routing, 3D step models, and vector silkscreens.

Hardware Specification

Components & Microcontroller

  • MCU: WCH CH32V003A4M6 (TSSOP-20).
  • Display: TM1637 4-digit 0.36" / 0.56" 7-segment clock display module.
  • Keypad: 4x4 tactile matrix keypad.
  • Switching MOSFET: N-Channel Power MOSFET (low-side switch on A2 driving 395nm/405nm UV LED arrays).
  • Power Input: 12V DC input for LED strings with onboard 5V / 3.3V LDO regulation for logic.

Hardware Prototype & Visual Design

Live Hardware Prototype

Below is the operational controller prototype executing a countdown exposure on the TM1637 4-digit display:

UV Curing Box Live Prototype Display

Electrical Schematic

UV Curing Box Schematic

PCB Board Layout & Copper Routing

Complete Board LayoutTop Copper Layer (F_Cu)Bottom Copper Layer (B_Cu)

Pinout Mapping

FunctionPin NameDirectionDescription
Keypad Row 1C1OutputMatrix row scan line 1
Keypad Row 2C2OutputMatrix row scan line 2
Keypad Row 3C3OutputMatrix row scan line 3
Keypad Row 4C4OutputMatrix row scan line 4
Keypad Col 1C6Input (Pullup)Matrix column sense line 1
Keypad Col 2C7Input (Pullup)Matrix column sense line 2
Keypad Col 3D4Input (Pullup)Matrix column sense line 3
Keypad Col 4D5Input (Pullup)Matrix column sense line 4
TM1637 CLKD6OutputDisplay serial clock
TM1637 DIOA1BidirectionalDisplay serial data line
UV MOSFET GateA2OutputLow-side power gate driver (PWM)

State Machine

mermaid
stateDiagram-v2
    [*] --> BOOT
    BOOT --> IDLE: Initialization Complete
    IDLE --> READY: Digit Entry or Preset (A-D)
    READY --> RUNNING: Press '#' (Start)
    RUNNING --> PAUSED: Press '*' (Pause)
    PAUSED --> RUNNING: Press '#' (Resume)
    PAUSED --> IDLE: Press '*' (Reset to Zero)
    RUNNING --> FINISHED: Time Reaches 0:00 (Timer) or 8:00 (Stopwatch)
    FINISHED --> IDLE: 5s Auto-timeout or Any Key

Project Structure

text
UV-Curing-Box/
├── Programs/                         # PlatformIO firmware project
│   ├── platformio.ini                # CH32V003 target configuration
│   └── src/
│       └── main.cpp                  # Complete non-blocking state machine & firmware
├── Schematic.pdf                     # Schematic diagram export
├── UV_curing_box.kicad_sch           # KiCad schematic
├── UV_curing_box.kicad_pcb           # KiCad PCB board layout
├── MCU_WCH_CH32V003xxx6.kicad_sym   # Custom CH32V003 symbol library
├── led_string.kicad_sch              # UV LED array layout
├── UV_curing_box.svg                 # Scalable vector graphics board plot
├── .gitignore                        # Git ignore rules
└── README.md                         # Project documentation

Firmware Compilation & Flashing

Using PlatformIO (VS Code / CLI)

  1. Install PlatformIO Core and the Community CH32V platform:
    bash
    cd Programs
    pio run
  2. Connect a WCH-LinkE programmer to the single-wire debug interface (SWDIO on pin D1, GND, 3V3).
  3. Upload firmware:
    bash
    pio run --target upload

License

Open hardware and embedded firmware. All rights reserved by the author.

Parts

151
QtyValueFootprintReferences
99LEDLED_SMD:LED_PLCC_2835_HandsolderingD2, D10, D11, D12, D13, D14, D15, D16, D17, D18, D19, D20, D21, D22, D23, D100 +83
3347ΩResistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR10, R11, R12, R13, R14, R15, R16, R17, R18, R19, R20, R21, R22, R23, R24, R25 +17
310µFCapacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC1, C2, C3
2,
210kΩResistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR1, R36
1100nFCapacitor_SMD:C_1206_3216Metric_Pad1.33x1.80mm_HandSolderC4
1100ΩResistor_SMD:R_1206_3216Metric_Pad1.30x1.75mm_HandSolderR2
112V InputTerminalBlock:TerminalBlock_MaiXu_MX126-5.0-02P_1x02_P5.00mmJ1
14X4 Matrix Keypadconnector-smd:smd_conn_1x08_2.54J4
14X7 Segment Displayconnector-smd:smd_conn_1x04_2.54J3
1AMS1117-5.0Package_TO_SOT_SMD:SOT-223-3_TabPin2U1
1AO3400APackage_TO_SOT_SMD:SOT-23Q1
1CH32V003A4M6Package_SO:SO-16_3.9x9.9mm_P1.27mmU2
1OpenConnector_Wire:SolderWirePad_1x01_SMD_1.5x3mmJ5
1Programming HeaderConnector_PinSocket_2.54mm:PinSocket_1x04_P2.54mm_VerticalJ2
1SS54Diode_SMD:D_SMA_HandsolderingD1

The 150 most common of 151 parts.

Similar boards

  • 2 layers34.5 × 24 mmFDXB, the printed circuit board in 3D

    FDXB

    BogdanTheGeek/ch32v003_fdxb

    FDX-B Reader based on the ch32v003

    26 parts3MIT
  • 2 layers43.9 × 54.1 mmXmas tree, the printed circuit board in 3D

    Xmas tree

    BogdanTheGeek/xmas-tree

    Charlieplexed RGB Christmas Tree

    27 parts3MIT
  • 2 layers25 × 23.9 mmRpi camera led, the printed circuit board in 3D

    Rpi camera led

    mithro/rpi-camera-led

    Interposer for the Raspberry Pi camera flex cable: passes the 15-way CSI bus straight through and adds I2C-controlled camera GPIO, PWM illumination LEDs and an ambient light sensor, driven by a CH32V003.

    24 parts1Apache-2.0
  • 2 layers45 × 49.8 mmCCCCPPPS MkI, the printed circuit board in 3D

    CCCCPPPS MkI

    BogdanTheGeek/CCCCPPPS

    Cheap Crappy Constant Current Portable Programmable Power Supply

    26 parts12MIT
  • 4 layersSUNNY C1-HEAD, the printed circuit board in 3D

    SUNNY C1-HEAD

    RSXLX/sunny-the-growing-sunflower-lamp

    SUNNY — The Growing Sunflower Lamp | A personal lamp with customizable exteriors, traceable fabrication, and a local creative workspace.

    55 parts
  • 2 layers87 × 55.9 mmSteeringHardware, the printed circuit board in 3D

    SteeringHardware

    John-Carr/SteeringHardware

    Steering Wheel PCB for SolarGators

    62 partsMIT
  • 2 layers48 × 36.5 mmOsillyscope etchable, the printed circuit board in 3D

    Osillyscope etchable

    tvlad1234/osillyscope

    Low cost, low part count CH32V003-based oscilloscope

    31 parts30MIT
  • 2 layers24.1 × 21.6 mmCh32v003a4m6-breakout, the printed circuit board in 3D

    Ch32v003a4m6-breakout

    mverdon/ch32v003a4m6-breakout

    Breakout board for prototyping with the CH32V003 MCU

    4 partsCERN-OHL-P-2.0

Questions

How big is the UV Curing Box PCB?

It measures 213.7 × 144.8 mm and has 2 copper layers, 1.6 mm thick.

What parts does the UV Curing Box use?

151 parts, built around the CH32V003A4M6, AMS1117-5.0, AO3400A and SS54. 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 UV Curing Box KiCad files?

From the koko69420/UV-Curing-Box repository on GitHub, at the commit this page was made from: the board is UV_curing_box.kicad_pcb and its schematic UV_curing_box.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the UV Curing Box design in my own project?

Its repository states no licence, so its author keeps all rights: ask koko69420 before reusing the design.