arnavk-09/climate-sensor-node

A power management and connectivity module featuring a USB-C port, a low-noise voltage regulator, a Wi-Fi/Bluetooth microcontroller (ESP32-C3-MINI), temperature/humidity sensor (SHT40), status LED, reset and mode pushbuttons, and associated passive components integrated onto a multilayer PCB with test points, vias, and custom silkscreen artwork.

Version
1.1.0
License
unset
Stars
1

index.circuit.tsx

PCBPCB preview for index.circuit.tsx
SchematicSchematic preview for index.circuit.tsx
import { ESP32_C3_MINI_1_N4 } from "./imports/ESP32_C3_MINI_1_N4"
import { SHT40_AD1B_R3 } from "./imports/SHT40_AD1B_R3"
import { AP2112K_3_3TRG1 } from "./imports/AP2112K_3_3TRG1"
import { TYPE_C_16PIN_2MD_073_ } from "./imports/TYPE_C_16PIN_2MD_073_"
import { LTST_C190KGKT } from "./imports/LTST_C190KGKT"
import { TS665CJ } from "./imports/TS665CJ"

// User-supplied artwork vectorized from the transparent PNG for top silkscreen.
const userArtworkPaths = [
  [
    { x: -5.211, y: 2.437 },
    { x: -5.347, y: 1.977 },
    { x: -6.446, y: 1.944 },
    { x: -6.599, y: 1.501 },
    { x: -7.307, y: 1.359 },
    { x: -7.994, y: -0.938 },
    { x: -7.605, y: -1.05 },
    { x: -7.911, y: -2.126 },
    { x: -6.659, y: -2.215 },
    { x: -6.469, y: -2.456 },
    { x: 5.202, y: -2.456 },
    { x: 6.481, y: -2.456 },
    { x: 6.665, y: -2.217 },
    { x: 7.936, y: -2.149 },
    { x: 7.656, y: -1.067 },
    { x: 7.927, y: -1.008 },
    { x: 7.987, y: -0.901 },
    { x: 7.319, y: 1.402 },
    { x: 6.701, y: 1.432 },
    { x: 6.433, y: 1.938 },
    { x: 5.474, y: 1.956 },
    { x: 5.357, y: 2.03 },
    { x: 5.18, y: 2.433 },
    { x: -5.211, y: 2.437 },
  ],
  [
    { x: -5.254, y: 2.382 },
    { x: -5.391, y: 1.952 },
    { x: -6.486, y: 1.916 },
    { x: -6.613, y: 1.455 },
    { x: -7.24, y: 1.433 },
    { x: -7.33, y: 1.333 },
    { x: -7.996, y: -0.927 },
    { x: -7.93, y: -1.016 },
    { x: -7.617, y: -1.036 },
    { x: -7.906, y: -2.158 },
    { x: -6.634, y: -2.241 },
    { x: -6.552, y: -2.404 },
    { x: -6.424, y: -2.448 },
    { x: 5.22, y: -2.454 },
    { x: 6.496, y: -2.454 },
    { x: 6.678, y: -2.214 },
    { x: 7.926, y: -2.164 },
    { x: 7.669, y: -1.1 },
    { x: 8, y: -0.959 },
    { x: 7.353, y: 1.305 },
    { x: 7.29, y: 1.433 },
    { x: 6.652, y: 1.424 },
    { x: 6.44, y: 1.938 },
    { x: 5.483, y: 1.944 },
    { x: 5.371, y: 2.012 },
    { x: 5.221, y: 2.44 },
    { x: -5.147, y: 2.456 },
    { x: -5.254, y: 2.382 },
  ],
  [
    { x: 5.328, y: 1.744 },
    { x: 5.606, y: 0.932 },
    { x: 5.589, y: 0.708 },
    { x: 6.324, y: -2.353 },
    { x: 6.015, y: -2.293 },
    { x: -5.653, y: -2.29 },
    { x: -6.279, y: -2.355 },
    { x: -6.281, y: -2.236 },
    { x: -5.164, y: 2.262 },
    { x: -5.066, y: 2.347 },
    { x: 5.163, y: 2.352 },
    { x: 5.328, y: 1.744 },
  ],
  [
    { x: -5.498, y: 1.789 },
    { x: -5.956, y: 0.237 },
    { x: -5.897, y: 0.706 },
    { x: -5.932, y: 0.616 },
    { x: -6.598, y: -1.69 },
    { x: -6.688, y: -1.791 },
    { x: -7.316, y: -1.912 },
    { x: -7.443, y: -1.917 },
    { x: -6.759, y: 0.783 },
    { x: -6.37, y: 1.848 },
    { x: -5.57, y: 1.858 },
    { x: -5.498, y: 1.789 },
  ],
  [
    { x: 6.48, y: 1.664 },
    { x: 6.68, y: 1.3 },
    { x: 6.747, y: 0.743 },
    { x: 7.458, y: -1.867 },
    { x: 6.628, y: -1.751 },
    { x: 6.462, y: -1.136 },
    { x: 5.905, y: 0.856 },
    { x: 5.927, y: 0.421 },
    { x: 5.548, y: 1.802 },
    { x: 6.299, y: 1.848 },
    { x: 6.436, y: 1.817 },
    { x: 6.48, y: 1.664 },
  ],
  [
    { x: 7.306, y: 1.147 },
    { x: 7.87, y: -0.812 },
    { x: 7.799, y: -0.868 },
    { x: 7.491, y: -0.806 },
    { x: 7.31, y: -0.212 },
    { x: 6.822, y: 1.34 },
    { x: 7.265, y: 1.299 },
    { x: 7.306, y: 1.147 },
  ],
  [
    { x: -6.76, y: 1.309 },
    { x: -7.413, y: -0.689 },
    { x: -7.482, y: -0.829 },
    { x: -7.796, y: -0.885 },
    { x: -7.855, y: -0.818 },
    { x: -7.218, y: 1.321 },
    { x: -6.76, y: 1.309 },
  ],
  [
    { x: 0.104, y: -2.328 },
    { x: 0.276, y: -2.347 },
    { x: -0.243, y: -2.364 },
    { x: -0.43, y: -2.349 },
    { x: 0.104, y: -2.328 },
  ],
  [
    { x: -5.038, y: 2.141 },
    { x: -5.441, y: 0.268 },
    { x: -5.401, y: -0.028 },
    { x: -5.53, y: -0.189 },
    { x: -5.965, y: -2.055 },
    { x: -5.88, y: -2.122 },
    { x: 6.028, y: -2.068 },
    { x: 5.374, y: 0.73 },
    { x: 5.224, y: 1.024 },
    { x: 5.09, y: 0.836 },
    { x: 5.673, y: -1.977 },
    { x: -1.658, y: -1.993 },
    { x: -5.621, y: -1.964 },
    { x: -4.825, y: 1.946 },
    { x: -4.735, y: 2.032 },
    { x: 4.684, y: 2.032 },
    { x: 4.826, y: 2.01 },
    { x: 5.014, y: 1.235 },
    { x: 5.256, y: 1.114 },
    { x: 5.067, y: 2.153 },
    { x: 4.959, y: 2.216 },
    { x: -4.938, y: 2.216 },
    { x: -5.038, y: 2.141 },
  ],
  [
    { x: -4.758, y: 1.845 },
    { x: -5.536, y: -1.909 },
    { x: 5.163, y: -1.904 },
    { x: 5.483, y: -1.899 },
    { x: 5.555, y: -1.819 },
    { x: 4.984, y: 0.836 },
    { x: 4.86, y: 1.074 },
    { x: 4.733, y: 1.96 },
    { x: -4.691, y: 1.96 },
    { x: -4.758, y: 1.845 },
  ],
  [
    { x: 0.123, y: 1.646 },
    { x: 0.207, y: 1.513 },
    { x: 0.14, y: 1.103 },
    { x: 0.271, y: 1.191 },
    { x: 0.391, y: 1.119 },
    { x: 0.492, y: 1.191 },
    { x: 0.486, y: 1.34 },
    { x: 0.745, y: 1.517 },
    { x: 0.612, y: 0.991 },
    { x: 0.544, y: 0.864 },
    { x: -0.247, y: 0.871 },
    { x: -0.563, y: 0.874 },
    { x: -0.758, y: 1.471 },
    { x: -0.566, y: 1.418 },
    { x: -0.45, y: 1.17 },
    { x: -0.215, y: 1.151 },
    { x: -0.112, y: 1.178 },
    { x: -0.217, y: 1.448 },
    { x: -0.062, y: 1.723 },
    { x: 0.036, y: 1.778 },
    { x: 0.123, y: 1.646 },
  ],
  [
    { x: 0.576, y: 0.774 },
    { x: 0.473, y: 0.702 },
    { x: -0.552, y: 0.726 },
    { x: -0.456, y: 0.788 },
    { x: 0.576, y: 0.774 },
  ],
  [
    { x: -3.131, y: 0.454 },
    { x: -2.92, y: 0.242 },
    { x: -2.959, y: -0.06 },
    { x: -3.217, y: -0.218 },
    { x: -3.529, y: -0.232 },
    { x: -3.663, y: -0.568 },
    { x: -3.819, y: -0.568 },
    { x: -3.913, y: 0.464 },
    { x: -3.131, y: 0.454 },
  ],
  [
    { x: -1.963, y: 0.454 },
    { x: -1.749, y: 0.247 },
    { x: -1.779, y: -0.051 },
    { x: -1.89, y: -0.158 },
    { x: -1.687, y: -0.541 },
    { x: -1.977, y: -0.567 },
    { x: -2.25, y: -0.233 },
    { x: -2.405, y: -0.232 },
    { x: -2.432, y: -0.36 },
    { x: -2.432, y: -0.515 },
    { x: -2.689, y: -0.568 },
    { x: -2.738, y: 0.466 },
    { x: -1.963, y: 0.454 },
  ],
  [
    { x: -0.643, y: 0.366 },
    { x: -0.699, y: 0.261 },
    { x: -1.17, y: 0.265 },
    { x: -1.246, y: 0.188 },
    { x: -1.218, y: 0.052 },
    { x: -0.811, y: -0.021 },
    { x: -0.845, y: -0.152 },
    { x: -1.248, y: -0.22 },
    { x: -1.215, y: -0.344 },
    { x: -0.624, y: -0.381 },
    { x: -0.624, y: -0.538 },
    { x: -1.52, y: -0.551 },
    { x: -1.543, y: 0.39 },
    { x: -1.475, y: 0.469 },
    { x: -0.69, y: 0.472 },
    { x: -0.643, y: 0.366 },
  ],
  [
    { x: -0.016, y: 0.264 },
    { x: 0.15, y: -0.006 },
    { x: 0.483, y: 0.464 },
    { x: 0.768, y: 0.444 },
    { x: 0.764, y: -0.508 },
    { x: 0.506, y: -0.565 },
    { x: 0.502, y: 0.058 },
    { x: 0.368, y: -0.098 },
    { x: 0.194, y: -0.364 },
    { x: 0.094, y: -0.331 },
    { x: -0.157, y: 0.073 },
    { x: -0.162, y: -0.529 },
    { x: -0.431, y: -0.545 },
    { x: -0.45, y: 0.407 },
    { x: -0.221, y: 0.466 },
    { x: -0.016, y: 0.264 },
  ],
  [
    { x: 1.312, y: -0.051 },
    { x: 1.312, y: -0.524 },
    { x: 1.049, y: -0.576 },
    { x: 1.035, y: 0.047 },
    { x: 1.048, y: 0.47 },
    { x: 1.205, y: 0.472 },
    { x: 1.312, y: 0.421 },
    { x: 1.312, y: -0.051 },
  ],
  [
    { x: 2.432, y: 0.365 },
    { x: 2.382, y: 0.257 },
    { x: 1.905, y: 0.265 },
    { x: 1.875, y: 0.048 },
    { x: 2.283, y: -0.023 },
    { x: 2.26, y: -0.152 },
    { x: 1.84, y: -0.209 },
    { x: 1.864, y: -0.344 },
    { x: 2.464, y: -0.379 },
    { x: 2.464, y: -0.538 },
    { x: 1.552, y: -0.557 },
    { x: 1.586, y: 0.469 },
    { x: 2.38, y: 0.472 },
    { x: 2.432, y: 0.365 },
  ],
  [
    { x: 3.504, y: 0.424 },
    { x: 3.658, y: 0.168 },
    { x: 3.495, y: -0.219 },
    { x: 3.656, y: -0.575 },
    { x: 3.368, y: -0.51 },
    { x: 3.204, y: -0.246 },
    { x: 2.96, y: -0.289 },
    { x: 2.964, y: -0.445 },
    { x: 2.936, y: -0.568 },
    { x: 2.689, y: -0.503 },
    { x: 2.648, y: 0.424 },
    { x: 3.504, y: 0.424 },
  ],
  [
    { x: 0.032, y: -0.952 },
    { x: 0.107, y: -1.091 },
    { x: 0.412, y: -1.118 },
    { x: 0.199, y: -1.381 },
    { x: 0.251, y: -1.53 },
    { x: -0.074, y: -1.475 },
    { x: -0.202, y: -1.569 },
    { x: -0.165, y: -1.383 },
    { x: -0.352, y: -1.169 },
    { x: 0.032, y: -0.952 },
  ],
  [
    { x: -0.592, y: -1.142 },
    { x: -0.864, y: -1.218 },
    { x: -4.38, y: -1.221 },
    { x: -5.019, y: -1.215 },
    { x: -5.059, y: -1.122 },
    { x: -0.592, y: -1.142 },
  ],
  [
    { x: 5.126, y: -1.163 },
    { x: 3.275, y: -1.225 },
    { x: 0.726, y: -1.229 },
    { x: 0.603, y: -1.171 },
    { x: 1.983, y: -1.113 },
    { x: 5.126, y: -1.163 },
  ],
  [
    { x: -3.6, y: 0.128 },
    { x: -3.577, y: -0.008 },
    { x: -3.261, y: 0.006 },
    { x: -3.184, y: 0.128 },
    { x: -3.261, y: 0.25 },
    { x: -3.498, y: 0.264 },
    { x: -3.577, y: 0.264 },
    { x: -3.6, y: 0.128 },
  ],
  [
    { x: -2.432, y: 0.128 },
    { x: -2.408, y: -0.008 },
    { x: -2.327, y: -0.008 },
    { x: -2.088, y: 0.012 },
    { x: -2.001, y: 0.129 },
    { x: -2.088, y: 0.25 },
    { x: -2.408, y: 0.264 },
    { x: -2.432, y: 0.128 },
  ],
  [
    { x: 2.96, y: 0.126 },
    { x: 2.981, y: -0.01 },
    { x: 3.297, y: 0.011 },
    { x: 3.376, y: 0.13 },
    { x: 3.297, y: 0.25 },
    { x: 2.981, y: 0.264 },
    { x: 2.96, y: 0.126 },
  ],
  [
    { x: -5.062, y: -1.168 },
    { x: -4.229, y: -1.16 },
    { x: -5.062, y: -1.168 },
  ],
]

/**
 * USB-C powered indoor temperature/humidity node.
 *
 * ESP32-C3-MINI-1 provides 2.4 GHz Wi-Fi and Bluetooth LE. The SHT40 is
 * placed on a thermally isolated tongue, away from the regulator and radio.
 * USB D+/D- are available for firmware loading and protected by U3.
 */
export default () => (
  <board width="48mm" height="42mm" layers={2} routingDisabled={false}>
    <schematicsection name="USB" displayName="USB-C Input & Protection" />
    <schematicsection name="Power" displayName="3.3 V Power" />
    <schematicsection name="MCU" displayName="Wi-Fi / Bluetooth MCU" />
    <schematicsection name="Sensor" displayName="Temperature & Humidity" />
    <schematicsection name="UI" displayName="Controls & Status" />

    {/* Exact, stocked mid-mount USB-C receptacle: JLCPCB C2765186. */}
    <TYPE_C_16PIN_2MD_073_
      name="J1" schSheetName="POWER"
      pinAttributes={{ A4B9: { requiresPower: true }, B4A9: { requiresPower: true }, A1B12: { requiresGround: true }, B1A12: { requiresGround: true }, A8: { doNotConnect: true }, B8: { doNotConnect: true } } as any}
      allowOffBoard
      pcbX={0}
      pcbY={-17.2}
      schX={-12}
      schY={0}
      schSectionName="USB"
    />
    <resistor name="R1" schSheetName="POWER" resistance="5.1k" manufacturerPartNumber="RC0603FR-075K1L" footprint="0603" pcbX={-5} pcbY={-13.5} schX={-9} schY={2} schSectionName="USB" />
    <resistor name="R2" schSheetName="POWER" resistance="5.1k" manufacturerPartNumber="RC0603FR-075K1L" footprint="0603" pcbX={5} pcbY={-13.5} schX={-9} schY={-2} schSectionName="USB" />
    <fuse name="F1" schSheetName="POWER" currentRating="500mA" voltageRating="12V" manufacturerPartNumber="BSMD0603-050-12V" supplierPartNumbers={{ jlcpcb: ["C2844464"] }} footprint="0603" pcbX={-8} pcbY={-14.5} schX={-6} schY={4} schSectionName="USB" />
    <diode name="D1" schSheetName="POWER" manufacturerPartNumber="SMF5.0A" supplierPartNumbers={{ jlcpcb: ["C284108"] }} footprint="sod123" pcbX={-15} pcbY={-11.5} pcbRotation={90} schX={-6} schY={-2} schSectionName="USB" />
    <chip
      name="U3" schSheetName="POWER"
      manufacturerPartNumber="USBLC6-2SC6"
      supplierPartNumbers={{ jlcpcb: ["C7519"] }}
      footprint="sot23_6"
      pinLabels={{ pin1: "DP_IN", pin2: "GND", pin3: "DM_IN", pin4: "DM_OUT", pin5: "VBUS", pin6: "DP_OUT" }}
      pinAttributes={{ VBUS: { requiresPower: true }, GND: { requiresGround: true } }}
      pcbX={0}
      pcbY={-12.2}
      schX={-3}
      schY={0}
      schSectionName="USB"
    />

    {/* Low-noise 3.3 V rail with local bulk and high-frequency bypassing. */}
    <AP2112K_3_3TRG1 name="U2" schSheetName="POWER" pinAttributes={{ VIN: { requiresPower: true }, GND: { requiresGround: true }, VOUT: { providesPower: true }, NC: { doNotConnect: true } } as any} pcbX={-8} pcbY={-7.5} schX={4} schY={0} schHeight="0.6mm" schSectionName="Power" />
    <capacitor name="C1" schSheetName="POWER" capacitance="10uF" manufacturerPartNumber="GRM21BR61A106KE19L" footprint="0805" pcbX={-11.8} pcbY={-7.5} schX={1} schY={2} schOrientation="vertical" schSectionName="Power" />
    <capacitor name="C2" schSheetName="POWER" capacitance="100nF" manufacturerPartNumber="GRM188R71H104KA93D" footprint="0603" pcbX={-10.5} pcbY={-10.5} schX={4} schY={3} schOrientation="vertical" schSectionName="Power" />
    <capacitor name="C3" schSheetName="POWER" capacitance="10uF" manufacturerPartNumber="GRM21BR61A106KE19L" footprint="0805" pcbX={-4.2} pcbY={-7.5} schX={7} schY={2} schOrientation="vertical" schSectionName="Power" />
    <capacitor name="C4" schSheetName="POWER" capacitance="100nF" manufacturerPartNumber="GRM188R71H104KA93D" footprint="0603" pcbX={-4.2} pcbY={-10.5} schX={7} schY={-2} schOrientation="vertical" schSectionName="Power" />

    {/* Module antenna faces the clear top board edge. */}
    <ESP32_C3_MINI_1_N4 name="U1" schSheetName="CONTROLLER" pinAttributes={{ "3V3": { requiresPower: true }, GND1: { requiresGround: true } } as any} pcbX={6} pcbY={6} schX={0} schY={0} schHeight="6.2mm" schSectionName="MCU" />
    <capacitor name="C5" schSheetName="CONTROLLER" capacitance="10uF" manufacturerPartNumber="GRM21BR61A106KE19L" footprint="0805" pcbX={-4} pcbY={8.5} schX={-5} schY={3} schOrientation="vertical" schSectionName="MCU" />
    <capacitor name="C6" schSheetName="CONTROLLER" capacitance="100nF" manufacturerPartNumber="GRM188R71H104KA93D" footprint="0603" pcbX={-4} pcbY={6} schX={-5} schY={-2} schOrientation="vertical" schSectionName="MCU" />
    <resistor name="R8" schSheetName="POWER" resistance="22" manufacturerPartNumber="RC0603FR-0722RL" footprint="0603" pcbX={11.5} pcbY={-1} schX={0} schY={-5} schSectionName="USB" />
    <resistor name="R9" schSheetName="POWER" resistance="22" manufacturerPartNumber="RC0603FR-0722RL" footprint="0603" pcbX={14.5} pcbY={-1} schX={0} schY={-7} schSectionName="USB" />

    {/* Sensor sits on a vented/thermally isolated corner tongue. */}
    <SHT40_AD1B_R3 name="U4" schSheetName="SENSOR" pinAttributes={{ VDD: { requiresPower: true }, VSS: { requiresGround: true }, SDA: { capabilities: ["i2c_sda"] }, SCL: { capabilities: ["i2c_scl"] } } as any} pcbX={-18} pcbY={14} schX={0} schY={0} schHeight="0.6mm" schSectionName="Sensor" />
    <capacitor name="C7" schSheetName="SENSOR" capacitance="100nF" manufacturerPartNumber="GRM188R71H104KA93D" footprint="0603" pcbX={-14.5} pcbY={14} schX={-4} schY={-2} schOrientation="vertical" schSectionName="Sensor" />
    <resistor name="R3" schSheetName="SENSOR" resistance="4.7k" manufacturerPartNumber="RC0603FR-074K7L" footprint="0603" pcbX={-17.5} pcbY={9.5} schX={4} schY={2} schSectionName="Sensor" />
    <resistor name="R4" schSheetName="SENSOR" resistance="4.7k" manufacturerPartNumber="RC0603FR-074K7L" footprint="0603" pcbX={-14.5} pcbY={9.5} schX={4} schY={-2} schSectionName="Sensor" />
    <cutout name="THERMAL_SLOT_BOTTOM" shape="rect" width="11mm" height="0.8mm" pcbX={-18} pcbY={11.5} />
    <cutout name="THERMAL_SLOT_RIGHT" shape="rect" width="0.8mm" height="6mm" pcbX={-12} pcbY={15} />
    <cutout name="THERMAL_SLOT_NECK" shape="rect" width="2mm" height="0.8mm" pcbX={-12.5} pcbY={11.5} />

    {/* Reset, firmware-boot/pairing control and an active-low status LED. */}
    <resistor name="R5" schSheetName="CONTROLLER" resistance="10k" manufacturerPartNumber="RC0603FR-0710KL" footprint="0603" pcbX={19} pcbY={-3} schX={6} schY={3} schSectionName="UI" />
    <capacitor name="C8" schSheetName="CONTROLLER" capacitance="1uF" manufacturerPartNumber="GRM188R61A105KA61D" footprint="0603" pcbX={12} pcbY={-5} schX={10} schY={3} schOrientation="vertical" schSectionName="UI" />
    <TS665CJ name="SW1" schSheetName="CONTROLLER" internallyConnectedPins={[["pin1", "pin3"], ["pin2", "pin4"]]} pcbX={18.5} pcbY={5} schX={6} schY={0} schSectionName="UI" />
    <resistor name="R6" schSheetName="CONTROLLER" resistance="10k" manufacturerPartNumber="RC0603FR-0710KL" footprint="0603" pcbX={16} pcbY={-4} schX={6} schY={-3} schSectionName="UI" />
    <TS665CJ name="SW2" schSheetName="CONTROLLER" internallyConnectedPins={[["pin1", "pin3"], ["pin2", "pin4"]]} pcbX={18.5} pcbY={-10} schX={10} schY={-3} schSectionName="UI" />
    <resistor name="R7" schSheetName="CONTROLLER" resistance="1k" manufacturerPartNumber="RC0603FR-071KL" footprint="0603" pcbX={8} pcbY={-12} schX={12} schY={2} schSectionName="UI" />
    <LTST_C190KGKT name="LED1" schSheetName="CONTROLLER" color="green" pcbX={11} pcbY={-12} schX={15} schY={2} schRotation={180} schSectionName="UI" />

    {/* Configurable USB shield bond: R10 is the default direct bond; C9/R11 permit an RC option. */}
    <resistor name="R10" schSheetName="POWER" resistance="0" manufacturerPartNumber="RC0603JR-070RL" footprint="0603" pcbX={9} pcbY={-15.5} schX={-9} schY={-5} schSectionName="USB" />
    <capacitor name="C9" schSheetName="POWER" capacitance="1nF" manufacturerPartNumber="GRM1885C1H102JA01D" footprint="0603" pcbX={12} pcbY={-16.5} schX={-6} schY={-6} schOrientation="vertical" schSectionName="USB" />
    <resistor name="R11" schSheetName="POWER" resistance="1M" manufacturerPartNumber="RC0603FR-071ML" footprint="0603" pcbX={12} pcbY={-14.5} schX={-6} schY={-4} schSectionName="USB" />

    {/* Four-point mounting, assembly fiducials and labeled production test access. */}
    <hole name="H1" diameter="2.7mm" pcbX={-21} pcbY={-16} />
    <hole name="H2" diameter="2.7mm" pcbX={21} pcbY={-16} />
    <hole name="H3" diameter="2.7mm" pcbX={-21} pcbY={16} />
    <hole name="H4" diameter="2.7mm" pcbX={21} pcbY={16} />
    <fiducial name="FID1" padDiameter="1mm" soldermaskPullback="1mm" pcbX={-18} pcbY={-16.5} />
    <fiducial name="FID2" padDiameter="1mm" soldermaskPullback="1mm" pcbX={18} pcbY={-16.5} />
    <fiducial name="FID3" padDiameter="1mm" soldermaskPullback="1mm" pcbX={21} pcbY={12.5} />

    <testpoint name="TP1" schSheetName="POWER" footprintVariant="pad" padShape="circle" padDiameter="1.2mm" pcbX={-18} pcbY={-13.5} schX={-4} schY={7} schSectionName="Power" />
    <testpoint name="TP2" schSheetName="POWER" footprintVariant="pad" padShape="circle" padDiameter="1.2mm" pcbX={-16.5} pcbY={-15.8} schX={-1} schY={7} schSectionName="Power" />
    <testpoint name="TP3" schSheetName="POWER" footprintVariant="pad" padShape="circle" padDiameter="1.2mm" pcbX={-13} pcbY={-13.5} schX={2} schY={7} schSectionName="Power" />
    <testpoint name="TP4" schSheetName="POWER" footprintVariant="pad" padShape="circle" padDiameter="1.2mm" pcbX={-18} pcbY={-10.5} schX={5} schY={7} schSectionName="Power" />
    <testpoint name="TP5" schSheetName="CONTROLLER" footprintVariant="pad" padShape="circle" padDiameter="1.2mm" pcbX={-2} pcbY={-4.5} schX={4} schY={7} schSectionName="UI" />
    <testpoint name="TP6" schSheetName="CONTROLLER" footprintVariant="pad" padShape="circle" padDiameter="1.2mm" pcbX={1} pcbY={-4.5} schX={7} schY={7} schSectionName="UI" />
    <testpoint name="TP7" schSheetName="SENSOR" footprintVariant="pad" padShape="circle" padDiameter="1.2mm" pcbX={-18} pcbY={6.5} schX={-1} schY={5} schSectionName="Sensor" />
    <testpoint name="TP8" schSheetName="SENSOR" footprintVariant="pad" padShape="circle" padDiameter="1.2mm" pcbX={-15} pcbY={6.5} schX={2} schY={5} schSectionName="Sensor" />
    <testpoint name="TP9" schSheetName="CONTROLLER" footprintVariant="pad" padShape="circle" padDiameter="1.2mm" pcbX={4} pcbY={-4.5} schX={-1} schY={5} schSectionName="MCU" />
    <testpoint name="TP10" schSheetName="CONTROLLER" footprintVariant="pad" padShape="circle" padDiameter="1.2mm" pcbX={7} pcbY={-4.5} schX={2} schY={5} schSectionName="MCU" />

    {/* ESP32-C3 antenna keepout on both copper layers. */}
    <keepout shape="rect" pcbX={6} pcbY={15.2} width="14mm" height="7.4mm" layer="top" />
    <keepout shape="rect" pcbX={6} pcbY={15.2} width="14mm" height="7.4mm" layer="bottom" />

    {/* Ground planes and stitching vias; no vias are placed in the antenna or sensor tongue. */}
    <copperpour name="GND_PLANE_TOP" connectsTo="net.GND" layer="top" clearance="0.2mm" boardEdgeMargin="0.4mm" cutoutMargin="0.4mm" />
    <copperpour name="GND_PLANE_BOTTOM" connectsTo="net.GND" layer="bottom" clearance="0.2mm" boardEdgeMargin="0.4mm" cutoutMargin="0.4mm" />
    <via name="VB1" connectsTo="net.GND" fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.65mm" pcbX={-18} pcbY={-15.5} />
    <via name="VB2" connectsTo="net.GND" fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.65mm" pcbX={-12} pcbY={-15.5} />
    <via name="VB3" connectsTo="net.GND" fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.65mm" pcbX={-6} pcbY={-15.5} />
    <via name="VB5" connectsTo="net.GND" fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.65mm" pcbX={12} pcbY={-15.5} />
    <via name="VB6" connectsTo="net.GND" fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.65mm" pcbX={18} pcbY={-15.5} />
    <via name="VM1" connectsTo="net.GND" fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.65mm" pcbX={-2} pcbY={9.5} />
    <via name="VM2" connectsTo="net.GND" fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.65mm" pcbX={2} pcbY={9.5} />
    <via name="VM3" connectsTo="net.GND" fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.65mm" pcbX={10} pcbY={9.5} />
    <via name="VM4" connectsTo="net.GND" fromLayer="top" toLayer="bottom" holeDiameter="0.3mm" outerDiameter="0.65mm" pcbX={14} pcbY={9.5} />

    {/* User-provided image, vectorized as a component footprint for 3D visibility. */}
    <chip
      name="U5"
      noSchematicRepresentation
      pcbX={-12}
      pcbY={0}
      footprint={
        <footprint>
          <silkscreenpath layer="top" strokeWidth="0.24mm" route={userArtworkPaths[0]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[1]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[2]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[3]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[4]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[5]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[6]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[7]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[8]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[9]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[10]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[11]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[12]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[13]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[14]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[15]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[16]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[17]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[18]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[19]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[20]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[21]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[22]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[23]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[24]} />
          <silkscreenpath layer="top" strokeWidth="0.16mm" route={userArtworkPaths[25]} />
        </footprint>
      }
    />

    <silkscreentext text="CLIMATE NODE REV B" pcbX={-7} pcbY={16.5} fontSize="1mm" />
    <silkscreentext text="5V USB-C" pcbX={0} pcbY={-15.5} fontSize="0.7mm" />
    <silkscreentext text="RESET" pcbX={19} pcbY={10} fontSize="0.7mm" />
    <silkscreentext text="PAIR" pcbX={19} pcbY={-5} fontSize="0.7mm" />
    <silkscreentext text="TP: RAW 5V 3V3 GND" pcbX={-16} pcbY={-11.5} fontSize="0.55mm" />

    <schematicsheet name="POWER" displayName="USB-C, Protection & Power" sheetIndex={1}>
      {/* USB-C, Protection & Power connectivity. */}
      <trace name="T_J1_A5__R1_pin1" from="J1.A5" to="R1.pin1" />
      <trace name="T_R1_pin2__GND" from="R1.pin2" to="net.GND" />
      <trace name="T_J1_B5__R2_pin1" from="J1.B5" to="R2.pin1" />
      <trace name="T_R2_pin2__GND" from="R2.pin2" to="net.GND" />
      <trace name="T_J1_A4B9__VBUS_RAW" from="J1.A4B9" to="net.VBUS_RAW" width="0.6mm" />
      <trace name="T_J1_B4A9__VBUS_RAW" from="J1.B4A9" to="net.VBUS_RAW" width="0.6mm" />
      <trace name="T_VBUS_RAW__F1_pin1" from="net.VBUS_RAW" to="F1.pin1" width="0.6mm" />
      <trace name="T_F1_pin2__VBUS_5V" from="F1.pin2" to="net.VBUS_5V" width="0.6mm" />
      <trace name="T_D1_anode__GND" from="D1.anode" to="net.GND" width="0.5mm" />
      <trace name="T_D1_cathode__VBUS_5V" from="D1.cathode" to="net.VBUS_5V" width="0.5mm" />
      <trace name="T_J1_A1B12__GND" from="J1.A1B12" to="net.GND" width="0.6mm" />
      <trace name="T_J1_B1A12__GND" from="J1.B1A12" to="net.GND" width="0.6mm" />
      <trace name="T_J1_EH1__USB_SHIELD" from="J1.EH1" to="net.USB_SHIELD" />
      <trace name="T_J1_EH2__USB_SHIELD" from="J1.EH2" to="net.USB_SHIELD" />
      <trace name="T_J1_SH3__USB_SHIELD" from="J1.SHELL3" to="net.USB_SHIELD" />
      <trace name="T_J1_SH4__USB_SHIELD" from="J1.SHELL4" to="net.USB_SHIELD" />
      <trace name="T_USB_SHIELD__R10_pin1" from="net.USB_SHIELD" to="R10.pin1" />
      <trace name="T_R10_pin2__GND" from="R10.pin2" to="net.GND" />
      <trace name="T_USB_SHIELD__C9_pin1" from="net.USB_SHIELD" to="C9.pin1" />
      <trace name="T_C9_pin2__GND" from="C9.pin2" to="net.GND" />
      <trace name="T_USB_SHIELD__R11_pin1" from="net.USB_SHIELD" to="R11.pin1" />
      <trace name="T_R11_pin2__GND" from="R11.pin2" to="net.GND" />
      <trace name="T_J1_A6__USB_DP_CONN" from="J1.A6" to="net.USB_DP_CONN" />
      <trace name="T_J1_B6__USB_DP_CONN" from="J1.B6" to="net.USB_DP_CONN" />
      <trace name="T_USB_DP_CONN__U3_pin1" from="net.USB_DP_CONN" to="U3.pin1" />
      <trace name="T_U3_pin6__R9_pin1" from="U3.pin6" to="R9.pin1" />
      <trace name="T_R9_pin2__USB_DP_MCU" from="R9.pin2" to="net.USB_DP_MCU" />
      <trace name="T_J1_A7__USB_DM_CONN" from="J1.A7" to="net.USB_DM_CONN" />
      <trace name="T_J1_B7__USB_DM_CONN" from="J1.B7" to="net.USB_DM_CONN" />
      <trace name="T_USB_DM_CONN__U3_pin3" from="net.USB_DM_CONN" to="U3.pin3" />
      <trace name="T_U3_pin4__R8_pin1" from="U3.pin4" to="R8.pin1" />
      <trace name="T_R8_pin2__USB_DM_MCU" from="R8.pin2" to="net.USB_DM_MCU" />
      <trace name="T_U3_pin2__GND" from="U3.pin2" to="net.GND" />
      <trace name="T_U3_pin5__VBUS_5V" from="U3.pin5" to="net.VBUS_5V" />
      <trace name="T_U2_VIN__VBUS_5V" from="U2.VIN" to="net.VBUS_5V" width="0.5mm" />
      <trace name="T_U2_EN__VBUS_5V" from="U2.EN" to="net.VBUS_5V" />
      <trace name="T_U2_GND__GND" from="U2.GND" to="net.GND" />
      <trace name="T_U2_VOUT__V3_3" from="U2.VOUT" to="net.V3_3" width="0.5mm" />
      <trace name="T_C1_pin1__VBUS_5V" from="C1.pin1" to="net.VBUS_5V" />
      <trace name="T_C1_pin2__GND" from="C1.pin2" to="net.GND" />
      <trace name="T_C2_pin1__VBUS_5V" from="C2.pin1" to="net.VBUS_5V" />
      <trace name="T_C2_pin2__GND" from="C2.pin2" to="net.GND" />
      <trace name="T_C3_pin1__V3_3" from="C3.pin1" to="net.V3_3" />
      <trace name="T_C3_pin2__GND" from="C3.pin2" to="net.GND" />
      <trace name="T_C4_pin1__V3_3" from="C4.pin1" to="net.V3_3" />
      <trace name="T_C4_pin2__GND" from="C4.pin2" to="net.GND" />
      <trace name="T_TP1__VBUS_RAW" from="TP1.pin1" to="net.VBUS_RAW" />
      <trace name="T_TP2__VBUS_5V" from="TP2.pin1" to="net.VBUS_5V" />
      <trace name="T_TP3__V3_3" from="TP3.pin1" to="net.V3_3" />
      <trace name="T_TP4__GND" from="TP4.pin1" to="net.GND" />
    </schematicsheet>

    <schematicsheet name="CONTROLLER" displayName="ESP32-C3, USB & User Interface" sheetIndex={2}>
      {/* ESP32-C3, USB & User Interface connectivity. */}
      <trace name="T_U1_IO19__USB_DP_MCU" from="U1.IO19" to="net.USB_DP_MCU" />
      <trace name="T_U1_IO18__USB_DM_MCU" from="U1.IO18" to="net.USB_DM_MCU" />
      <trace name="T_C5_pin1__V3_3" from="C5.pin1" to="net.V3_3" />
      <trace name="T_C5_pin2__GND" from="C5.pin2" to="net.GND" />
      <trace name="T_C6_pin1__V3_3" from="C6.pin1" to="net.V3_3" />
      <trace name="T_C6_pin2__GND" from="C6.pin2" to="net.GND" />
      <trace name="T_U1_3V3__V3_3" from="U1.3V3" to="net.V3_3" width="0.4mm" />
      <trace name="T_U1_GND1__GND" from="U1.GND1" to="net.GND" />
      <trace name="T_U1_GND2__GND" from="U1.GND2" to="net.GND" />
      <trace name="T_U1_GND3__GND" from="U1.GND3" to="net.GND" />
      <trace name="T_U1_GND4__GND" from="U1.GND4" to="net.GND" />
      <trace name="T_U1_GND5__GND" from="U1.GND5" to="net.GND" />
      <trace name="T_U1_GND6__GND" from="U1.GND6" to="net.GND" />
      <trace name="T_U1_GND7__GND" from="U1.GND7" to="net.GND" />
      <trace name="T_U1_GND8__GND" from="U1.GND8" to="net.GND" />
      <trace name="T_U1_GND9__GND" from="U1.GND9" to="net.GND" />
      <trace name="T_U1_GND10__GND" from="U1.GND10" to="net.GND" />
      <trace name="T_U1_GND11__GND" from="U1.GND11" to="net.GND" />
      <trace name="T_U1_GND12__GND" from="U1.GND12" to="net.GND" />
      <trace name="T_U1_GND13__GND" from="U1.GND13" to="net.GND" />
      <trace name="T_U1_GND14__GND" from="U1.GND14" to="net.GND" />
      <trace name="T_U1_GND15__GND" from="U1.GND15" to="net.GND" />
      <trace name="T_U1_GND16__GND" from="U1.GND16" to="net.GND" />
      <trace name="T_U1_GND17__GND" from="U1.GND17" to="net.GND" />
      <trace name="T_U1_GND18__GND" from="U1.GND18" to="net.GND" />
      <trace name="T_U1_GND19__GND" from="U1.GND19" to="net.GND" />
      <trace name="T_U1_GND20__GND" from="U1.GND20" to="net.GND" />
      <trace name="T_U1_GND21__GND" from="U1.GND21" to="net.GND" />
      <trace name="T_U1_GND22__GND" from="U1.GND22" to="net.GND" />
      <trace name="T_U1_pin49_alt1__GND" from="U1.pin49_alt1" to="net.GND" />
      <trace name="T_U1_IO4__I2C_SDA" from="U1.IO4" to="net.I2C_SDA" />
      <trace name="T_U1_IO5__I2C_SCL" from="U1.IO5" to="net.I2C_SCL" />
      <trace name="T_R5_pin1__V3_3" from="R5.pin1" to="net.V3_3" />
      <trace name="T_R5_pin2__U1_EN" from="R5.pin2" to="U1.EN" />
      <trace name="T_C8_pin1__U1_EN" from="C8.pin1" to="U1.EN" />
      <trace name="T_C8_pin2__GND" from="C8.pin2" to="net.GND" />
      <trace name="T_SW1_pin1__U1_EN" from="SW1.pin1" to="U1.EN" />
      <trace name="T_SW1_pin2__GND" from="SW1.pin2" to="net.GND" />
      <trace name="T_R6_pin1__V3_3" from="R6.pin1" to="net.V3_3" />
      <trace name="T_R6_pin2__U1_IO9" from="R6.pin2" to="U1.IO9" />
      <trace name="T_SW2_pin1__U1_IO9" from="SW2.pin1" to="U1.IO9" />
      <trace name="T_SW2_pin2__GND" from="SW2.pin2" to="net.GND" />
      <trace name="T_V3_3__R7_pin1" from="net.V3_3" to="R7.pin1" />
      <trace name="T_R7_pin2__LED1_anode" from="R7.pin2" to="LED1.anode" />
      <trace name="T_LED1_cathode__U1_IO7" from="LED1.cathode" to="U1.IO7" />
      <trace name="T_TP5__EN" from="TP5.pin1" to="U1.EN" />
      <trace name="T_TP6__IO9" from="TP6.pin1" to="U1.IO9" />
      <trace name="T_TP9__UART_RX" from="TP9.pin1" to="U1.RXD0" />
      <trace name="T_TP10__UART_TX" from="TP10.pin1" to="U1.TXD0" />
    </schematicsheet>

    <schematicsheet name="SENSOR" displayName="Temperature & Humidity Sensor" sheetIndex={3}>
      {/* Temperature & Humidity Sensor connectivity. */}
      <trace name="T_U4_VDD__V3_3" from="U4.VDD" to="net.V3_3" />
      <trace name="T_U4_VSS__GND" from="U4.VSS" to="net.GND" />
      <trace name="T_U4_EP__GND" from="U4.EP" to="net.GND" />
      <trace name="T_C7_pin1__V3_3" from="C7.pin1" to="net.V3_3" />
      <trace name="T_C7_pin2__GND" from="C7.pin2" to="net.GND" />
      <trace name="T_U4_SDA__I2C_SDA" from="U4.SDA" to="net.I2C_SDA" />
      <trace name="T_U4_SCL__I2C_SCL" from="U4.SCL" to="net.I2C_SCL" />
      <trace name="T_R3_pin1__V3_3" from="R3.pin1" to="net.V3_3" />
      <trace name="T_R3_pin2__U4_SDA" from="R3.pin2" to="U4.SDA" />
      <trace name="T_R4_pin1__V3_3" from="R4.pin1" to="net.V3_3" />
      <trace name="T_R4_pin2__U4_SCL" from="R4.pin2" to="U4.SCL" />
      <trace name="T_TP7__SDA" from="TP7.pin1" to="U4.SDA" />
      <trace name="T_TP8__SCL" from="TP8.pin1" to="U4.SCL" />
    </schematicsheet>
  </board>
)