rushabhcodes/ESP32-E-Reader
A compact ESP32-C3 e-reader PCB integrating LiPo charging/protection, USB-C, 3.3 V regulation, e-paper display bias generation, microSD storage, and tactile controls.
- Version
- 1.0.85
- License
- unset
- Stars
- 3
circuit-sections.tsx
import { Fragment } from "react";
import {
controlButtonCaptions,
schematicGroups,
schematicLayout,
} from "./schematic-layout";
import { functionalSymbolFor } from "./functional-schematic-symbols";
import {
aliasForPin,
type ChipSpec,
capacitors,
chips,
diodes,
inductors,
noConnectAliases,
pinLabelsFor,
polarizedPinLabels,
resistors,
schematicPlacementFor,
supplierPartNumbersFor,
testpoints,
} from "./design-data";
import { SMMS0420_100M } from "./imports/SMMS0420_100M";
import { BQ24073RGTR } from "./imports/BQ24073RGTR";
import { DM3AT_SF_PEJM5 } from "./imports/DM3AT_SF_PEJM5";
import { DW01A } from "./imports/DW01A";
import { ESP32_C3_WROOM_02U_N4 } from "./imports/ESP32_C3_WROOM_02U_N4";
import { EVQP7C01P } from "./imports/EVQP7C01P";
import { FH34SRJ_24S_0_5SH_50_ } from "./imports/FH34SRJ_24S_0_5SH_50_";
import { FS8205A } from "./imports/FS8205A";
import { MSK12C02_HB } from "./imports/MSK12C02_HB";
import { MBR0530T1G } from "./imports/MBR0530T1G";
import { SMMS0420_1R5M } from "./imports/SMMS0420_1R5M";
import { TPS63021DSJR } from "./imports/TPS63021DSJR";
import { S2B_PH_K_S_LF__SN_ } from "./imports/S2B_PH_K_S_LF__SN_";
import { SI1308EDL_T1_GE3 } from "./imports/SI1308EDL_T1_GE3";
import { SKRPACE010 } from "./imports/SKRPACE010";
import { TYPE_C_31_M_12 } from "./imports/TYPE_C_31_M_12";
import { USBLC6_2SC6 } from "./imports/USBLC6_2SC6";
const renderChip = (spec: ChipSpec) => {
const half = Math.ceil(spec.pins.length / 2);
const schematicPlacement = schematicPlacementFor(spec.name);
const symbol = functionalSymbolFor(spec.name);
const importedCommon = {
name: spec.name,
pcbX: spec.pcbX,
pcbY: spec.pcbY,
pcbRotation: spec.pcbRotation,
layer: spec.layer,
supplierPartNumbers: supplierPartNumbersFor(spec.name),
...schematicPlacement,
...(symbol ? { symbol } : {}),
};
if (spec.name === "J2")
return (
<FH34SRJ_24S_0_5SH_50_
key={spec.name}
{...importedCommon}
pcbY={spec.pcbY}
noConnect={["pin1", "pin4", "pin6", "pin7", "pin19", "pin25", "pin26"]}
/>
);
if (spec.name === "J4")
return (
<DM3AT_SF_PEJM5
key={spec.name}
{...importedCommon}
noConnect={["pin10", "pin11", "pin12", "pin13", "pin14"]}
/>
);
// Turn BT1's keyed mating face toward the partition lead slot (-Y).
// Its right-side position clears the Waveshare ribbon and battery pouch.
if (spec.name === "BT1")
return (
<S2B_PH_K_S_LF__SN_
key={spec.name}
{...importedCommon}
pcbX={spec.pcbX - 0.975}
pcbY={spec.pcbY + 2}
pcbRotation={180}
schPinArrangement={{ topSide: ["pin1"], bottomSide: ["pin2"] }}
/>
);
if (spec.name === "Q1")
return <FS8205A key={spec.name} {...importedCommon} />;
if (spec.name === "Q2")
return <SI1308EDL_T1_GE3 key={spec.name} {...importedCommon} />;
if (spec.name === "U1")
return (
<BQ24073RGTR
key={spec.name}
{...importedCommon}
noConnect={["pin7", "pin14"]}
/>
);
if (spec.name === "U2")
return (
<USBLC6_2SC6
key={spec.name}
{...importedCommon}
noConnect={["pin1", "pin4"]}
/>
);
if (spec.name === "U3")
return <DW01A key={spec.name} {...importedCommon} noConnect={["pin4"]} />;
if (spec.name === "U4")
return (
<ESP32_C3_WROOM_02U_N4
key={spec.name}
{...importedCommon}
noConnect={["pin11"]}
/>
);
if (spec.name === "U5")
return (
<TPS63021DSJR key={spec.name} {...importedCommon} noConnect={["pin14"]} />
);
if (spec.name === "S1" || spec.name === "S2")
return <EVQP7C01P key={spec.name} {...importedCommon} />;
if (["SW2", "SW3", "SW4", "SW6"].includes(spec.name))
return (
<SKRPACE010
key={spec.name}
{...importedCommon}
noConnect={["pin2", "pin3"]}
/>
);
if (spec.name === "SW7")
return (
<MSK12C02_HB key={spec.name} {...importedCommon} />
);
const common = {
name: spec.name,
manufacturerPartNumber: spec.value,
footprint: spec.footprint,
pinLabels: pinLabelsFor(spec.pins),
noConnect: noConnectAliases(spec),
pcbX: spec.pcbX,
pcbY: spec.pcbY,
pcbRotation: spec.pcbRotation,
layer: spec.layer,
supplierPartNumbers: supplierPartNumbersFor(spec.name),
doNotPlace: spec.name === "JP1",
schPinArrangement: {
leftSide: spec.pins.slice(0, half).map(aliasForPin),
rightSide: spec.pins.slice(half).map(aliasForPin),
},
...schematicPlacement,
};
if (spec.name === "J1")
return (
<TYPE_C_31_M_12
key={spec.name}
{...importedCommon}
noConnect={["SBU1", "SBU2"]}
pcbX={spec.pcbX}
pcbY={spec.pcbY}
pcbRotation={spec.pcbRotation}
/>
);
if (spec.kind === "connector")
return <connector key={spec.name} {...common} />;
if (spec.kind === "pushbutton")
return <pushbutton key={spec.name} {...common} />;
return <chip key={spec.name} {...common} />;
};
const SheetHeadings = ({ sheet }: { sheet: string }) => (
<Fragment>
{sheet === "controls" &&
controlButtonCaptions.map(({ reference, text }) => (
<Fragment key={reference}>
<schematictext
text={text}
schX={schematicLayout[reference].schX + 0.65}
schY={schematicLayout[reference].schY}
anchor="left"
fontSize={0.24}
/>
</Fragment>
))}
{schematicGroups
.filter((group) => group.sheet === sheet)
.map((group) => (
<Fragment key={group.name}>
<schematictext
text={group.title}
schX={group.x}
schY={group.y}
fontSize={0.38}
anchor="center"
/>
</Fragment>
))}
</Fragment>
);
export const CircuitSections = () => (
<Fragment>
<schematicsheet
name="battery_usb"
displayName="Battery, Protection, USB & Charging"
sheetIndex={0}
>
<SheetHeadings sheet="battery_usb" />
</schematicsheet>
<schematicsheet
name="mcu_power"
displayName="3.3 V Rail & ESP32-C3"
sheetIndex={1}
>
<SheetHeadings sheet="mcu_power" />
</schematicsheet>
<schematicsheet
name="display_power"
displayName="E-Paper Interface & Bias Rails"
sheetIndex={2}
>
<SheetHeadings sheet="display_power" />
</schematicsheet>
<schematicsheet
name="storage"
displayName="Micro SD Storage"
sheetIndex={3}
>
<SheetHeadings sheet="storage" />
</schematicsheet>
<schematicsheet name="controls" displayName="User Controls" sheetIndex={4}>
<SheetHeadings sheet="controls" />
</schematicsheet>
{schematicGroups.map((group) => (
<Fragment key={group.name}>
<schematicsection name={group.name} displayName={group.title} />
</Fragment>
))}
{capacitors.map((spec) => (
<capacitor
key={spec.name}
name={spec.name}
capacitance={spec.value}
footprint={spec.footprint}
supplierPartNumbers={supplierPartNumbersFor(spec.name)}
pcbX={spec.pcbX}
pcbY={spec.pcbY}
pcbRotation={spec.pcbRotation}
layer={spec.layer}
schRotation={-90}
{...schematicPlacementFor(spec.name)}
/>
))}
{resistors.map((spec) => (
<resistor
key={spec.name}
name={spec.name}
resistance={spec.value}
footprint={spec.footprint}
supplierPartNumbers={supplierPartNumbersFor(spec.name)}
pcbX={spec.pcbX}
pcbY={spec.pcbY}
pcbRotation={spec.pcbRotation}
layer={spec.layer}
{...schematicPlacementFor(spec.name)}
/>
))}
{inductors.map((spec) =>
spec.name === "L1" ? (
<SMMS0420_100M
key={spec.name}
name={spec.name}
pcbX={spec.pcbX}
pcbY={spec.pcbY}
pcbRotation={spec.pcbRotation}
layer={spec.layer}
supplierPartNumbers={supplierPartNumbersFor(spec.name)}
{...schematicPlacementFor(spec.name)}
/>
) : spec.name === "L2" ? (
<SMMS0420_1R5M
key={spec.name}
name={spec.name}
pcbX={spec.pcbX}
pcbY={spec.pcbY}
pcbRotation={spec.pcbRotation}
layer={spec.layer}
{...schematicPlacementFor(spec.name)}
/>
) : (
<inductor
key={spec.name}
name={spec.name}
inductance={spec.value}
footprint={spec.footprint}
supplierPartNumbers={supplierPartNumbersFor(spec.name)}
pcbX={spec.pcbX}
pcbY={spec.pcbY}
pcbRotation={spec.pcbRotation}
layer={spec.layer}
{...schematicPlacementFor(spec.name)}
/>
),
)}
<led
name="D1"
supplierPartNumbers={supplierPartNumbersFor("D1")}
color="red"
pinLabels={polarizedPinLabels}
footprint="0805"
pcbX={-29.62440000000001}
pcbY={34.475}
pcbRotation={90}
layer="top"
{...schematicPlacementFor("D1")}
/>
{diodes.map((spec) => (
<Fragment key={spec.name}>
<MBR0530T1G
name={spec.name}
pcbX={spec.pcbX}
pcbY={spec.pcbY}
pcbRotation={spec.pcbRotation}
layer={spec.layer}
pcbSx={{ "& silkscreentext": { visibility: "hidden" } }}
supplierPartNumbers={supplierPartNumbersFor(spec.name)}
{...schematicPlacementFor(spec.name)}
/>
<silkscreentext
text={spec.name}
pcbX={spec.pcbX + 3.4}
pcbY={spec.pcbY}
fontSize="0.75mm"
layer={spec.layer}
/>
</Fragment>
))}
{chips.map(renderChip)}
{testpoints.map((testpoint) => (
<testpoint
key={testpoint.name}
name={testpoint.name}
footprintVariant="pad"
padShape="circle"
padDiameter="1.5mm"
doNotPlace
pcbX={testpoint.pcbX}
pcbY={testpoint.pcbY}
{...schematicPlacementFor(testpoint.name)}
/>
))}
</Fragment>
);