The issue with moon turning off is a side effect of the constant current power circuit. Instead of using a digital signal to turn on and off quickly, it uses an analog control voltage. And analog circuits are typically pretty sensitive to environmental factors, so it can behave differently depending on things like temperature and which level it was at a moment earlier.
Steps at the bottom end of the ramp don’t have great spacing on this driver, because the output resolution isn’t very high. It could work around that by repeating each ramp level quite a few times in the internal 150-step table, which would help the stepped ramp spacing… but then the smooth ramp wouldn’t look as nice. So there are tradeoffs. I’m hoping a future version of the hardware will add more resolution at the bottom end.
About voltage calibration, that was added in Anduril 2. It’s not in Anduril 1 though, so you’d have to reflash the firmware to get that function.
If it helps, the way I set up my D4v2 with E21A is:
- Ramp style: smooth
- Ramp floor: 1
- Manual memory level: stepped ramp 2 of 7
- Memory timer: 10 minutes (Anduril 2 only)
This gives me consistent and predictable output every time I pick up the light, defaulting to my most-used level. But it also gives me the flexibility of the smooth ramp, including moon. So it has some benefits of both ramp styles.
As for reaching moon from off without accidentally going through a bright level, what I find works is: Aim the light so I can see the aux LEDs. Hold the button. As soon as the aux LEDs turn off, let go of the button and turn the light toward what I actually wanted to see.
On most other lights, it’s easy to time the button release by watching for the main LEDs to turn on… but since this driver responds slower, I watch instead for the aux LEDs to turn off.
It mostly just means the attiny chip and other components don’t have very precise calibration from the factory. So some lights read high while others read low. That’s why I eventually added a calibration function.
While the light is running, it reads under whatever load it’s currently using. In battcheck mode, it stays mostly off, so the load is pretty low. However, it uses a rather strong lowpass filter, and the battery itself may take some time to recover after being used at a high level, so battcheck can take a couple readings to converge on a stable value.