All projects
Hardware2026

PocketSense

A pocket-sized room monitor on a custom PCB I designed from scratch. Temperature, humidity, pressure, UV, and WiFi signal on a small OLED, navigated with three buttons and running off AA batteries.

Breadboard, then schematic, then board, then bring-up. I wrote the firmware, drew the schematic, laid out the PCB, and soldered it by hand.

Part 1 · Breadboard and firmware
Nothing got designed into copper until it worked on a breadboard first. The whole firmware was written and proven on a dev board before a single schematic symbol was placed. The sensor and the display share one I2C bus, which is exactly the kind of conflict you want to rule out while it is still a jumper wire away from fixable, and the UV sensor sits on a pin that stays readable while the WiFi radio is running. The interface itself is deliberately small: five screens, three buttons, and a state machine that fits in a couple of variables.
ESP32ArduinoI2CAdafruit GFXSSD1306BME280
Breadboard prototype showing the Temperature screen reading 23.3 C
The breadboard build, running the finished firmware. Every screen and every pin was proven here before the pinout was frozen.
Part 2 · Schematic and PCB
Drawn in Altium as four blocks: power, reset, boot, and the programming header. Three AA cells feed a linear regulator through a slide switch that breaks the positive rail, so the board is genuinely dead when it is off. The layout is four layers, with solid ground and power planes inside and a clear keepout around the module antenna. DRC came back clean, and I checked the Gerbers in the fab viewer before ordering.
Altium DesignerSchematic CapturePCB Layout4-Layer StackupJLCPCB
Altium schematic split into power, EN/reset, boot, and programming header blocks
The schematic, in four blocks: power, reset, boot, and the programming header.
Four-layer PCB layout with the antenna keepout at the top edge
Four-layer layout. Signal on the outside, ground and power planes in the middle, and a clear void under the antenna.
3D render of the assembled PocketSense board in Altium
Altium's 3D view, the last check before export. Mostly: does anything collide, and does the display actually fit.
Part 3 · Assembly
Boards came back from JLCPCB and I soldered every part by hand, surface mount first while the board was still flat and nothing tall was in the way. The switch that shipped had the wrong pin count for the footprint, so instead of reordering I probed it with a meter and found the three pins that line up. Before any voltage went near it I checked for a short between power and ground. No beep, safe to power.
SMD SolderingSOT-2230603 / 0805Continuity Testing
Bare PocketSense PCB with the ESP32 module placed and unpopulated footprints visible
Fresh from the fab, with the module dry-fitted. Surface mount work goes first, while the board is still flat.
Fully populated PocketSense board with ESP32, OLED, BME280, UV sensor and six buttons
Fully populated. Purple board is the environment sensor, red is the UV sensor, and the three buttons along the bottom are back, scroll, and select.
Back of the PocketSense board with a three-cell AA battery holder mounted over the LDO
The back, with the battery holder mounted over the regulator. It runs off cells you can buy anywhere.
Part 4 · UART bring-up
There is no auto-reset circuit on this board, so getting into the bootloader is manual: hold boot, tap reset, release, all inside the second or so while the uploader is trying to connect. It works. The chip answers, reports its ID, and the flasher starts, which means the reset circuit, the boot circuit, the crossed serial lines, and the regulator are all doing their jobs. Then the transfer dies, and the meter says why. The regulator is putting out about 3.0V instead of 3.3V, so the moment the ESP32 pulls real current the cells sag and the board browns out mid-upload. That is a supply problem, not a layout one.
FT232RUARTesptoolHardware Bring-up
PocketSense connected to an FT232R converter with esptool output on screen
Bring-up over a USB to serial converter. The chip answers and the flasher starts, right up until the rail gives out.
Highlights
Five sensor screens on one small OLED, all driven by three buttons. No phone, no app, no cloud
The bug that almost shipped: two of the buttons were wired to physical pins 17 and 18 on the module symbol, which are internal flash pins, not the GPIOs of the same number. Caught it against the datasheet pin table before the board went out
The antenna keepout took a second pass. Altium keepouts only block routing on the outer layers, so clearing the internal planes underneath meant placing fills on them directly
The firmware compiles to about 927 KB, 70% of the default partition, which is a lot of program space for something that draws five screens
Every stage was mine end to end: firmware on a breadboard, schematic and four-layer layout in Altium, Gerbers out to the fab, and every part on the board soldered by hand
One step from done. The upload browns out on battery sag, and the fix is fresh cells or a bench supply rather than a respin. The real lesson: a regulator with a 1.3V dropout on a 4.5V pack has almost no headroom, and under a WiFi current burst almost none becomes none
Austin Zhai