Skip to the content
PCBKitNew board
2 layers150 × 90 mmCaryatid, the printed circuit board in 3D

Common power and I/O board for Daisy Seed instruments. One PCB layout, populated per build.

Size
150 × 90 mm
Copper layers
2
Thickness
1.6 mm
Parts
135
Nets
113
Pads
392
Tracks, vias
957, 167
Pours
10
Routed
Yes
KiCad
KiCad 9.0 (file 20241229)
Created
8 Aug 2026
Updated
29 Sep 2026

Overview

Caryatid is an open-source printed circuit board by ideocentric, from the ideocentric/caryatid repository on GitHub, published under the CERN-OHL-S-2.0 licence. It is a 2-layer board of 150 × 90 mm with 135 parts on 113 nets, routed with 957 tracks and 167 vias.

It is built around the MCP6002-I/P, TPS61023DRL and 74HC14, with the BQ24074RGTR and SS34 among its other parts. Its parts include 64 resistors, 30 capacitors, 18 connectors, 4 ICs and 1 diode.

Main components

5

README

hardware/pcb/README.md

PCB

KiCad 9 project. All four sheets are captured. 125 components, 101 nets, ERC clean at 0 violations.

SheetStateCheck
power.kicad_sch27 components, 19 netsnetlist diffed node-by-node against power-sheet.md; ITERM the one deliberate no-connect
seed.kicad_sch12 componentsall 31 physical pins in pins.yaml land on a net named after the pin
panel-io.kicad_sch46 componentsall 29 pins declaring a connector reach it, traversing series R and the debouncer
audio.kicad_sch37 placements, 0 DNP17 nets diffed against audio.md, including C_g in series with R_g; six jumpers re-diffed for ADR 0010

The dangling-global count reached zero. It ran 33 → 4 → 0 as seed, panel-io and audio landed, and each drop was predicted before the sheet was drawn. Five no-connects remain and all five are deliberate: ITERM on the charger, J11 pin 9 (the spare), and the three unused 74HC14 outputs.

Treat any new ERC message as real. The design now has nothing expected to be wrong, so there is no noise for a fault to hide in.

Placement is functional rather than tidy — components on a 1.27 mm grid with labelled stubs, meant to be dragged into shape in the GUI. The bootstrap scripts in tools/oneshot/ are spent; do not re-run them.

text
pcb/
  caryatid.kicad_pro       project: net classes, design rules, sheet index
  caryatid.kicad_sch       root — four hierarchical sheets, nothing else
  power.kicad_sch          charger, boost, latch, hardware charge LEDs
  seed.kicad_sch           Seed headers, battery gauge, charge-status code
  audio.kicad_sch          jacks, coupling, mic bias / preamp / pad options
  panel-io.kicad_sch       analogue bus, digital bus, switches, comms ports
  caryatid.kicad_sym       symbols: BQ24074RGT, TPS61023DRL, Seed sockets A/B
  caryatid.pretty/         footprints: BQ24074 QFN, Seed sockets A/B
  sym-lib-table            so the project libs resolve without global config
  fp-lib-table

Open caryatid.kicad_pro. caryatid.kicad_pcb carries all 125 footprints, placed and net-bound, on a 150 × 90 mm outline with four M3 holes. Nothing is routed — DRC's 263 unconnected items are the full ratsnest, which is correct.

Placement is a machine first pass, not layout. It puts each block where the zoning says and nothing overhangs the outline, but ~33 courtyards still overlap and the silkscreen is a mess. Treat it as something to drag from.

Which face

Everything is on the front. The back carries nothing but the ground pour.

The SMD was briefly on the back, which is the textbook arrangement and was right when the board was 90 × 100 and the copper under the cell was worth reclaiming. It is wrong here: the enclosure is shallow, so the standoff must be short, and C7 at 5.4 mm cannot hang underneath a 2 mm gap. Moving everything to the front fixes three things at once — the standoff drops to 2 mm, SMT stays single-sided and therefore Economic, and B.Cu is freed as a routing layer instead of carrying 104 parts and every signal.

The flip is stored the way KiCad stores it, checked against a KiCad-written board rather than assumed: back-side footprints hold Y-negated coordinates, F/B layer names swapped, and (justify mirror) on every text. Arcs survive because KiCad 7+ stores start/mid/end and all three mirror together.

Two things to confirm before ordering.

J13 is the SMD Qwiic socket, so it classified as SMD and went to the back. Electrically fine; whether you want a Qwiic cable leaving from the underside is a mechanical question, not one the classifier can answer.

Through-hole bodies are on the front, so their pins protrude into the SMD side. JLC cannot wave-solder them from the back without hitting SMD. For small runs their through-hole work is hand soldering, which is probably fine — but you asked for the JSTs to be machine-fitted as on absonus, and absonus had a component-free underside. Worth putting to JLC before the order.

The connector ring

Placed by function, and stacked from measured courtyard extents rather than by hand — hand arithmetic on offsets produced touching parts three times running.

EdgeConnectors
LeftJ1 DC in, J3 latch switch, J4 charge LEDs
Left, inboardJ11 digital bus IDC, beside A1 (the digital row)
RightJ12 RGB, J9 soft pot, J10 FSR, J17 audio out
Right, inboardJ5 analogue bus IDC beside A2; J16 expansion; J18 audio in and J14 mic return together
BottomJ6 J7 J8 switches, then J19 and J15 module ports

Power enters on the left where the charger and boost sit underneath; the analogue bus, both sensors and the audio pair are on the right, furthest from L1. J18 and J14 are adjacent because they are one loom — capsule signal and its bias return to the hook switch's second pole.

Everything is at rotation 0. A vertical JST exits upward, so turning the pin row to follow the edge buys nothing — and the rotated-courtyard transform is the one piece of geometry here that could not be checked against a known-good file, so it is not used. If you rotate parts by hand in the GUI, KiCad does that arithmetic correctly.

The four M3 holes are part of the collision check. They were not, at first, and that version passed a board where J6 and J18 each sat on top of a mounting hole. They come from the skeleton rather than from the netlist, which is exactly why a check built around the component list missed them.

Routing: the pour and the boost loop only

Everything else is unrouted, deliberately. kicad-cli has no router, KiCad ships none, and Freerouting is not installed — and routing follows placement, which is still a machine first pass. Two pieces were worth doing now because their geometry is settled and the stakes are high.

A GND zone on B.Cu, which is now the empty face — a genuinely solid plane, and the whole layer still available for routing around it.

The zone is not filled. kicad-cli pcb drc has no fill option, so DRC reports the two GND vias as via_dangling — they touch a zone that has no copper in it yet. Fill zones in the board editor (B) and both clear. That is a tooling limit, not a fault.

The boost hot loop. +5V_RAW runs U2 pin 6 to C6 at 0.8 mm. The return is deliberately not a track: C6's ground pad and U2's ground pad each drop a via into the plane, so the return current runs directly beneath the outgoing current. That is the smallest loop available and a track would be strictly worse.

Two things learned the hard way and worth keeping:

  • A track wider than the pad pitch shorts to the neighbouring pad. 0.8 mm centred on U2 pin 6 overlapped pin 5. Every exit from a 0.5 mm-pitch pad now necks to 0.25 mm and widens once clear of the pad field.
  • Via positions are searched against every back-side pad, not chosen by eye. The first attempt put a GND via straight through C7's +5V pad.

SW is routed, and C6 moved to make it possible. Putting the output cap beside U2 was the obvious choice and it quietly cost the switching node: pin 5 can only exit right, and C6 was standing in that gap. C6 now sits below U2, which frees the right side for L1 and — because pin 6 is on the near edge either way — barely lengthens the hot loop.

besidebelow
Hot loop, pin 6 → C61.84 mm2.01 mm
SW node, pin 5 → L14.17 mm, unroutable2.31 mm at 1.2 mm wide

Trading 0.17 mm of hot loop for a routable 1.5 A switching node is not a close call. The lesson is that routability is a placement constraint, and optimising loop length without it produced an arrangement that measured well and could not be built.

Three power pins leaving a 0.5 mm-pitch package share a 1.5 mm band, so every exit necks to 0.2 mm and widens only once clear of the pad field. With that, the routing adds no DRC violations of its own — the four clearance items are the pre-existing SOT-563 pad-pitch ones.

Routing the rest: Specctra DSN

kicad-cli has no router and no dsn export, so tools/export_dsn.py writes one:

sh
python3 tools/export_dsn.py                 # -> hardware/pcb/caryatid.dsn
freerouting -de hardware/pcb/caryatid.dsn -do hardware/pcb/caryatid.ses
# KiCad: File > Import > Specctra Session

KiCad's own GUI export (File > Export > Specctra DSN) is more authoritative; this exists so the export can be produced headlessly. The .dsn and .ses are gitignored — regenerate rather than commit.

Two things it does that the GUI export does not:

  • GND is excluded from the routed nets. F.Cu is a ground plane, which Freerouting cannot see, so it would otherwise scribble 72 ground traces across the board. GND wants stitching vias instead. --with-gnd overrides.
  • Existing copper is emitted (type protect). The boost hot loop and the SW node were placed and measured by hand; this stops the router discarding them.

Not verified against Freerouting — there is none on this machine. The file is checked structurally (balanced, every padstack and net pin resolves, placements inside the boundary) but has never been loaded by the tool it targets. Treat the first import as the real test.

The conventions worth knowing if it ever needs debugging: coordinates are millimetres × 10000, DSN is Y-up so dsn_y = -kicad_y, and images are the canonical library footprint — unrotated and unmirrored — with side and rotation carried in (place ...). That last one matters because the board stores back-side footprints already Y-negated, so using the placed copy would mirror them twice.

Silkscreen and clearance exceptions

Back-side reference designators are hidden. 104 SMD parts at this density made them illegible and they collided 87 times; JLC places from the CPL file, not from silkscreen. Front designators stay — that face is sparse and the connectors are what a human cables up. Mounting holes carry no silk either.

U1 and U2 have a footprint-level clearance override of 0.15 mm. A 0.5 mm pitch package fixes its own pad gaps — 0.25 mm on the QFN, 0.15 mm on the SOT-563 — and the HighCurrent netclass asks 0.3 mm because VBAT, VOUT and VIN_DC land on those pins. No land pattern at that pitch can meet it. The exception is scoped to the two packages; every actual trace still answers to its netclass.

Four violations survive that, and they are worth understanding rather than silencing: min_clearance is a board-wide floor of 0.2 mm that a local override cannot go under, and the SOT-563's own pads are 0.15 mm apart. To clear them the board floor would have to drop to 0.15 — still comfortably above JLC's 0.127 mm capability, since the netclasses would continue to govern routing. That is a board-setup decision, not a footprint fix.

How dense is it, really

mm²
All 125 courtyards4510
of which BT11774
everything except BT12736
board13500
face left after BT111726

23% coverage on BT1's face at 150 × 90 — comfortably inside the band for two layers. It was 38% at the old 90 × 100. An earlier read of this said the board was "essentially full"; that was wrong, and it was wrong for an instructive reason — the figure came from a packer that added 1.6 mm around every part, which inflates an 0603 courtyard nearly six-fold. Measure coverage from courtyards, not from packing margins.

What is tight is the connector ring. The edge connectors are 920 mm² of the 2736 and they all want board edge, which no rectangular zoning expresses. That is the part worth doing by hand first.

Verified with kicad-cli rather than assumed: ERC runs clean and traverses all four child sheets, and a netlist export resolves the full hierarchy.

sh
KCLI=/Applications/KiCad/KiCad.app/Contents/MacOS/kicad-cli
"$KCLI" sch erc --output erc.rpt caryatid.kicad_sch

Net classes

Set in the project file, with pattern assignment so nets land in the right class as they are named rather than by hand afterwards.

ClassTrackClearanceViaApplies to
Default0.25 mm0.2 mm0.6 / 0.3everything else
Power0.8 mm0.25 mm0.8 / 0.4+3V3, +3V3A, +5V
HighCurrent1.2 mm0.3 mm1.0 / 0.5VBAT, VOUT, VIN_DC, SW
Analog0.3 mm0.25 mm0.6 / 0.3A?, A??, AUDIO_*

HighCurrent is the one that matters. The cell delivers over an amp at low state of charge and takes 1.29 A back while charging, and SW carries the boost's switching current — 1.51 A peak at worst case. Those are not signal nets.

Name the nets to match the patterns. A net called BAT+ will land in Default and be routed at 0.25 mm, which is how a board gets warm.

Local labels are sheet-qualified, and that defeats a bare pattern. A power symbol makes a global net called VBAT; a local label on the power sheet makes a net called /power/SW. The pattern SW does not match /power/SW, so the boost switching node — 1.51 A peak — would have silently fallen into Default. The pattern is therefore /power/SW, spelled out. Any future HighCurrent or Analog net carried on a local label needs the same treatment; global labels and power symbols do not.

Design rules

Set conservatively against JLCPCB's capabilities rather than at them: 0.2 mm minimum track and clearance, 0.5 mm minimum via with a 0.3 mm hole. JLC will accept finer, but a first spin is not the place to spend that margin.

Two layers, 1.6 mm, 150 × 90 mm. See ADR 0008. The old "neither edge past 100 mm" rule is retired — it was a proxy for a price nobody had checked, and checking it showed the increase is small. The 90 mm axis is unchanged because it is the one proven against the BUD.

Before capture

Work down ../../docs/capture-checklist.md. The parts of it that gate everything else:

  • ADR 0006 says draw from the TI datasheets. No Adafruit schematic is opened during this work — deriving cannot be undone afterwards.
  • The pin map is frozen. docs/pinmap.md is generated from docs/pins.yaml, and the schematic is a consumer of it, not a second opinion. Label Seed nets with pin names (A7, D11), not with what they happen to do on one instrument.
  • Three measurements still outstanding — the handset capsule, the switch lamp current, and the mechanical parts that set panel standoff height. The first gates the audio sheet; the third gates any footprint placement.

Values are in docs/values.md, part numbers and footprints in docs/sourcing.md. Several absonus footprints are reusable as-is, which turns a chunk of this into transcription.

Footprints — checked against the stock libraries

Every footprint named in sourcing.md resolves in KiCad 9's stock libraries, including the four JST XH ones that were assumed by naming convention rather than verified. Two need a project-local variant, and both are already built.

caryatid:BQ24074RGT_QFN-16-1EP_3x3mm_P0.5mm — because none of the five stock QFN-16 3×3 footprints put any paste on the exposed pad; every one is F.Cu/F.Mask only. Derived from EP1.7x1.7mm_ThermalVias with a 2×2 aperture array at 72% coverage. EP is 1.68 ±0.07 per SLUS810N drawing 4222419/E, so 1.7 is inside tolerance.

Thermal vias are 0.3 mm drill on 0.55 mm pads at ±0.5 mm. TI's drawing calls for Ø0.2 mm, which is below JLC's 0.3 mm minimum hole; and at TI's ±0.6 position a 0.55 mm pad leaves only 0.176 mm to the signal pads. Moving them inboard to ±0.5 gives 0.289 mm and satisfies both.

The exposed pad is 1.68 mm, TI's nominal. It was briefly 1.70 — inherited from the stock footprint that had a ThermalVias sibling — which lands exactly on the 0.2 mm clearance boundary and fails on rounding.

Two caveats worth carrying into layout and into the order:

  • The four thermal vias sit under the paste apertures and must be tented. On a 1.68 mm pad the vias and the apertures both want the corners; making them disjoint drops coverage to 45%. This is a via setting, not a footprint fix.
  • The only package drawing in the datasheet is RGT0016C, while Table 7-1 lists the '74 as RGT0016B. TI did not publish the B drawing. If the two differ, the EP dimension is what changes.

caryatid:DaisySeed_Socket_A_1x20 / _B_1x20 — two 1×20 socket rows so the BOM asks for two sockets from the schematic. They carry the module outline, pin-1 dot, square pads at the USB end of both rows and the USB legend, split on the centreline so wrong spacing shows as a broken outline. Per-pin labels were drawn and dropped — see docs/seed-sheet.md.

Silkscreen: JLCPCB's numbers

Absolute minimumRecommended
Character height0.8 mm≥ 1.0 mm
Line width0.15 mm≥ 0.2 mm
Pad-to-silk clearance—≥ 0.25 mm

Two project rules were looser than that and have been tightened: min_text_thickness 0.08 → 0.15, and min_silk_clearance 0 → 0.25, which was disabled entirely. min_text_height was already correct at 0.8.

Expect the silk-overlap count to rise after that change. It is not a regression — the rule was previously not checking.

BT1 is settled and needs no project-local work: MPD BH-18650-PC, C5339083, on stock Battery:BatteryHolder_MPD_BH-18650-PC, whose pads match the drawing exactly (72.90 mm terminals, 55.61 mm mounting holes). It is rated for protected cells, which was the open question. The Keystone 1042 was rejected — 87.9 mm of courtyard against the MPD's 79.2 mm.

Parts

135
QtyValueFootprintReferences
161kResistor_SMD:R_0603_1608MetricR9, R10, R13, R18, R19, R20, R21, R22, R23, R24, R25, R26, R47, R49, R58, R62
10100nCapacitor_SMD:C_0603_1608MetricC10, C11, C12, C13, C14, C15, C16, C17, C18, C30
1010uCapacitor_SMD:C_0805_2012MetricC2, C3, C4, C5, C22, C24, C25, C26, C28, C29
9100kResistor_SMD:R_0603_1608MetricR6, R11, R12, R55, R56, R57, R59, R60, R61
810kResistor_SMD:R_0603_1608MetricR1, R34, R35, R36, R37, R38, R39, R46
7100RResistor_SMD:R_0603_1608MetricR27, R28, R29, R30, R31, R32, R33
410k 0.1%Resistor_SMD:R_0603_1608MetricR14, R15, R16, R17
4MountingHole_3.2mm_M3MountingHole:MountingHole_3.2mm_M3H1, H2, H3, H4
30RResistor_SMD:R_0603_1608MetricR5, R63, R65
31uCapacitor_SMD:C_0603_1608MetricC21, C23, C27
3Fiducial_1mm_Mask2mmFiducial:Fiducial_1mm_Mask2mmFID1, FID2, FID3
210nCapacitor_SMD:C_0603_1608MetricC8, C9
2220RResistor_SMD:R_0603_1608MetricR52, R54
2220nCapacitor_SMD:C_0603_1608MetricC19, C20
22k2Resistor_SMD:R_0603_1608MetricR51, R53
2300Resistor_SMD:R_0603_1608MetricR41, R42
2392RResistor_SMD:R_0603_1608MetricR67, R68
24k7Resistor_SMD:R_0603_1608MetricR43, R44
1100uCapacitor_SMD:CP_Elec_6.3x5.4C7
110u/25VCapacitor_SMD:C_0805_2012MetricC1
118650 protectedBattery:BatteryHolder_MPD_BH-18650-PCBT1
11k2Resistor_SMD:R_0603_1608MetricR2
11uH 4.2AInductor_SMD:L_Vishay_IFSC-1515AH_4x4x1.8mmL1
11x20 socketcaryatid:DaisySeed_Socket_A_1x20A1
11x20 socketcaryatid:DaisySeed_Socket_B_1x20A2
122uCapacitor_SMD:C_0805_2012MetricC6
1348k 1%Resistor_SMD:R_0603_1608MetricR7
13kResistor_SMD:R_0603_1608MetricR45
146k4Resistor_SMD:R_0603_1608MetricR4
147k5 1%Resistor_SMD:R_0603_1608MetricR8
1510Resistor_SMD:R_0603_1608MetricR40
174HC14Package_SO:SOIC-14_3.9x8.7mm_P1.27mmU3
1887R 1%Resistor_SMD:R_0603_1608MetricR3
1Analogue busConnector_IDC:IDC-Header_2x05_P2.54mm_VerticalJ5
1Audio in L/R/rtnConnector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_VerticalJ18
1Audio out L/R/GConnector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_VerticalJ17
1BQ24074RGTcaryatid:BQ24074RGT_QFN-16-1EP_3x3mm_P0.5mmU1
1Charge LEDsConnector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_VerticalJ4
1Comms A - QwiicConnector_JST:JST_SH_SM04B-SRSS-TB_1x04-1MP_P1.00mm_HorizontalJ13
1Comms A - moduleConnector_JST:JST_XH_B6B-XH-A_1x06_P2.50mm_VerticalJ19
1Comms B - moduleConnector_JST:JST_XH_B6B-XH-A_1x06_P2.50mm_VerticalJ15
1DC inConnector_JST:JST_XH_B2B-XH-A_1x02_P2.50mm_VerticalJ1
1Digital busConnector_IDC:IDC-Header_2x05_P2.54mm_VerticalJ11
1Expansion / SPI1Connector_PinHeader_2.54mm:PinHeader_2x04_P2.54mm_VerticalJ16
1FB >=1AInductor_SMD:L_0805_2012MetricFB1
1FSRConnector_JST:JST_XH_B2B-XH-A_1x02_P2.50mm_VerticalJ10
1Latch switchConnector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_VerticalJ3
1MCP6002Package_SO:SOIC-8_3.9x4.9mm_P1.27mmU4
1Mic bias returnConnector_JST:JST_XH_B2B-XH-A_1x02_P2.50mm_VerticalJ14
1Mic bias select LConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJP1
1Mic bias select RConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJP4
1Mic gain select LConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJP3
1Mic gain select RConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJP6
1Mic path select LConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJP2
1Mic path select RConnector_PinHeader_2.54mm:PinHeader_1x03_P2.54mm_VerticalJP5
1RGB statusConnector_JST:JST_XH_B4B-XH-A_1x04_P2.50mm_VerticalJ12
1SS34Diode_SMD:D_SMAD1
1SW1 switchConnector_JST:JST_XH_B2B-XH-A_1x02_P2.50mm_VerticalJ6
1SW2 switchConnector_JST:JST_XH_B2B-XH-A_1x02_P2.50mm_VerticalJ7
1SW3 switchConnector_JST:JST_XH_B2B-XH-A_1x02_P2.50mm_VerticalJ8
1Soft potConnector_JST:JST_XH_B3B-XH-A_1x03_P2.50mm_VerticalJ9
1TPS61023DRLPackage_TO_SOT_SMD:SOT-563U2

Questions

How big is the Caryatid PCB?

It measures 150 × 90 mm and has 2 copper layers, 1.6 mm thick.

What parts does the Caryatid use?

135 parts, built around the MCP6002-I/P, TPS61023DRL, 74HC14 and BQ24074RGTR. 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 Caryatid KiCad files?

From the ideocentric/caryatid repository on GitHub, at the commit this page was made from: the board is hardware/pcb/caryatid.kicad_pcb and its schematic hardware/pcb/audio.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Caryatid design in my own project?

Its repository publishes it under the CERN-OHL-S-2.0 licence: you may reuse it on that licence's terms (keep the author's notice, and for a copyleft licence share your changes alike).

Similar boards

  • 2 layers84 × 78 mmFabricate Wireless Macropad, the printed circuit board in 3D

    Fabricate Wireless Macropad

    Catsarepro21/hackpad_v2

    Wireless ESP32-S3 macropad: KiCad PCB, case STEP models, and Gerber/drill fabrication files.

    78 parts
  • 2 layers90 × 99.9 mmHF PA v10, the printed circuit board in 3D

    HF PA v10

    kholia/Global-Communications-Transceiver

    Open-source files for Global Communications Transceiver

    102 parts6GPL-3.0
  • 4 layers130 × 64.3 mmTspico v3, the printed circuit board in 3D

    Tspico v3

    timex-sinclair-projects/tspico-hardware

    Status 2026-10-19: prototype 3 (v3.0-proto3, changes below). Proto1 (v3.0-proto1) was built and brought up; proto2 added its fixes (below).

    156 partsCERN-OHL-S-2.0
  • 2 layers79.2 × 68.8 mmEnvironment slave, the printed circuit board in 3D

    Environment slave

    pcbcupid/Lora-Wireless-Sensor-Network

    A wireless sensor network based on Lora and esp32C3. This repo will help you build a complete product from scratch to finish!

    72 parts30MIT
  • 2 layers42.4 × 94 mmSoWeSta, the printed circuit board in 3D

    SoWeSta

    wir-mo/SoWeSta

    Solar powered Weather Station using an ESP32-C3

    106 parts7
  • 2 layers94.5 × 64 mmAir monitor, the printed circuit board in 3D

    Air monitor

    kaushalch1/air-monitor

    this is a portable air quality monitoring device designed to measure particulate matter and environmental conditions in real time.

    42 parts
  • 2 layers105 × 98.1 mmLimbo main, the printed circuit board in 3D

    Limbo main

    madmecodes/pcb-limbo-test

    Limbo ESP32-S3 single-PCB and two-PCB prototype designs

    59 parts