Skip to the content
PCBKitNew board
2 layers52 × 90 mmPlaced unrouted, the printed circuit board in 3D

Placed unrouted

nahhao74/QUIZ_Remote

Every student holds a small pad with 16 keys and two 7-segment digits. The teacher opens a session on a laptop, students type the 6-digit room code, and answers arrive on the projector within a fraction of a second.

Size
52 × 90 mm
Copper layers
2
Thickness
1.6 mm
Parts
127
Nets
71
Pads
326
Tracks, vias
0, 0
Routed
Yes
KiCad
KiCad 10.0 (file 20260206)
Created
3 Oct 2026
Updated
15 Oct 2026

Overview

Placed unrouted is an open-source printed circuit board by nahhao74, from the nahhao74/QUIZ_Remote repository on GitHub, published under the MIT licence. It is a 2-layer board of 52 × 90 mm with 127 parts on 71 nets.

It is built around the MT3608L, 74HC595D,118 and RC0805FR-0710KL, with the 1N4148W-E3-18, LBSS138LT1G and MMBT3904,215-JSM among its other parts. Its parts include 16 switches, 2 ICs, 2 connectors and 1 inductor.

Main components

9

README

README.md

Quiz Remote · ClassPulse

A wireless classroom quiz system: battery-powered ESP32 answer pads, an MQTT broker and a live teacher dashboard.

ESP32 MQTT NestJS React PostgreSQL Docker KiCad License

The ClassPulse pad showing a score of 10 next to the live presentation screen

Overview

Every student holds a small pad with 16 keys and two 7-segment digits. The teacher opens a session on a laptop, students type the 6-digit room code, and answers arrive on the projector within a fraction of a second. The whole system runs on the classroom Wi-Fi or a phone hotspot — no Internet connection is required.

Zero standby currentA key press switches the board on; the ESP32 holds its own power and cuts it completely when done
Reliable deliveryMQTT QoS 1, an application-level ACK, retries and server-side de-duplication — no answer is lost or counted twice
Network setup without reflashingHold 0 for 3 s and the pad opens a captive-portal Wi-Fi setup page for any phone
Live resultsAnswer counts and the A–D distribution update in real time; correct answers stay hidden until the question closes
Item analysisDifficulty, discrimination index, distractor effectiveness and KR-20 reliability after every session
Question importWord, Excel, PDF and TXT, with optional AI help to write and review questions

The device

Pad standing upright, showing a score of 10Pad lying flat, keys labelled 0–9, A–D, * and EnterOpen enclosure: PCB with the ESP32 module and the AAA battery holder
Showing a final score of 103D-printed enclosure, 16 keys, two 7-segment digitsInside: the PCB and the 2 × AAA holder

The teacher app

Presentation view: question, options, explanation and the live A–D chartTeacher dashboard with question sets, sessions and students
Presentation view after a question closes: correct answer, explanation and the A–D chartDashboard: question sets, AI assistant, exams, classes and session history
Session control page with the room code, the current question and the live participant listEnd-of-session report with participants, questions, answers and the average score
Session control: room code, question controls and every student's status in real timeEnd-of-session report: participation, accuracy and per-question results, with CSV export

The interface is in Vietnamese.

How it works

mermaid
flowchart LR
  subgraph Classroom["Classroom LAN (Wi-Fi 2.4 GHz)"]
    P1[ESP32 pad]:::dev
    P2[ESP32 pad]:::dev
    P3[ESP32 pad ×N]:::dev
  end
  subgraph Laptop["Teacher laptop · Docker Compose"]
    M[(EMQX<br/>MQTT broker)]
    B[NestJS<br/>backend]
    D[(PostgreSQL)]
    W[React<br/>teacher app]
  end
  P1 & P2 & P3 -- "join / answer<br/>QoS 1" --> M
  M -- "ACK + retained room state" --> P1 & P2 & P3
  M <--> B
  B -- transaction --> D
  B -- Socket.IO --> W
  W -- REST --> B
  classDef dev fill:#fde7e4,stroke:#e7352c

One answer, end to end:

mermaid
sequenceDiagram
  autonumber
  participant S as Student pad
  participant M as EMQX
  participant B as Backend
  participant D as PostgreSQL
  participant T as Teacher screen
  S->>M: answer (requestId, questionId, B, sequence)
  M->>B: deliver (QoS 1)
  B->>D: check room, deadline and sequence, then save answer and requestId in one transaction
  B-->>M: ack ANSWER_ACCEPTED
  M-->>S: ack (same requestId)
  B-->>T: session:update (counts, chart)
  Note over S,B: No ACK within 4 s → resend the identical message (up to 3 times).<br/>A repeated requestId returns the original result instead of saving twice.

Hardware

BlockFunction
M12 × AAA cells, slide switch
M2P-MOSFET power gate: key-press wake, GPIO13 self-hold
M3MT3608 boost to 3.37 V on the 3V3 pin
M4ESP32-WROOM-32 module in sockets
M54 × 4 keypad (16 keys), also wakes the board
M674HC595 + two 7-segment digits, multiplexed every 2 ms
Top-level schematic

PCB front   PCB back
The 52 × 90 mm two-layer board, front and back.

Schematic sheets, PCB, Gerber files, BOM and the full design rationale are in hardware/ and the design document.

What the digits show

LEDMeaningLEDMeaning
88Boot self-testE1No Wi-Fi
PhEnter the room codeE2MQTT not connected
IdEnter the student codeE3Rejected by the server
OnConnected to the serverE4Wrong number of digits
01Question numberCFWi-Fi setup page open
A…dSelected answerOFPowering off

Keys: 1–4 choose A–D · # confirms · * deletes, or held 3 s powers off · 0 held 3 s opens Wi-Fi setup.

Results

Measured with 50 simulated devices joining and answering at the same time, through the same broker and protocol as the real pads:

JoinedAnswers savedRejected / timed outDuplicates saved twiceACK latency p50p95max
50 / 5050 / 5000 of 100181 ms371 ms405 ms

The assembled board has completed a full quiz on two AAA cells over a phone hotspot. Full test report: web/docs/testing.md.

Repository layout

text
.
├── hardware/                 KiCad 10 project, schematic PDFs/PNGs, Gerber, BOM, design document
│   ├── compact/              The current 52 × 90 mm board
│   ├── docs/                 Design document
│   └── tools/                PCB build script, ngspice wake/hold simulation, Wokwi sketch
├── firmware/                 Arduino sketches for the ESP32
│   ├── ClassPulseQuizDevice/       The quiz pad firmware (Wi-Fi, MQTT, power control, setup portal)
│   ├── ClassPulseKeypadDisplay/    Bring-up test: keypad → digits
│   └── ClassPulsePcbBreadboardTest/  Bring-up test: power latch, keys, segments, Wi-Fi
└── web/                      Server side, run with Docker Compose
    ├── apps/backend/         NestJS · Prisma · MQTT subscriber · REST · Socket.IO
    ├── apps/frontend/        React + Tailwind teacher app and presentation view
    ├── apps/device-simulator/  Browser pad simulator (MQTT over WebSocket)
    ├── packages/             Shared types and MQTT contracts (Zod)
    └── docs/                 Architecture, MQTT protocol, API, test report

Quick start

1. Server (Docker with Compose v2):

bash
cd web
cp .env.example .env          # fill in the <...> values
# set MQTT_TCP_BIND_ADDRESS to the laptop's Wi-Fi IP (hostname -I)
docker compose up --build -d
docker compose exec backend pnpm db:seed

Open http://localhost:8080 and log in with the development account from the seed (see web/README.md).

2. Device (Arduino IDE, board ESP32 Dev Module): open firmware/ClassPulseQuizDevice/ClassPulseQuizDevice.ino, set WIFI_SSID, WIFI_PASSWORD and MQTT_HOST (the laptop's IP), then upload.

3. Run a quiz: start a session on the web → on the pad enter the room code #, a 2-digit student code # → answer with 1–4 and #.

[!TIP] No spare pads? Add 30 simulated students to the same room:

bash
docker compose exec -e MQTT_URL=mqtt://emqx:1883 backend pnpm simulate --devices=30 --room=<room code>

[!NOTE] The ESP32 only supports 2.4 GHz Wi-Fi, and the pads and the laptop must be on the same network.

Documentation

TopicDocument
Board design, calculations, BOMhardware/README.md · design-document.md
Firmware configuration and usagefirmware/ClassPulseQuizDevice/README.md
Server setup and featuresweb/README.md
System architecture and data modelweb/docs/architecture.md
MQTT topics, payloads, ACK codesweb/docs/mqtt-protocol.md
REST API and Socket.IOweb/docs/api.md
Test reportweb/docs/testing.md

License

Released under the MIT License.

Parts

127
QtyValueFootprintReferences
166x6_THT_NOquiz_remote_physical:SW_6x6_H4.3_LK14489SW1, SW2, SW3, SW4, SW5, SW6, SW7, SW8, SW9, SW10, SW11, SW12, SW13, SW14, SW15, SW16
10100kResistor_SMD:R_0805_2012MetricR_HOLD_PD, R_WAKE, RBASE_PD0, RBASE_PD1, RBASE_PD2, RBASE_PD3, RSENSE0, RSENSE1, RSENSE2, RSENSE3
910kResistor_SMD:R_0805_2012MetricR_HOLD, RBASE0, RBASE1, RBASE2, RBASE3, RCLK_PD, RDATA_PD, RLATCH_PD, ROE
8470R 1%Resistor_SMD:R_0805_2012MetricRSEG_A, RSEG_B, RSEG_C, RSEG_D, RSEG_DP, RSEG_E, RSEG_F, RSEG_G
41N4148WDiode_SMD:D_SOD-123DWAKE0, DWAKE1, DWAKE2, DWAKE3
422kResistor_SMD:R_0805_2012MetricRROW0, RROW1, RROW2, RROW3
4470kResistor_SMD:R_0805_2012MetricRCOL0, RCOL1, RCOL2, RCOL3
4LBSS138LT1GPackage_TO_SOT_SMD:SOT-23QCOL0, QCOL1, QCOL2, QCOL3
4MMBT3904-1AMPackage_TO_SOT_SMD:SOT-23QROW0, QROW1, QROW2, QROW3
3100nFCapacitor_SMD:C_0805_2012MetricC_U2, CIN2, COUT2
3AO3401APackage_TO_SOT_SMD:SOT-23QDIG1, QDIG2, QPWR
3GNDTestPoint:TestPoint_Pad_D1.5mmTP_GND, TP_GND_POWER, TP_LUA_GND
222uF 25VCapacitor_SMD:C_1210_3225MetricCIN1, COUT1
23161BS_LOGICAL_CAquiz_remote_physical:Display_XLITX_3161BSDS1, DS2
24.7kResistor_SMD:R_0805_2012MetricRGP1, RGP2
2MMBT3904Package_TO_SOT_SMD:SOT-23QHOLD, QWAKE
1180k 1%Resistor_SMD:R_0805_2012MetricRFB1
11MResistor_SMD:R_0805_2012MetricR_WAKE_PD
1220kResistor_SMD:R_1206_3216MetricR_GATE
122uHquiz_remote_physical:L_8D43_220_ThegioiICL1
139k 1%Resistor_SMD:R_0805_2012MetricRFB4
13V3_SWTestPoint:TestPoint_Pad_D1.5mmTP_3V3_SW
14.7uFquiz_remote_physical:CP_AVX_TAJ_A_3216_18C_GATE
1470uFquiz_remote_physical:CRES_IC4172_D8_P3.50_PrototypeCRES
174HC595D,118Package_SO:SOIC-16_3.9x9.9mm_P1.27mmU2
1COL0TestPoint:TestPoint_Pad_D1.5mmTP_COL0_RAW
1COL0_ADCTestPoint:TestPoint_Pad_D1.5mmTP_COL0_SENSE
1COL1TestPoint:TestPoint_Pad_D1.5mmTP_COL1_RAW
1COL1_ADCTestPoint:TestPoint_Pad_D1.5mmTP_COL1_SENSE
1COL2TestPoint:TestPoint_Pad_D1.5mmTP_COL2_RAW
1COL2_ADCTestPoint:TestPoint_Pad_D1.5mmTP_COL2_SENSE
1COL3TestPoint:TestPoint_Pad_D1.5mmTP_COL3_RAW
1COL3_ADCTestPoint:TestPoint_Pad_D1.5mmTP_COL3_SENSE
1DIGIT1_CTLTestPoint:TestPoint_Pad_D1.5mmTP_DIGIT1_CTL
1DIGIT2_CTLTestPoint:TestPoint_Pad_D1.5mmTP_DIGIT2_CTL
1FB_NODETestPoint:TestPoint_Pad_D1.5mmTP_FB
1HC595_CLKTestPoint:TestPoint_Pad_D1.5mmTP_HC595_CLK
1HC595_DATATestPoint:TestPoint_Pad_D1.5mmTP_HC595_DATA
1HC595_LATCHTestPoint:TestPoint_Pad_D1.5mmTP_HC595_LATCH
1HC595_OETestPoint:TestPoint_Pad_D1.5mmTP_HC595_OE
1LK2114_BATTERYquiz_remote_physical:JBAT_LK2114_P2.50_PrototypeJBAT
1LUA_SOCKET_ROW_AConnector_PinSocket_2.54mm:PinSocket_1x15_P2.54mm_VerticalJ1
1LUA_SOCKET_ROW_BConnector_PinSocket_2.54mm:PinSocket_1x15_P2.54mm_VerticalJ2
1MT3608LPackage_TO_SOT_SMD:SOT-23-6U1
1PWR_GATETestPoint:TestPoint_Pad_D1.5mmTP_PWR_GATE
1PWR_HOLDTestPoint:TestPoint_Pad_D1.5mmTP_PWR_HOLD
1ROW0TestPoint:TestPoint_Pad_D1.5mmTP_ROW0
1ROW1TestPoint:TestPoint_Pad_D1.5mmTP_ROW1
1ROW2TestPoint:TestPoint_Pad_D1.5mmTP_ROW2
1ROW3TestPoint:TestPoint_Pad_D1.5mmTP_ROW3
1SS-12F23G4quiz_remote_physical:SW_SS12F23G4_LKSW_MAIN
1SS34Diode_SMD:D_SMCDBOOST
1SW_NODETestPoint:TestPoint_Pad_D1.5mmTP_SW_NODE
1TP_DS1_CATestPoint:TestPoint_Pad_D1.5mmTP_DS1_CA
1TP_DS2_CATestPoint:TestPoint_Pad_D1.5mmTP_DS2_CA
1TP_SEG_ATestPoint:TestPoint_Pad_D1.5mmTP_SEG_A
1TP_SEG_GTestPoint:TestPoint_Pad_D1.5mmTP_SEG_G
1UART_RX_RESERVEDTestPoint:TestPoint_Pad_D1.5mmTP_UART_RX
1UART_TX_RESERVEDTestPoint:TestPoint_Pad_D1.5mmTP_UART_TX
1VBAT_AONTestPoint:TestPoint_Pad_D1.5mmTP_VBAT_AON
1VBAT_RAWTestPoint:TestPoint_Pad_D1.5mmTP_VBAT_RAW
1VIN_BOOSTTestPoint:TestPoint_Pad_D1.5mmTP_VIN_BOOST
1WAKE_NODETestPoint:TestPoint_Pad_D1.5mmTP_WAKE_NODE

Questions

How big is the Placed unrouted PCB?

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

What parts does the Placed unrouted use?

127 parts, built around the MT3608L, 74HC595D,118, RC0805FR-0710KL and 1N4148W-E3-18. 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 Placed unrouted KiCad files?

From the nahhao74/QUIZ_Remote repository on GitHub, at the commit this page was made from: the board is hardware/compact/route/placed_unrouted.kicad_pcb and its schematic hardware/compact/M1_BATTERY_MAIN_SWITCH.kicad_sch. PCBKit opens the board in the browser, with nothing to install.

Can I use the Placed unrouted design in my own project?

Its repository publishes it under the MIT 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 layers35.4 × 25.6 mmPowerTimer, the printed circuit board in 3D

    PowerTimer

    jfm92/powerTimer

    Module to jump from miliAmperes to nanoAmperes on Idle mode.

    33 parts49
  • 4 layers150 × 137.1 mmController, the printed circuit board in 3D

    Controller

    CircuitGuy943/Sabre-Integrated-flight-controller

    (🚧) A "Jack of all trades" custom flight controller board. With support for both power and control and the ability for custom firmware

    282 parts2GPL-3.0
  • 2 layers34 × 96 mmGem solder, the printed circuit board in 3D

    Gem solder

    arlenko/gem-solder

    💎 DIY soldering iron controller

    114 parts12CERN-OHL-S-2.0
  • 4 layers208 × 129 mmMainboard v2 r1, the printed circuit board in 3D

    Mainboard v2 r1

    Benjamin-girard-1/geophys_acquisition_module

    Modular ESP32-S3 geophysical data-acquisition system with custom hardware, multi-channel ADC, GNSS, IMU, removable analog sensor cards, firmware, and host tools

    287 parts
  • 4 layers190 × 110 mmGeophys mainboard, the printed circuit board in 3D

    Geophys mainboard

    Benjamin-girard-1/magnetometer-node-old

    384 parts
  • 2 layers40 × 20 mmB MT3608-BRK R1.0, the printed circuit board in 3D

    B MT3608-BRK R1.0

    Boardoza/Boardoza_MT3608_3V3_to_5V_Boost_Converter_Breakout_Board

    Compact MT3608-based DC-DC boost converter breakout board for converting 3.3V input to regulated 5V output.

    15 partsCC-BY-SA-4.0
  • 4 layersCABadge V2 1, the printed circuit board in 3D

    CABadge V2 1

    nbtca/CABadge

    CABadge 计协电子吧唧:基于 ESP32-S3 的开源圆屏互动徽章,支持动态壁纸、触摸交互、Wi-Fi/BLE 和趣味小应用,提供 PCB、3D 打印外壳、固件及配套工具。

    110 parts15MIT