I had an extra H03 sitting around for a while wanting to be modified, and realized the most useful added feature it could get is USB charging. The H03 is very compact for a right-angle 18650, which makes it difficult to add extra hardware, but it turns out it is just possible to fit a type-C jack in there above the driver. With this new feature it is now comparable to one of my other favorites, the Armytek C2, but more compact. While I was in there I replaced the microcontroller to update it to MELD (single channel) UI with battery and temperature monitoring, with a bit of extra code to handle the charging indication.
To start I cut a slot out of the back of the head to match the size and shape of a USB type C jack. These jacks are simplified versions for USB-PD only and have just six pins.
The slot is positioned so that the jack can be glued in flush to the shelf inside.
I positioned the jack so that it does not protrude past the surface of the outside diameter. It is secured with CA glue on the bottom and then reinforced with epoxy around the edges.
The charging circuit is a TP4056 set to 1A charge current. Here you can also see the resistors added to the CC1/CC2 pins on the jack which allow it to charge from USB-PD (laptop) supplies in addition to standard USB ports. The TP4056 is mounted inverted with CA glue and wired up with 34AWG enamel wire. In addition to the required power connections, the charging signal from pin 7 is broken out so that it can indicate to the microcontroller when charging is occurring.
I had previously reverse-engineered an H03 driver from the first one I bought so taking control of it was a quick project. Here is a photo of the driver with the stock microcontroller removed and relevant points labelled. With the stock part removed, you can take control of the driver by providing a logic signal to enable or disable the buck converter and one PWM signal to control the brightness. Optionally you can connect to the existing voltage divider to monitor battery voltage, and connect to the direct-drive point to implement moon mode. There is also a voltage regulator on board that can be used to power the replacement microcontroller. I later discovered that I was able to dim much lower than the moon mode hardware just by using PWM so I disabled the use of the moon mode pin in firmware.
I added one of my custom breakout boards that holds a PIC16F1575 (which is mounted upside down, so you cannot see the chip in this image) and wired it up to the required signals. As an extra improvement over the stock light I mounted a thermistor on the unused pads on the LED board to more directly monitor temperature.
After wiring up to the switch board and thermistor I temporarily connected to an external LED to test the hardware. At this point I confirmed that charging worked and made necessary tweaks to the firmware for the added features. The standby current draw was measured at 22uA. I forgot to measure the stock standby current for comparison.
Here is a glimpse at all the hardware installed and wired before closing it up. Kapton tape was added over the holes in the jack to keep dust out of the internal cavity. After this photo additional tape was added over the jack and charger to prevent shorts.
Looking from the LED side you can see that there is very little space left after pushing the driver into place, but all the new hardware just barely fits.
And here is the final product charging with a USB-C cable. The firmware is standard MELD-sc (single channel) which implements all MELD features except for UV and colors, but still has a color sub-menu for those that can be done with a white LED only (lightning, random strobe, and two safety flashers). The modifications for the H03 include voltage and temperature monitoring which can indicate error conditions using the red LED in the switch as well as ramp down or turn off the output if necessary. When the charger indicates that it is active, the firmware will turn the red LED on steady and ignore switch inputs (keeping the main LED off) until charging stops.