Skip to the content
4 layersCeilingpuck v3 final v0-2, the printed circuit board in 3D

Ceilingpuck v3 final v0-2

nate922/ceilingpuck_v4

Ceiling Puck v4 - smart ceiling sensor/actuator

Copper layers
4
Thickness
1.6 mm
Parts
115
Nets
98
Pads
388
Tracks, vias
1,276, 94
Pours
4
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
19 Jun 2026
Updated
19 Jun 2026

Overview

Ceilingpuck v3 final v0-2 is an open-source printed circuit board by nate922, from the nate922/ceilingpuck_v4 repository on GitHub. It is a 4-layer board with 115 parts on 98 nets, routed with 1,276 tracks and 94 vias.

It is built around the 74AHCT125D, PMS5003 and AP63200WU, with the OPA2134UA, TPS54560DDA and AHT20 among its other parts. Its parts include 28 capacitors, 28 resistors, 28 connectors, 7 ICs and 6 diodes.

Main components

12

README

README.md

DreamSeed 种梦计划参赛作品


CeilingPuck v4

160 mm circular ceiling-mount carrier board for an ESP32-S3-DevKitC-1, providing voice, audio, lighting, sensing, and field outputs in a single ESPHome device.

Status: active. Working board is hardware/ceilingpuck_v4_working.kicad_pcb. v4 is the cleanup/extension of v3, adding a PCM1808 ADC input.

What this is

  • 160 mm round 4-layer PCB (F.Cu / GND inner / +24V inner / B.Cu)
  • ESP32-S3-DevKitC-1 socketed via two 1x22 headers (J100/J101)
  • Room-facing side (F.Cu): mics, PIR, mmWave, environmental sensors, XVF voice
  • Ceiling-facing side (B.Cu): regulators, relays, Ethernet, audio I/O, LED outputs
  • Powered from 24 V house feed, with 24V→5V and 5V→3V3 buck regulators
  • Runs on ESPHome 2026.4.5

Repository layout

PathContents
hardware/KiCad 10 project, footprints, symbols, fab outputs, tools
hardware/ceilingpuck_v4_working.*Active working PCB the user is editing
hardware/ceilingpuck_v4.*Canonical v4 source (synced from working)
hardware/footprints/ceilingpuck.pretty/Project-local footprint library
hardware/tools/Strip/route/backup helpers, Freerouting jar, symbol cache
hardware/logs_reports/DRC and ERC JSON reports
firmware/ESPHome configuration
firmware/ceilingpuck.yamlTop-level ESPHome device config
firmware/packages/Modular ESPHome packages (core, sensors, audio, voice, lights, outputs, ethernet)
tests/test_properties.pyPinmap and property regression tests
docs/Design docs, pinout, jumpers, mains wiring, enclosure
components/Component reference photos and datasheets
backups/Timestamped file backups (auto-created by tools)
memory.mdActive session handoff: working set, GPIO map, reroute workflow
rerouting.mdReproducible Freerouting strip/patch/route runbook
ProjectLog.mdAppend-only change log per AGENTS.md policy
FIX-LIST.mdOpen hardware fix tracker (some entries still v3-era)

Documentation index

Start at docs/DESIGN.md and docs/PINOUT.md.

DocUse for
docs/DESIGN.mdv4 design scope, side allocation, KiCad tooling notes
docs/PINOUT.mdCanonical GPIO map (PCM1808, Ethernet, sensors, lights)
docs/option-matrix.mdPopulate-time options per subsystem
docs/incompatible-combinations.mdCombinations that conflict at populate time
docs/JUMPERS.mdSolder jumpers still active in v4
docs/mains-wiring.mdOptional mains relay wiring and isolation
docs/enclosure-openings.mdEnclosure aperture map per sensor
hardware/ZONING.mdRadial regions and copper zoning (parts are v3-era)
v4-detailed-plan.mdPer-agent task plan, model assignments, launch order
v4-dependancy.mdSubsystem prerequisite map

Hardware workflow

KiCad versions

  • KiCad 10.0 (Docker kicad/kicad:10.0) for headless DRC/ERC, DSN export, SES import
  • Local KiCad AppImage at ~/Desktop/kicad/ for interactive edits
  • Freerouting v2.2.4 (hardware/tools/freerouting.jar) inside eclipse-temurin:25-jre

Backups (mandatory before edits)

bash
python3 hardware/tools/backup_project_file.py <files...>

Backups land in backups/ with vYYYYMMDD-HHMM timestamps. KiCad files (*.kicad_sch, *.kicad_pcb, *.kicad_pro), markdown docs, YAML, and writer scripts under tools/ are protected.

Rerouting from scratch

Full runbook: rerouting.md. Short version:

  1. Back up hardware/ceilingpuck_v4_working.kicad_pcb.
  2. Strip routing inside KiCad 10 Docker (inline pcbnew script — do NOT use strip_all_routing_v4.py for the working board).
  3. Export DSN with pcbnew, then patch it (clearance 200→300, In1/In2 → power, empty wiring, rectangular boundary).
  4. Run Freerouting headless: --gui.enabled=false -da -dct 0 -mp 10 -mt 3.
  5. Import SES + refill zones via ZONE_FILLER.
  6. Run DRC and update hardware/logs_reports/.

Verification

After every KiCad edit, before considering the task done:

bash
# Paren balance
python3 -c "from pathlib import Path; t=Path('hardware/ceilingpuck_v4_working.kicad_pcb').read_text(); d=sum(1 if c=='(' else -1 if c==')' else 0 for c in t); assert d==0; print('OK')"

# DRC
docker run --rm --platform linux/amd64 \
  -v "/home/mike/workspace/ceilingpuck_v4:/workspace" \
  kicad/kicad:10.0 \
  bash -c "kicad-cli pcb drc --format json \
    -o /workspace/hardware/logs_reports/drc_<label>.json \
    /workspace/hardware/ceilingpuck_v4_working.kicad_pcb"

Update the schematic version stamp in the top-left when changing *.kicad_sch: (at 25.4 12.7 0) → SCH YYYYMMDD-HHMM <prefix> (replace, do not stack).

Firmware workflow

ESPHome version pinned to 2026.4.5 (ghcr.io/esphome/esphome:2026.4.5). Do not pull :latest or :stable.

Top-level config: firmware/ceilingpuck.yaml. It includes packages from firmware/packages/:

PackageBlock
core.yamlESP32-S3 base, WiFi/API
core_ethernet.yamlW5500 SPI Ethernet (CS=GPIO47, MISO=GPIO11, MOSI=GPIO42, SCLK=GPIO40, INT=GPIO3)
sensors.yamlLD2410, LD2450, AM312 PIR, PMS5003, I²C environmental sensors
audio.yamlI²S DAC out, AMP_MUTE, AMP_SSR
voice.yamlI²S mic in, PCM1808 ADC, MCLK
lights.yamlSK6812 channels, 24 V LED outputs, status pixel
outputs.yamlRemote relay, amp SSR

Build / upload

Pre-OTA gate (per AGENTS.md): turn the device backlight off and set input_boolean.ota_in_progress = on in Home Assistant first.

bash
docker run --rm \
  -v "$PWD/firmware:/config" \
  ghcr.io/esphome/esphome:2026.4.5 \
  run /config/ceilingpuck.yaml --device <ip-or-hostname> 2>&1 | tee /tmp/esphome-ceilingpuck.log

After OTA: clear input_boolean.ota_in_progress, review logs, disconnect after 15 minutes idle.

Tests

bash
python3 -m pytest tests/test_properties.py

Validates pin assignments against the frozen v4 GPIO map in memory.md.

v4 GPIO map (frozen)

Source: memory.md. Canonical doc: docs/PINOUT.md.

GPIOSignalBlock
0AMP_MUTEoutputs
1PIR_IN (AM312)sensors
2SK6812_D1lights
3ETH_INTcore_ethernet
4 / 5LD2410 TX / RXsensors
6 / 7LD2450 TX / RXsensors
8I2S_SDIN2 (PCM1808 OUT)voice
11ETH_MISOcore_ethernet
12I2S_MCLKPCM1808
13 / 14SDA_SENS / SCL_SENSsensors
15 / 16I2S_BCLK / I2S_WSaudio
17 / 18I2S_SDOUT / I2S_SDINaudio / voice
19 / 20reserved native USB D− / D+—
38REMOTE_RLYoutputs
39AMP_SSRoutputs
40ETH_SCLKcore_ethernet
41 / 44LED24_1 / LED24_2lights
42ETH_MOSIcore_ethernet
43SK6812_D2lights
45 / 46PMS_TX / PMS_RXsensors
47ETH_CScore_ethernet
48STATUS_PIXlights

Conventions

  • All edits follow AGENTS.md (root). Smaller, evidence-driven changes; explicit backups; project log entries for approved changes.
  • Do not commit, push, or create PRs unless explicitly asked.
  • Long-running commands stream to /tmp/*.log via tee.
  • KiCad and ESPHome work runs in Docker — no host installs.
  • File backup format: backups/<rel-path>.bak.YYYYMMDD-HHMM. Cite the version as vYYYYMMDD-HHMM in chat.

License

(Add your chosen license here.)

Parts

115
QtyValueFootprintReferences
15100nFC_0805_2012MetricC2, C3, C4, C5, C6, C11, C13, C15, C20, C22, C31, C200, C300, C400, C401
7100kR_0805_2012MetricR30, R33, R202, R203, R306, R309, R314
710kR_0805_2012MetricR1, R20, R21, R32, R311, R400, R401
710uFC_0805_2012MetricC1, C16, C23, C30, C201, C204, C402
4MTG_M3_AMPAMP_M3_StandoffAH1, AH2, AH3, AH4
4MTG_M4_GNDMountingHole_4.3mm_M4_PadH1, H2, H3, H4
3100R_0805_2012MetricR305, R308, R313
3NMOSSOT-23Q10, Q11, Q12
21.1AR_0805_2012MetricR301, R304
21uFC_0805_2012MetricC202, C203
222uFC_0805_2012MetricC14, C21
224V_TVSD_SMBD11, D13
2330R_0805_2012MetricR300, R302
24.7kR_0805_2012MetricR100, R101
25.1kR_0805_2012MetricR10, R11
2SchottkyD_SOD-123D10, D12
110uHL_6.3x6.3_H3L1
11N4148D_SOD-123D14
12.2nFC_0805_2012MetricC12
1220R_0805_2012MetricR312
124V_INTerminalBlock_Phoenix_MPT-0,5-2-2.54_1x02_P2.54mm_HorizontalJ3
124V_PWRTerminalBlock_Phoenix_MPT-0,5-2-2.54_1x02_P2.54mm_HorizontalJ44
132kR_0805_2012MetricR34
14.7uHL_Vishay_IFSC-1515AH_4x4x1.8mmL2
1470uFCP_Radial_D10.0mm_P5.00mm_CustomC10
152.3kR_0805_2012MetricR31
1600R@100MHzL_0805_2012MetricFB1
174AHCT125SOIC-14_3.9x8.7mm_P1.27mmU2
1AHT20JST_XH_B4B-XH-A_1x04_P2.50mm_VerticalJ10
1AM312JST_XH_B3B-XH-A_1x03_P2.50mm_VerticalJ17
1AMP_PWRAMP_PinSocket_1x02_P5.00mmJ27
1AMP_SIGAMP_PinSocket_1x06_P3.81mmJ26
1AP63200WUSOT-23-6U5
1BH1750JST_XH_B4B-XH-A_1x04_P2.50mm_VerticalJ11
1DEVKIT_GPIO_APinHeader_1x22_P2.54mm_VerticalJ100
1DEVKIT_GPIO_BPinHeader_1x22_P2.54mm_VerticalJ101
1G2RL-1_24VRelay_SPDT_Hongfa_HF3F-L-xx-1ZL2TK1
1G3VM-61VY3DIP-8_W7.62mm_SocketU6
1INMP441_1INMP441_PinSocket_2x03_P2.54x7.62mmJ20
1INMP441_2INMP441_PinSocket_2x03_P2.54x7.62mmJ21
1INMP441_3INMP441_PinSocket_2x03_P2.54x7.62mmJ22
1INMP441_4INMP441_PinSocket_2x03_P2.54x7.62mmJ23
1JP10SolderJumper-2_P1.3mm_Open_Pad1.0x1.5mmJP10
1JP11SolderJumper-2_P1.3mm_Open_Pad1.0x1.5mmJP11
1LD2410CJST_XH_B5B-XH-A_1x05_P2.50mm_VerticalJ15
1LD2450PinSocket_2x04_P2.00mm_VerticalJ16
1LED24_1TerminalBlock_Phoenix_MPT-0,5-4-2.54_1x04_P2.54mm_HorizontalJ42
1LED24_2TerminalBlock_Phoenix_MPT-0,5-4-2.54_1x04_P2.54mm_HorizontalJ43
1OPA2134DIP-8_W7.62mm_SocketU3
1PCM5102PinSocket_1x06_P2.54mm_VerticalJ25
1PMS5003PinSocket_1x08_P2.54mm_VerticalJ14
1REMOTETerminalBlock_Phoenix_MPT-0,5-2-2.54_1x02_P2.54mm_HorizontalJ45
1SCD40JST_XH_B4B-XH-A_1x04_P2.50mm_VerticalJ12
1SGP41JST_XH_B4B-XH-A_1x04_P2.50mm_VerticalJ13
1SK6812_1JST_XH_B3B-XH-A_1x03_P2.50mm_VerticalJ40
1SK6812_2JST_XH_B3B-XH-A_1x03_P2.50mm_VerticalJ41
1SMBJ26AD_SMBD3
1Si2301CDSSOT-23Q1
1TLE2426SOT-23-5U8
1TPS54560Texas_HSOP-8-1EP_3.9x4.9mm_P1.27mmU4
1W5500_CTLPinHeader_1x06_P2.54mm_VerticalJ61
1W5500_SPIPinHeader_1x06_P2.54mm_VerticalJ60
1XVF3800_EVENPinSocket_1x07_P2.54mm_VerticalJ24B
1XVF3800_ODDPinSocket_1x07_P2.54mm_VerticalJ24
1XVF_SELSolderJumper-2_P1.3mm_Open_Pad1.0x1.5mmU7

Similar boards

  • 2 layers105 × 47 mmModulo2-pa27, the printed circuit board in 3D

    Modulo2-pa27

    nodep/myAmp

    Battery powered, solid state, guitar amplifier schematic and PCB

    48 parts4GPL-3.0
  • 4 layers68 × 68 mmBackbone, the printed circuit board in 3D

    Backbone

    andreapiccini/spaghettilab-community

    SpaghettiLab is an open modular hardware and software ecosystem for rapid prototyping, embedded systems development, and product innovation.

    212 parts10
  • 2 layers100 × 60 mmThermostat, the printed circuit board in 3D

    Thermostat

    flaviut/thermostat

    an home thermostat based on ESPHome

    50 partsGPL-3.0
  • 2 layers56.4 × 94.2 mmClockwork Controller, the printed circuit board in 3D

    Clockwork Controller

    fwachsmuth/Clockwork

    Give old Film Projectors crystal accuracy

    98 parts
  • 2 layers43.5 × 23 mmBuck converter, the printed circuit board in 3D

    Buck converter

    MDanielH15/PCB_buck_converter_DC_DC

    PCB

    24 parts1
  • 2 layers120 × 72.4 mmIrrigation ctrl main board, the printed circuit board in 3D

    Irrigation ctrl main board

    mwick83/irrigation_ctrl_hw

    Irrigation Controller aiming to keep (my) plants happy - hardware repository

    85 parts1BSD-3-Clause
  • 2 layers55 × 65 mmZigbee controller, the printed circuit board in 3D

    Zigbee controller

    DavoudTaghawiNejad/zigbee_led_controller

    94 parts

Questions

What parts does the Ceilingpuck v3 final v0-2 use?

115 parts, built around the 74AHCT125D, PMS5003, AP63200WU and OPA2134UA. 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 Ceilingpuck v3 final v0-2 KiCad files?

From the nate922/ceilingpuck_v4 repository on GitHub, at the commit this page was made from: the board is hardware/ceilingpuck_v3_final_v0-2.kicad_pcb and its schematic hardware/ceilingpuck_v3.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Ceilingpuck v3 final v0-2 design in my own project?

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