There are articles describing getting years of ESP32 operating time from one set of batteries, relying on it being in low current sleep mode most of the time. The Esp32 consumes about 0.01 mA duing deep sleep.
A simple scenario may be waking up for 200 milliseconds to log a sensor reading, then sleeping for a minute (60,000 millisecond) so it's active only 0.3% of the time.
Using the official m5stack Arduino Lib DeepSleep function, I checked the M5stickC battery voltage in a series of 1 hour sleep periods, it averaged 0.90 volts drop per hour, which is inline with someone in the forum who reported getting no more than 5 hours of battery life with their watch, this may amount to perhaps 5-10mA of current drawn during sleep. (I have to wonder if something else can be turned off)
M5stack Engineers: I just tested the Sleep function in the standalone StickWatch2PowerManagment demo, it delivered 16 hours of sleep time, which may be a big deal for some users. (Total voltage drop was 0.398v, that's 25mv/hr)
The difference from the official DeepSleep() code used in the sleep.ino example may be trivial, they are shutting down the IMU chip which has a current spec. of 2.5ma, the added function that handles it is: shutdownSH200Q() (example code seems to need the same Arduino setup as the StickWatch2 described below)
I tested am M5stickC running with the LCD back-light at full brightness and found the battery reached a "dangerously low" 8% charge condition after 20 minutes. (Relying on the AXP192 battery management chip's voltage and idischarge readings)
(The processor seems to start up with the radio sleeping, WiFi and Bluetooth are the biggest energy eating offenders.)
THE SIMPLEST WAY TO GET A LONGER LIFE is to lower the brightness of the LCD backlight, at full brightness you may see a total battery load of 125 mA, one could predict a 38 minute to totally discharge the 80 mAH battery with that load, while the real world life is more like 20 minutes.
This user reports the battery current for various LCD backlight brightness setting, which is a close match to my findings.
idischg: 42mA @ ScreenBreath(7)
idischg: 44mA @ ScreenBreath(8)
idischg: 51mA @ ScreenBreath(9)
idischg: 58mA @ ScreenBreath(10)
idischg: 65mA @ ScreenBreath(11)
idischg: 75mA @ ScreenBreath(12)
idischg: 90mA @ ScreenBreath(13)
idischg: 105mA @ ScreenBreath(14)
idischg: 116mA @ ScreenBreath(15)
ScreenBreath(10) seems quite usable, doubling your battery life. Another benefit of lower backlight energy is lower operating temperature, components tightly packed in a little box tend to run hotter, battery performance degrades and charge time increases under higher temperatures. (on my copy of the stick ScreenBreath(6) gave a very dim image readable in a blacked out room, but the energy saving is negligible)
The AXP192 (Power management) Document shows: ScreenBreath(), GetVbatData(), GetIchargeData()
The AXP192 power management chip example uses more functions to provide a detailed report
This article touching on Coulomb Counting in a Battery Fuel Gauge, might show the value of Coulomb reporting by the AXP192.
I made some battery tests using the Power reporting section of StickWatch2, which display the percentage of power remaining, their algorithm uses a 12 segment lookup table apparently to fit a discharge curve, (it's not a linear calculation)
There is a trick to get the updated StickWatch2 code to run on the M5stickC in the Arduino IDE:
You have to change the Board setting to "ESP32 Pico Kit" and correct the upload speed to 115200.
Here is a rough guideline for estimating remaining energy, developed by the RC people:
4.2 volts 100%
4.1 about 90%
4.0 about 80%
3.9 about 60%
3.8 about 40%
3.7 about 20%
3.6 empty for practical purposes
The AXP192 sleep example can be useful for extending battery life in some applications.
M5stack engineers could help those attempting to further extend battery life, with further documentation, perhaps in a tutorial on battery conservation describing what goes on behind the sleep command.
A block diagram showing the power supply path of the various components may help, (I would like to see what the power manager LDO, LDO2, LDO3 & LDOIO drives) those chips that are not powered down by the AXP192 might be reprogrammed to a lower power idle mode, (it appears that 2ma would be saved with an LCD controler Sleep-in setting)
Here are a few tutorials on ESP32 Sleep modes, the essential thing to know is you code is lost when memory is powered down, waking up amounts to rebooting the board, you can store the state of your program in the RTC processor's 8K of ram before sleeping.
ESP32 Deep Sleep with Arduino IDE and Wake Up Sources
ESP32 Deep Sleep Tutorial -- speaks of 5 year battery life
ESP32 Timer Wake Up from Deep Sleep