
MP1
duyhohoang/duyhohoang.github.io
Hoàng Duy — PCB Design, Embedded Systems and IoT portfolio

Hoàng Duy — PCB Design, Embedded Systems and IoT portfolio
ESP32PLC is an open-source printed circuit board by duyhohoang, from the duyhohoang/duyhohoang.github.io repository on GitHub. It is a 4-layer board of 95.2 × 85.7 mm with 190 parts on 156 nets, routed with 871 tracks and 485 vias.
It is built around the ESP32-S3-WROOM-1U-N8R8, SP3485CN-L and TPS5430DDA, with the TP5551-TR, AMS1117-3.3 and ULN2003 among its other parts. Its parts include 68 resistors, 38 capacitors, 21 diodes, 16 ICs and 13 connectors. It belongs with the home automation and IoT boards and the ESP32 and RISC-V boards of this library.
Existing black-and-pink portfolio for PCB Design, Embedded Systems and IoT. Next.js App Router, React, TypeScript and Motion. Self-hosted fonts and local imagery; no backend, API, database, server actions or runtime Node server.
Use Node 24.19.0 (.node-version) and pnpm 11.25.0 (packageManager).
pnpm install --frozen-lockfile
pnpm devDevelopment: http://127.0.0.1:3000. For production:
pnpm lint
pnpm test
pnpm build
pnpm check:export
pnpm previewStatic preview: http://127.0.0.1:3001. Deploy only out/. next.config.ts already preserves export, trailing slashes, unoptimized local images and disabled framework header. The postbuild helper preserves Windows-generated Next segment payload aliases; it is harmless on Linux.
Copy .env.example to .env.local if overriding defaults. src/data/contact.ts contains the owner-provided public email, hoangduy2206.ute@gmail.com. NEXT_PUBLIC_CONTACT_EMAIL overrides it; an explicitly empty value disables composition and shows a configuration warning. Public variables are embedded at build time and must never contain secrets.
The contact form validates fields and composes a safely encoded mailto: draft. Visitors finish sending in their own email app. No delivery is performed or reported by this website. A direct Send Email link works without JavaScript; form submission is disabled until hydration to avoid leaking form fields into a GET URL.
Set NEXT_PUBLIC_SITE_URL to your real HTTPS Pages origin or custom domain and rebuild before enabling search indexing. Without it, the local preview intentionally emits noindex/disallow and localhost canonical/sitemap URLs.
The selected address is https://duyhohoang.github.io/, published from repository duyhohoang.github.io. The included GitHub Actions workflow builds and deploys only out/ on main pushes. Enable Settings → Pages → Source: GitHub Actions in that repository. See DEPLOY.md for setup and validation.
For the current Workers project, wrangler.jsonc explicitly serves static files from out/; build with pnpm build and deploy with npx wrangler@4.151.3 deploy. No OpenNext migration or runtime server is needed.
For the alternative Pages workflow, see DEPLOY.md for GitHub connection, build settings, free Pages address, custom domain and automatic deploys. Use the Next.js (Static HTML Export) preset, pnpm build, output out, production branch main. This is prepared locally, not publicly deployed.
src/components/PortfolioHome.tsx: existing homepage sections and content.src/components/backgrounds/CircuitBackground.tsx: SVG decoration; visibility-aware CSS pulses, static on mobile/reduced motion.src/hooks/usePortfolioMotion.ts: one shared reveal observer and finite animations, with lifecycle cleanup.src/components/ContactForm.tsx, src/lib/contact.ts: validated email draft composition.src/data/portfolio-media.ts: replaceable local portrait and hardware media.scripts/review-fidelity.mjs: twelve reference-sized production screenshots.scripts/test-animations.mjs: production interactions, motion, six viewport widths, navigation cleanup and no-JS checks.docs/PHASE4-REPORT.md: validation evidence and remaining limitations.Project studies remain illustrative, with validation status identified. No employment, education, manufacturing results or client metrics have been invented.
| Qty | Value | Footprint | References |
|---|---|---|---|
| 19 | 10K/0603/1% | IVS_FOOTPRINTS:R_0603 | R3, R15, R16, R21, R23, R24, R25, R26, R58, R59, R63, R64, R71, R72, R73, R74 +3 |
| 16 | 100nF/0603/50V | IVS_FOOTPRINTS:C_0603 | C1, C3, C6, C16, C41, C43, C46, C47, C48, C49, C50, C51, C53, C55, C56, C58 |
| 12 | 100K/0603/1% | IVS_FOOTPRINTS:R_0603 | R81, R82, R83, R84, R86, R87, R88, R89, R91, R92, R93, R94 |
| 10 | RED/0603 | IVS_FOOTPRINTS:LED_0603 | LE2, LE3, LE6, LE7, LE8, LE9, LE10, LE11, LE12, LE13 |
| 8 | 4K7/0603/1% | IVS_FOOTPRINTS:R_0603 | R50, R51, R52, R53, R54, R55, R56, R57 |
| 7 | Screw_Terminal_01x04 | IVS_FOOTPRINTS:KF-5.08-4P | J1, J7, J8, J11, J12, J13, J14 |
| 6 | 1K/0603/1% | IVS_FOOTPRINTS:R_0603 | R2, R13, R67, R68, R69, R75 |
| 6 | 1uF/0603/50V | IVS_FOOTPRINTS:C_0603 | C30, C40, C42, C52, C54, C57 |
| 6 | D_Diode | IVS_FOOTPRINTS:D_SMA_TVS | D8, D9, D18, D19, D20, D21 |
| 6 | LESD5D5.0CT1G | Diode_SMD:D_SOD-523 | D11, D12, D13, D14, D16, D17 |
| 4 | 10uF/0603/6.3V | IVS_FOOTPRINTS:C_0603 | C2, C4, C5, C17 |
| 4 | 120R/0603/1% | IVS_FOOTPRINTS:R_0603 | R18, R19, R20, R22 |
| 4 | 1M/0603/1% | IVS_FOOTPRINTS:R_0603 | R76, R77, R78, R79 |
| 4 | 4.7K/0603/1% | IVS_FOOTPRINTS:R_0603 | R9, R10, R11, R12 |
| 4 | 5.1K/0603/1% | IVS_FOOTPRINTS:R_0603 | R5, R6, R7, R8 |
| 4 | MountingHole_Pad | IVS_FOOTPRINTS:MountingHole_2.2mm_M2_Pad_Via | H1, H2, H3, H4 |
| 4 | N_Mosfet | IVS_FOOTPRINTS:SOT23-3 | Q6, Q7, Q8, Q9 |
| 4 | Opto | Package_DIP:SMDIP-4_W9.53mm_Clearance8mm | U9, U10, U11, U12 |
| 4 | Relay_G5NB-1A-E_DC5 | IVS_FOOTPRINTS:Relay_G5NB-1A-E DC5 | RL1, RL2, RL3, RL4 |
| 3 | 165R/0603/1% | IVS_FOOTPRINTS:R_0603 | R60, R61, R62 |
| 3 | D_TVS | IVS_FOOTPRINTS:D_SMA_TVS | D3, D4, D7 |
| 3 | TP5551-TR | Package_TO_SOT_SMD:SOT-23-5 | IC2, IC3, IC4 |
| 2 | 100nF/50V/0603 | IVS_FOOTPRINTS:C_0603 | C7, C15 |
| 2 | 10uF/0603/50V | IVS_FOOTPRINTS:C_0603 | C44, C45 |
| 2 | 10uF/50V/0603 | IVS_FOOTPRINTS:C_0603 | C10, C12 |
| 2 | 10uF/6.3V/0603 | IVS_FOOTPRINTS:C_0603 | C11, C14 |
| 2 | 4.7uF/50V/0603 | IVS_FOOTPRINTS:C_0603 | C8, C9 |
| 2 | D_Schottky | Diode_SMD:D_SOD-123 | D10, D15 |
| 2 | NPN | IVS_FOOTPRINTS:SOT23-3 | Q1, Q2 |
| 2 | Polyfuse | ABC:FUSER_MF-MSMF075_24-2 | F3, F4 |
| 2 | SW_Push | Button_Switch_SMD:SW_Push_1P1T_NO_CK_KMR2 | SW1, SW2 |
| 2 | Screw_Terminal_01x02 | IVS_FOOTPRINTS:KF-5.08-2P | J15, J16 |
| 2 | TYPE-C-31-M-12 | ABC:HRO_TYPE-C-31-M-12 | J9, J10 |
| 2 | TestPoint | IVS_FOOTPRINTS:TestPoint_Pad_D1.0mm | TP1, TP2 |
| 1 | 0R/0603/1% | IVS_FOOTPRINTS:R_0603 | R17 |
| 1 | 1uF/0603/6.3V | IVS_FOOTPRINTS:C_0603 | C18 |
| 1 | 22.1R/0603/50V | IVS_FOOTPRINTS:R_0603 | R65 |
| 1 | 220uF/6.3V/6.3x5.4 | Capacitor_SMD:CP_Elec_6.3x5.4 | C13 |
| 1 | 22uH/CDRH127-220 | ABC:INDPM120120X800N | L1 |
| 1 | 24LC512_IPC | Package_DFN_QFN:DFN-8-1EP_3x2mm_P0.5mm_EP1.3x1.5mm | U7 |
| 1 | 3.3K/0603/1% | IVS_FOOTPRINTS:R_0603 | R4 |
| 1 | 47.5K/0603/50V | IVS_FOOTPRINTS:R_0603 | R66 |
| 1 | AMS1117-3.3 | Package_TO_SOT_SMD:SOT-223-3_TabPin2 | U2 |
| 1 | BZT52H-C5V1 | IVS_FOOTPRINTS:SOD-123 | D6 |
| 1 | Battery_Cell | IVS_FOOTPRINTS:BatteryHolder_CR1220 | BT1 |
| 1 | CP2102N-Axx-xQFN28 | Package_DFN_QFN:QFN-28-1EP_5x5mm_P0.5mm_EP3.25x3.25mm_ThermalVias | U6 |
| 1 | Conn_01x04_Pin | IVS_FOOTPRINTS:Conn_XH-P2.54mm-4P | J4 |
| 1 | ESP32-S3-WROOM-1U-N8R8 | ABC:XCVR_ESP32-S3-WROOM-1U-N8R8 | U1 |
| 1 | LM35-LP | Package_TO_SOT_THT:TO-92_Inline | U4 |
| 1 | Micro_SD_Card_Det1 | IVS_FOOTPRINTS:MicroSD_Socket_9P | J3 |
| 1 | P_Mosfet | IVS_FOOTPRINTS:TO-252-2 | Q3 |
| 1 | RTC_DS3231M | Package_SO:SOIC-16W_7.5x10.3mm_P1.27mm | IC1 |
| 1 | RUEF250/30V/2.5A | ABC:FUSRR505W81L660T250H1360 | F2 |
| 1 | SK6812MINI | LED_SMD:LED_SK6812MINI_PLCC4_3.5x3.5mm_P1.75mm | D2 |
| 1 | SMAJ281-E3/61 | IVS_FOOTPRINTS:D_SMA | D5 |
| 1 | SP3485CN | Package_SO:SOIC-8_3.9x4.9mm_P1.27mm | U5 |
| 1 | SS54/5A/40V | IVS_FOOTPRINTS:D_SMA_TVS | D1 |
| 1 | TPS5430DDA | IVS_FOOTPRINTS:SOIC8E(EXPOSED PAD) | U3 |
| 1 | ULN2003 | Package_SO:SOIC-16_3.9x9.9mm_P1.27mm | U8 |

duyhohoang/duyhohoang.github.io
Hoàng Duy — PCB Design, Embedded Systems and IoT portfolio

NeuroCircuits/ESP32-S3-Rover-Controller-PCB
Custom ESP32-S3 based controller PCB for a 6-wheel robotic platform, featuring servo control, DC motor drivers, IMU, RFID, USB programming, and dedicated power regulation.


chatelao/xDuinoRail-Decoder
The friendly decoder development plattform for model railroad tinkers.

CuriousMotor/Onyx-Stepper-Motherboard
The successor of the iconic Arduino-CNC-shield

byrantech/stepcraft-3-d600-controller
Open-source FluidNC Controller for the Stepcraft-3/D.600 system.



bootsie123/echo-button-thing
A PCB replacement for the Echo Button allowing support for Home Assistant through ESPHome
It measures 95.2 × 85.7 mm and has 4 copper layers, 0.2 mm thick.
190 parts, built around the ESP32-S3-WROOM-1U-N8R8, SP3485CN-L, TPS5430DDA and TP5551-TR. 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.
From the duyhohoang/duyhohoang.github.io repository on GitHub, at the commit this page was made from: the board is public/assets/projects/personal/esp32-plc/ESP32PLC.kicad_pcb. PCBKit opens the board in the browser, with nothing to install.
Its repository states no licence, so its author keeps all rights: ask duyhohoang before reusing the design.