tscircuit/ti

ti tscircuit library

Version
1.0.194
License
unset
Stars
0

lib/subcircuits/Sensors_TMP116_OPT3004.circuit.tsx

import type { SubcircuitProps } from "@tscircuit/props";
import { Fragment } from "react";
import { OPT3004DNPR } from "../chips/OPT3004DNPR.circuit.tsx";
import { TMP116NAIDRVR } from "../chips/TMP116NAIDRVR.circuit.tsx";

const EXPOSED_NETS = [
  "VDD",
  "GND",
  "SCL",
  "SDA",
  "TEMP_ALERT",
  "LIGHT_INT",
] as const;

type SensorNetName = (typeof EXPOSED_NETS)[number];

interface LocalNetConnectionProps {
  net: SensorNetName;
  connectsTo: string | string[];
}

const LocalNetConnection = ({ net, connectsTo }: LocalNetConnectionProps) => (
  <>
    {(Array.isArray(connectsTo) ? connectsTo : [connectsTo]).map(
      (connection, index) => (
        <Fragment key={`${net}-${index}`}>
          <trace
            name={[net, connection].join("-")}
            from={connection}
            to={`net.${net}`}
            schDisplayLabel={net}
          />
        </Fragment>
      ),
    )}
  </>
);

/**
 * Flat-panel module temperature and ambient-light sensing block.
 *
 * The shared I2C bus, address straps, bypass capacitors, and open-drain
 * pull-ups follow the typical-application guidance in the TMP116 and OPT3004
 * data sheets. ADD0 and ADDR are grounded, selecting the devices' lowest
 * addresses without creating an address collision.
 *
 * @see https://www.ti.com/lit/ds/symlink/tmp116.pdf
 * @see https://www.ti.com/lit/ds/symlink/opt3004.pdf
 */
export const Sensors_TMP116_OPT3004 = (props: SubcircuitProps) => (
  <subcircuit
    exposedNets={[...EXPOSED_NETS]}
    width="18mm"
    height="11mm"
    schMaxTraceDistance="2mm"
    {...props}
  >
    <net name="VDD" isPowerNet />
    <net name="GND" isGroundNet />
    <net name="SCL" />
    <net name="SDA" />
    <net name="TEMP_ALERT" />
    <net name="LIGHT_INT" />

    <TMP116NAIDRVR
      name="U1"
      schX={-3.3}
      schY={-0.2}
      schWidth="2.4mm"
      schHeight="3mm"
      schPinArrangement={{
        leftSide: {
          direction: "top-to-bottom",
          pins: [5, 4, 2, 7],
        },
        rightSide: {
          direction: "top-to-bottom",
          pins: [1, 6, 3],
        },
      }}
      pcbX={-4}
      pcbY={0}
    />

    <OPT3004DNPR
      name="U2"
      schX={3.3}
      schY={-0.2}
      schWidth="2.4mm"
      schHeight="3mm"
      schPinArrangement={{
        leftSide: {
          direction: "top-to-bottom",
          pins: [4, 6, 5],
        },
        rightSide: {
          direction: "top-to-bottom",
          pins: [1, 2, 3, 7],
        },
      }}
      pcbX={4}
      pcbY={0}
    />

    <capacitor
      name="C1"
      capacitance="0.1uF"
      footprint="0402"
      schX={-4.7}
      schY={-2.7}
      schRotation={90}
      pcbX={-7}
      pcbY={0}
    />
    <capacitor
      name="C2"
      capacitance="0.1uF"
      footprint="0402"
      schX={4.7}
      schY={-2.7}
      schRotation={90}
      pcbX={5}
      pcbY={-3.2}
    />

    <resistor
      name="R1"
      resistance="4.99kohm"
      footprint="0402"
      schX={-2.2}
      schY={3}
      pcbX={-3.3}
      pcbY={4}
    />
    <resistor
      name="R2"
      resistance="4.99kohm"
      footprint="0402"
      schX={-2.2}
      schY={2.2}
      pcbX={-1.1}
      pcbY={4}
    />
    <resistor
      name="R3"
      resistance="4.99kohm"
      footprint="0402"
      schX={2.2}
      schY={3}
      pcbX={1.1}
      pcbY={4}
    />
    <resistor
      name="R4"
      resistance="10kohm"
      footprint="0402"
      schX={2.2}
      schY={2.2}
      pcbX={5}
      pcbY={4}
    />

    <LocalNetConnection net="VDD" connectsTo=".U1 > .VDD" />
    <LocalNetConnection
      net="GND"
      connectsTo={[".U1 > .ADD0", ".U1 > .GND", ".U1 > .EP"]}
    />
    <LocalNetConnection net="SCL" connectsTo=".U1 > .SCL" />
    <LocalNetConnection net="SDA" connectsTo=".U1 > .SDA" />
    <LocalNetConnection net="TEMP_ALERT" connectsTo=".U1 > .ALERT" />

    <LocalNetConnection net="SCL" connectsTo=".U2 > .SCL" />
    <LocalNetConnection net="SDA" connectsTo=".U2 > .SDA" />
    <LocalNetConnection net="LIGHT_INT" connectsTo=".U2 > .INT" />
    <LocalNetConnection net="VDD" connectsTo=".U2 > .VDD" />
    <LocalNetConnection
      net="GND"
      connectsTo={[".U2 > .ADDR", ".U2 > .GND", ".U2 > .EP"]}
    />

    <LocalNetConnection net="VDD" connectsTo=".R1 > .pin1" />
    <LocalNetConnection net="SCL" connectsTo=".R1 > .pin2" />
    <LocalNetConnection net="VDD" connectsTo=".R2 > .pin1" />
    <LocalNetConnection net="SDA" connectsTo=".R2 > .pin2" />
    <LocalNetConnection net="VDD" connectsTo=".R3 > .pin1" />
    <LocalNetConnection net="TEMP_ALERT" connectsTo=".R3 > .pin2" />
    <LocalNetConnection net="VDD" connectsTo=".R4 > .pin2" />
    <trace
      name="LIGHT_INT_PULLUP"
      from=".U2 > .INT"
      to=".R4 > .pin1"
      schDisplayLabel="LIGHT_INT"
      pcbRouteHints={[{ x: 5.8, y: 0 }]}
    />

    <LocalNetConnection net="VDD" connectsTo=".C1 > .pin1" />
    <LocalNetConnection net="GND" connectsTo=".C1 > .pin2" />
    <LocalNetConnection net="VDD" connectsTo=".C2 > .pin1" />
    <LocalNetConnection net="GND" connectsTo=".C2 > .pin2" />
  </subcircuit>
);

export default Sensors_TMP116_OPT3004;