
So I'd been struggling for a while now trying to reduce the power consumption of a small Thread-powered ePaper dashboard and I finally cracked it, but the solution, after messing around with kconfig and board definitions for ages and ages, made me feel like a dummy. So I wanted to share my embarrassment in hopes it might help someone else in the future.
Since this is a long story (sorry, not sorry?) here is the TL;DR: If your display allows you to bypass the LDO if you're feeding it its 3.3v operating voltage, do it. You'll save over .5mA draw as was the case for me.
A few caveats to begin: My code is written by GPT Codex. I am a designer, not a coder, but I've always been super fascinated with tech, and indeed have taken coding classes in the past and wrote HTML/CSS early in my career. I LOVE making things, fixing electronics, repurposing stuff, etc. I would pay $100 in components to make something myself instead of buying a $50 piece of junk from Aliexpress. I have tons of ideas but until Agentic coding came along, I never had the wherewithall to actually make stuff that someone else hasn't already made. That being said, I often am doing the legwork of reading datasheets and trying my best to dig into the code Codex writes to find the bugs and guide it on how to solve issues since its a bit of a blunt instrument. I wanted to preface this with that bit of info because I want to stress that the code is not my own writing, and my coding knowledge is limited. However, this post is 100% written by me, no GPT involved here.
Project details: Its a small home/outdoor dashboard device running a XIAO nRF52840 connected to a 3.97" SPI ePaper display from WeAct. It displays current time and date (synced via Chrony running on my pi0w OTBR) and local sensor data.
It gets sensor data from Matter over Thread sensors around the house and outside (which I designed and built and are using XIAO nRF52840s or ESP32-C6s and either BME680 or SHT41 sensors depending on the use case). Home Assistant processes the data with nodeRED and builds a payload that my Dashboard fetches periodically via Thread CoAP using my pi0w OTBR as a relay since I couldn't get NAT64 working on my Thread network to allow my thread-only device to reach ipv4 endpoints.
The issue: I was initially using generic nRF52 Supermini (knockoffs of the Tenstar Robot boards, which are knockoffs of the NiceNanov2 boards) and power draw, even with nothign connected and PM and sleep enabled was atrocious. I'm talking about idling at 1.4mA, atrocious. I knew the XIAO boards were capable of 4uA or less idle so I ditched the SuperMini in favor of the XIAO boards I already used in my outdoor sensor which I'd measured at 4-5uA draw during system-on-sleep (and which I project to have a multi-year runtime on a single 2200mAh 18650) so I knew it would fit my needs.
So I get the code migrated to the XIAO and its working well, but power consumption is still around 1mA at idle. I do some tweaking and get it down to 520uA but that's still far too high. So I'm looking up Nordic docs and blogs, Seeed forum posts, etc to try to get consumption below 500uA during System-On-Idle and nothing is moving the needle much. Interestingly, when I unplug the display, idle drops to 5uA. So, again, more time going around in circles, ensuring pins are disabled correctly when idle, ensuring the display enters deep sleep correctly (referencing example sketches from WeAct and GoodDisplay as a guideline) and everything checks out. Anyway, I was disassembling my device to try the SperMini one more time and i took a look at the silkscreen on the back of the display:
Wait a minute, does that mean since SB4/5 are populated from the factory that its running VCC through some circuitry to allow 5v input? I check the schematic, and yup, SB4/5 route input through the on-board LDO. SB3 bypasses it.
Goddamnit. So I desolder the 0Ω resistors from SB4/5 and bridge the SB3 pads, plug it back in and immediately the device is idling at 5.2uA. Great success! But also a facepalm moment. I was chasing my tail trying to reduce power consumption in software thinking my config or code was the issue, but it was the display's crappy LDO circuit all along. So my idle power consumption was reduced by 100x, from 520uA to 5uA, simply by bypassing the display's LDO.
Anyway, thanks for reading my stupidly long story. I plan to make this project public eventually, but I'm still finishing up work on the UI and I'm not entirely sure if the whole thing is particularly useful for others as I tend to see it as a pretty bespoke setup for my house and network setup. Maybe I'm wrong? If people want more details I'm happy to clean the repo up a bit and publish it.