I use the battery voltage to try and work out a sensible idea of battery level. Anything equal or over 4.1 can be considered full, less than 3.4 is pretty much dead, and 3.7 is generally where it'll spend most of it's time. It's not a linear drop off, so it will take some calculations to try and get it accurate around the 3.6 to 3.8 volt range. This is probably why the M5Stack library only gives 0/25/50/75/100 battery levels. I then use battery current to know if it's charging, discharging or fully charged. By getting the value from M5.Axp.GetBatCurrent() if you see a negative value, it's discharging, a positive value is charging and a zero value means fully charged while plugged in. The values returned will give you an idea of how much current is being drained from the battery in mA, or indeed how much current is being used to charge the battery, all in realtime. On the M5StickC it would be 85mA typically when charging.