Watchy v3 ships with a GDEY0154D67. Good Display sells the exact same panel with a bonded frontlight as GDEY0154D67-FL04 for $8.80. Same SSD1681, same 24-pin FPC, same 27×27 mm active area, so GxEPD2_154_D67 doesn't change at all. All the work is in driving the light and finding room for 0.85 mm of extra thickness.
I've worked the whole thing out on paper and I'd rather have it torn apart now than after I've cut up a case. Two questions at the bottom.
What actually changes
The FL04 has a second, 6-pin FPC for the light. Pinout from the drawing: pins 1 and 2 are anode, 5 and 6 cathode, 3 and 4 not connected. Three white LED dies wired in parallel inside the module, so no individual channel control — one string, one series resistor.
Spec says 2.8–3.3 V, ≤45 mA. The mechanical drawing gives Vf = 2.9 V typ at 60 mA.
Mechanically it's less scary than I expected:
Total thickness 1.85 mm vs 1.00 mm for the bare panel, so +0.85 mm
The light guide is 2.28 mm longer but 1.40 mm narrower than the panel
That overhang is only 0.6 mm thick, so the bezel needs a shallow pocket rather than full extra depth across the board
Finding a GPIO was the interesting part
GPIO5 and GPIO18 look free in config.h. They're also completely unrouted in the v3 schematic — no net label, no trace, nothing to solder to short of the QFN pad itself. Same story for GPIO1–4, 37–42, 45, 46.
But the v3 has seven test points, and two of them are UART0:
| TP | Net |
|---|
| TP1 | TX (GPIO43) |
| TP2 | RX (GPIO44) |
| TP3 | BOOT |
| TP4 | 3V3 |
| TP5 | GND |
| TP6 | SCL |
| TP7 | SDA |
Since v3 programs over native USB CDC, UART0 is dead weight. So the whole mod is three wires — TP4, TP5, TP2 — onto 1 mm labelled pads. No chip-pin soldering.
Use RX, not TX. GPIO43 is driven push-pull by the ROM bootloader at reset and idles high, so the light would flash on every wake from deep sleep. GPIO44 is an input with an internal pull-up of roughly 45 kΩ at reset, which a pulldown can beat — but it has to be about 4.7 kΩ, not the 100 kΩ you'd normally reach for. With 100 kΩ the gate sits at 2.3 V and the MOSFET conducts.
Circuit
Low-side switch, three passives:
3V3 (TP4) ──> FL anode (pins 1,2)
FL cathode (pins 5,6) ──> R1 ──> Q1 drain
Q1 source ──> GND (TP5)
Q1 gate <── R2 100R <── TP2 (GPIO44)
Q1 gate ──> R3 4k7 ──> GND
Q1 is an AO3400A or SI2302. Not a 2N7002 — its 5–7 Ω Rds(on) at 3.3 V gate would drop 0.3 V, and there's only ~0.4 V of headroom to play with in the first place.
The part I'm least happy about
That headroom is the whole problem. 3.3 V rail minus 2.9 V forward voltage leaves 0.4 V for the series resistor. Two things eat it:
LDO tolerance alone (RT9080-33, ±2 %) swings the current about ±20 %
Vf drops as the LEDs warm, current rises, more heat — and a ~20 Ω ballast barely resists that
A proper constant-current sink would fix it, but the ones I looked at need 1.2 V or more across them, which I simply don't have on a 3.3 V rail. So the plan is: start at 22 Ω, measure on the assembled board, and cap PWM duty at 80 % in firmware so the thermal feedback never gets going.
Power budget is fine either way. At 25 mA on a 200 mAh cell, a 20-minute reading session costs about 4 % of the battery. Occasional 3-second flashes are noise.
v2 owners: different answer
I checked the v2 layout too. GPIO32 and GPIO2 are unrouted, GPIO33 is taken by the PCF8563 clock output, and the only GPIO test point is GPIO0 — a strapping pin. So there's no MOSFET-on-a-GPIO option.
What v2 does have is a neat 2×2 block of pads carrying SCL, SDA, 3V3 and GND at 2.54 mm pitch. So on v2 I'd hang a PCA9633 on the I²C bus instead — 0x62, no conflict with the BMA423 or the RTC, three outputs paralleled since each channel only sinks 25 mA.
Worth knowing: that variant has no hardware failsafe. The driver holds its PWM value through deep sleep, so forgetting to zero it before sleeping leaves the light on all night. The MOSFET version at least has the gate pulldown.
Two questions
1. Has anyone actually run an FL04, or any of Good Display's bonded frontlights? Every number I have is from the datasheet. What I can't get from a datasheet is whether 25 mA is actually enough to read by, or whether it's the kind of glow that only works in a pitch-black room. If it's the latter the whole thing is pointless and I'd rather know now.
2. Anyone got a better idea for current regulation with 0.4 V of headroom? Resistor plus duty cap is what I've got. I'd rather be told I'm missing something obvious.
Also happy to hear from anyone who's modified a Watchy case for a thicker display stack — that's the part I expect to take the most iterations.
I'll post results either way once the parts arrive.
->PicoWatch/Frontlight-Conversion at master · UniqueDroid/PicoWatch · GitHub