Battery voltage colors

I was reading through some posts, and saw some complaints about the voltage thresholds Anduril uses for battery status. Plus, with the recent “smooth povd” thing using finer resolution on the colors, I’ve been wondering if the color curve might need some adjustment.

So I looked up some battery discharge curves and overlaid the thresholds and colors to look at how they line up. Here’s how things are right now, when looking at some high-energy 18650 cells, like 3500 mAh models, measured by HKJ at his lowest discharge level. This is as close as those graphs get to what Anduril sees:

I recall someone was complaining that they have to recharge their battery as soon as the aux LEDs turn green. I think that’s silly, because when it turns green it’s still about half full. For battery health, it’s better to discharge down to like 20% instead… which is in the yellow zone. Could even go into the red zone and be fine, really.

These colors were chosen because I don’t think it should use warning colors like yellow or red until it’s actually getting low. That convention is pretty common, where a status light won’t turn red until the battery is pretty close to empty.

The general guideline here is… When red appears, stop and turn around. If the red aux LEDs are lit, either alone or in combination with some other color, that means it is nearing the end of its range and you should probably do something about it:

  • When it turns red, recharge.
  • When it turns purple, stop charging.

However, if I adjust the middle thresholds up by 0.1V each, it looks like this:

Here, the colors are more evenly distributed.

Er, except purple, because HKJ’s test methods make that region artificially shorter than it should be. He measures under load, which effectively cuts off the left-most portion of the graph when compared to measuring at rest. So purple is wider than it looks.

Otherwise though, this makes each color a lot closer to the same width. Setting the thresholds this way would make the colors change sooner while the battery drains, and green would be the range from like 60% to 40% instead of 50% to 30%.

I’m wondering what people think. Where do you think the thresholds should be?

I may also want to adjust the color thresholds for AA batteries… but that’s a bit tricky since different AA cell types have very different discharge curves, and the common NiMH (Eneloop) cells stay at 1.2X Volts for most of their life, almost flat. So Eneloops probably shouldn’t use a coarse 0.1V resolution, and would instead need thresholds at perhaps 0.02V precision.

5 Thanks

I always wondered why it’s not just the classical green to red with orange and yellow in-between?
Pink and purple are not really something that I connect to being full-er than green since they are red-ish colors.

Do we really need that much of a differenciation of the voltage display? Wouldn’t be three or four colors be enough, but then in the classic green to red range?

A few reasons:

  • Because I want as much precision as possible, at a glance, without having to press the button. If I did like most lights and just use red for ~25% or lower, and green for everything else, it would be pretty useless for most of each battery charge, and I’d need to use the blinky battery check mode a lot more. Would much rather be able to see the charge level of every light I have, all at once, without touching them.
  • Because orange isn’t possible using the passive aux LEDs most Anduril lights have. It can be green, green+red (i.e. yellow), or red. And at low brightness, red is really dim, so it basically looks like green, green, or dim red.
  • Because blue, cyan (blue+green), and green are easily distinguishable, even at low brightness levels. The really dim red is often very hard to see, so it doesn’t work as well for this purpose.
  • Because the visible light spectrum is a natural fit, with high-energy colors representing a battery with more energy, and low-energy colors representing a battery with less energy.
  • Because pretty much everyone has seen a rainbow.
  • Because I think purple, blue, and cyan are prettier, so I like having those for the “good” voltage ranges.
  • Because red and yellow are typically used as warning colors, so I think they are a good fit for a low battery.
  • Because purple (i.e. red+blue) has an additional benefit of having some red in it… so it can also serve as a useful warning that the battery is perhaps too close to full. That’s not very healthy for li-ion batteries.

Basically, a bunch of reasons all lined up in a convenient way to make it a useful color scheme.

On lights with an aw2016 chip to do dimmable RGB and in-between colors, I’m hoping to make it use the full rainbow in standby, instead of just the coarse combinations of red, green, and blue. Then the standby aux could be just as precise as the “smooth povd” thing. But I haven’t modified the code to do that yet.

4 Thanks

https://budgetlightforum.com/t/how-far-can-liion-be-discharged/39080

Here HKJ talks about 3.6 to 3.3 volts being empty.
In another post or one of his articles on his site he says that 3.6 volts is functionally empty. I can’t find that post or test right now.

He Is referencing resting voltage in both cases.

There is no advantage health-wise to go down below 30%.

Many flashlights will not go to turbo when the voltage is below 3.7 or sometimes even higher.
People use flashlights in different ways. Some people are only using them indoors at low settings way under 50 lumens or so with fractions of an amp.
Others want to be able to use turbo even for brief instances.
If you can’t use turbo the battery is empty and needs to be recharged.

So I have very little use for information below 3.7v or 3.6.

But we have many more variables with 14500 and 21700.
If your use case is 30 lumens indoors where you have more batteries and lights readily available then sure you can take the battery lower then 3.6v.
For me I’m typically going to go to the blinks because I want to know if I’m at 3.9 versus 3.8v.
I’m going to recharge my EDC lights at 3.8 because I’m not leaving the house with them lower than that.

So ultimately I guess I would suggest a color change at 4.0, 3.8 and 3.6 volts.
That’s a minimum of four colors to cover that range above and below those numbers. Any additional colors could differentiate below 3.6v.
Edit. Looking back at your first post those numbers line up perfectly with the what you’ve got. So yeah I’m on board.

here’s an open circuit voltage chart from Pajda :

All these are somewhat older cells though, more recent cells have more capacity in the lower part of the voltage range.

On a 4.35V phone battery, 3.6V is nearly empty. It drops off very quickly after that. Should definitely charge at that point.

However, on most of the 4.2V li-ion cells we use in torches, especially the high-mAh ones, 3.6V is about 40% full in terms of mAh. These are what I used for my graphs in the top post.

I’m using HKJ’s measurements to determine this. But also… in my personal use, I’ve found that my lights typically have months of charge remaining when they hit 3.6V. It’s a long way from empty.

I am almost entirely using modes in the range of 0.1 lm to 30 lm though. So battery voltage isn’t a limiting factor for me. It can still do 30 lumens even at 3.0V, right before LVP activates.

But if I was only using turbo, then as you said, a 3.6V battery probably wouldn’t be able to do it very well. That’s not full enough for max turbo. Gotta keep the battery as full as possible to get full turbo, especially on hot rod lights like the original Emisar D4 FET+1.

FWIW, the models with a RGB button can display real-time battery status, so it’ll often drop down into the yellow or red zone on turbo, even when a battery is almost full… and then it recovers when using lower brightness levels. Can see the battery sag while it’s happening.

Me too. That’s why I added the “smooth povd” thing. It lets me estimate the charge within about 0.03V by color, without having to count any blinks. It can take a while to get a feel for the colors, but it doesn’t take a long time.

I’m still trying to improve it though. I’m thinking of switching from a linear interpolation to a sine curve, to blend the colors more naturally and make it easier to gauge by eye. Not sure if it’ll work in practice, but I won’t know until I try it.

Using the percentages from thefreeman’s post I marked where 50% and 25% are on the charts:

I like the present chart, because I know that when Green starts the battery is at 50%

and when Yellow starts the battery is at 25%

If you change it, I will have to learn that when Green starts the battery is still above 50%, and when Yellow starts the battery is still above 25%..

Its up to you whichever you prefer.. I personally like the way it is now, but I can adapt if you decide to change it. And I can still use 3C for Voltage check anyway.

Question:
If you change the colors, will the change be retroactive, or will it only apply to new firmware versions?

IOW, if I stay on 2025-07-07, will the colors stay the same, even if you change the colors for later firmware?

Thank you for sharing the pictures of pretty colors. :wink:

1 Thank

For boost/buck driven lights, it might be argued that the new proposed scheme is closer to the correspondence (start of green, 50% battery) because the relevant quantity is not mAh but total energy, which is area under the discharge curve. The discharge curve is taller near the beginning, which means the midpoint-by-energy is to the left of the midpoint-by-mAh.

Just posting one graph because those are behind Pajda’s Patreon, which I recommend joining to anyone interested in new cell performance and cycle life testing (it’s 2$) :

Amprius SA112 for example is a cell with higher silicon content and has more capacity on the lower part of the voltage range, it’s actually rated at 3.46V nominal voltage, most modern high energy cells have some silicon content that does this to a variable extent.
here at 1C discharge , if the default LVP of 2.9V is used then you basically forfeit the additional capacity vs the 21700G and RH60, and even more so vs lower/no silicon content cells. That’s why I lowered the LVP to 2.6V in my Anduril firmwares (all modern cells are rated at least down to 2.5V). I havent touched at the RGB voltage scaling tough, so I actually get AUX off under the red range lol.
So I’m kind of against shifting the colors to higher voltage, it’s the opposite of where cells are going.

1 Thank

Is this correct for what you are saying?:

iow, 3.5V on old cells is 25% remaining runtime capacity?
but on new cells 3.5V is 60% remaining runtime capacity?

the discharge graph is at 1C, at 0.2C which is more comparable to OCV it’s more like 50% remaining capacity for SA112 and 40% for RH60 (if cutout at 2.5V).
At a similar 0.2C rate an older Samsung 35E is about 30% remaining at 3.5V. A modern 18650 4000mAh Amprius SA110, about 45% left.

1 Thank

Thank You!
with my 14500 lights, when I want to leave the house with no less than a half charged battery, I usually load a fresh cell when a battery shows Green POVD and I confirm w 3C batt check, that it is at less than 3.7V

I dont leave the house with a 14500 EDC at 3.5V. I would only go that low, or even lower, if I was using the light for a task where I needed light for more than 2 hours @ 100 lumens..

I like to carry a 14500 light with sufficient charge to be capable of 100 lumens for more than 1 hour.

Level 4 on a D3AA is 101 lumens and runs for 3.5 hours on a full battery.. so a half full battery is the least charge I like to EDC.

I usually swap in a fresh battery, and recharge my 14500 EDC, when I see Green POVD.. This means Im carrying enough capacity to walk for an hour to a campsite, and an hour back.

It also means if my car gets stranded away from cell phone reception, I have enough light to walk for at least an hour to get help.

Similar consideration when I go skiing out of bounds.. If I was to get stranded in the dark with no cell phone reception, I want at least an hour worth of light, if I needed to walk back to civilization.

I could go lower than green POVD and below 3.7V, if I was carrying an 18650 or 21700, especially if my use was at low output in urban areas, but I dont generally EDC those sizes.

What I do instead of carrying larger batteries, is I bring a spare 14500 light, plus 2 spare batteries in my pack, when I go skiing out of bounds, or driving off pavement into areas with no cell phone reception.

Mmmm, I gotta confess, I ran into the POVID thing for the first time with the TS10 v3 (1 of the probably 8 related threads at this point), and got annoyed enough to finally turn it off entirely.

Random thoughts, apologies if anyone mentioned same already.

Seems there are only 2 brightness levels related to the bright/dim aux light levels (7C), that are dim below some memorised light level and bright above that level. Doesn’t seem to be any way to make that consistent, like always bright or always dim..

I was wondering why the color changes, and what they meant. Turned out I was just watching voltage bounceback in the second or two they blinked, and from green to blue to cyan. Looked more decorative than functional, which is why I didn’t even make the connection to the cell voltage for a while.

Different cells of course have different discharge curves. I had some that would stay pretty flat then fall off a cliff, and others that more or less dropped off linearly until the final cliff down at 3V or so. My OG TS10 would hang in the upper 3s, then at 3.6V drop off so fast that any higher brightness level would “blink down” a level after only a few seconds… or immediately.

Different use-cases are “should I charge the light before heading out?” through “how much more juice do I have left?” while on the job, out hiking, etc. To me, I’d prefer a voltage blinkout of the former, when the cell’s rested, and maybe a generic green/red/redblink in use. Everything from the cell’s age to its discharge curve to voltage bounceback make “precise” measurements almost meaningless. What might look great with new Cell A would be screwed up with older Cell B.

My UF S3 drops high (#4) as soon as the indicator in the button goes from green to yellow. My SH M200 similarly just drops it’s highest levels as the cell wears down. So in the house, neither is any big deal unless I want/need those highest levels Right Now, but if I’d take either with me going out, I’m def topping off before I do, regardless.

Also, I’d be checking voltage when the cell’s at rest, not mere seconds after it’s had an exhausting workout.

So… yeah. I’d rather just have a go-or-blow indicator in the button, visible either all the time or only when the light’s on, than even a “precise” measurement by color that only pops on for a second or two when the light’s turned off.

1 Thank

A couple of quick thoughts on this:

Check out voltage config, options 3 and 4 (these also set the POVD brightness). This is a deep-dive configuration on the outskirts of Anduril 2 town, and details depend on whether the respective light has dimmable RGB aux, but it is out there.

Possibly the light was exactly at 3.90V, right at the border between blue (3.90V) and cyan (3.89V), and with the classic 6 discrete voltage colors, POVD (on high brightness) was bouncing back and forth. If annoying, a quick turbo blast would get you into solid cyan territory.

Check out voltage config, option 5. An RGB button will show voltage all the time while the light is On, only thing is that, if present, the front RGB aux will be On as well. Depends on preference. For example, when out for a walk with an Emisar DA1K, I like to see the remaining voltage in the RGB button while the light is On, and I do not see any front RGB aux at all.

1 Thank

I did see that and tried it, but the TS10 v3 doesn’t have that chip, just high/low(/off).

.

This was definitely a jump in 3 colors. Might’ve reversed that as green to cyan to blue instead, as in cyan maybe being a precursor to purple or something. Don’t recall, can’t get arsed enough to try to recreate.

Old EBL cell I’m just trying to get my money’s worth from. :joy:

Works great in my really ancient SP10B, though. Not nearly as high-strung as other brighter lights.

.

The 'v3 doesn’t have a rgb button, though. Or the chip for aux lights.

1 Thank

Only new firmware versions. I can’t change the behavior of firmware which is already installed. Nothing changes until it gets updated and reflashed.

Exactly. On linear and direct-drive lights, percent is measured by remaining mAh (the X axis on the graph). But on boost/buck lights, percent is measured by the remaining energy (area under the curve).

The higher voltages represent a larger share of the percent, when using boost/buck drivers, because they don’t burn off the extra voltage as waste heat.

That’s part of why I was considering an adjustment to the thresholds. More lights lately have boost/buck regulators. Also, I thought batteries had been slowly trending up in voltage, but I may be wrong about that.

It’s hard to compare that to the HKJ graphs I’ve been using, because HKJ discharged at 0.2A and Pajda discharged at 6.5A. That’s much much higher discharge current, which would make the entire graph shift downward quite a bit, and change shape.

For what I’m doing, I need batteries tested at rest, or as close to “at rest” as possible. Anduril is typically only using 5mA or less during these measurements, so it’s pretty close to resting voltage.

Here are the same cells as the top post, measured at 0.2A and 5A discharge, to show how much the curve changes:

At 0.2A, 3.7V means ~50% full. But at 5A, 3.7V means ~80% full. And at rest, where Anduril actually measures the current, 3.7V is probably closer to 55% or even 60% full… but it’s hard to find battery tests measured at such low current.

That’s fair. I thought batteries were trending upward in voltage, but if the opposite may be happening, I’d be adjusting things in the wrong direction.

2 Thanks

That’s fair, if you expect to use half a battery in a single evening.

Me though… when POVD hits the green range on a li-ion cell, that means I have anywhere from 2 weeks to 3 months of power remaining. So I wait longer before recharging.

I feel like at least the NiMH curves need some adjustment though. Eneloops spend most of their life at 1.2X Volts, with a very flat curve for a while… and then once they drop to 1.1X Volts, they’ve barely got any energy left.

Eneloops have some other weird behavior too though. Like, when their voltage sags, it doesn’t recover in a few seconds like li-ion does. Instead, it can take hours.

And AA in general has additional complications, because of the wildly different discharge curves of alkaline, NiMH, lithium, and carbon-zinc cells. So I’m not really sure what to do about that. Maybe it’s fine as-is… because although it doesn’t work great for any cell type, it works at least okay-ish for all of them. Optimizing more for any specific cell type would make it worse for the rest.

2 Thanks

How about a setting where you could manually set the type of AA battery chemistry?

On the one hand, yes. Adding another config setting is kind of an obvious thing to do whenever anything like this comes up.

On the other hand, … thinking about it makes me feel like I lost a quart of plasma. The extra overhead and complexity, for both the code and for the user, might not be worth it. Especially if the user switches between different battery types.

I’d be much more enthusiastic about adding a compile-time option to select between different battery modelling curves, instead of a runtime option. That way, advanced users could tailor it to their needs in detail, or even make their own… and things would continue to mostly “just work” for everyone else, with no action needed by the user. There’s a table in the code which is pretty simple to edit, but I could modify it to make that process easier.

1 Thank

HKJ did more testing to look at battery percentages.
I understand these tests are kind of old and battery chemistries and power has changed some.
I guess it could be argued that people using smaller lights with 14500 and possibly 18350 are using low lumens and for various reasons some want to use almost all of the batteries capacity before recharging. I don’t think that necessarily applies to most people using 18650 and 21700 batteries.
I seem to recall polls in the past and most people are going to start charging batteries when the voltage gets down to 3.6, 3.7 ish. If I’m actively using the light sure there are times I’m going to go below that. But if I’m done using the light and I know the battery is at those numbers I’m going to charge it and I think most people will.