Merge pull request #318 from thiswillbeyourgithub/battery_smoothing
fix: smoothen battery level before showing it to user
This commit is contained in:
commit
752fe77376
1 changed files with 16 additions and 7 deletions
|
@ -26,6 +26,7 @@ class Battery(object):
|
|||
self._battery = ADC(battery)
|
||||
self._charging = charging
|
||||
self._power = power
|
||||
self._cache = set()
|
||||
|
||||
@micropython.native
|
||||
def charging(self):
|
||||
|
@ -33,7 +34,7 @@ class Battery(object):
|
|||
|
||||
:returns: True if the battery is charging, False otherwise.
|
||||
"""
|
||||
return self._charging.value()
|
||||
return self._charging.value()
|
||||
|
||||
def power(self):
|
||||
"""Check whether the device has external power.
|
||||
|
@ -50,10 +51,21 @@ class Battery(object):
|
|||
|
||||
Assumes a 50/50 voltage divider and a 3.3v power supply
|
||||
|
||||
The last values is kept in a cache and only the minium cached value is
|
||||
shown to the user, this is to avoid the battery level
|
||||
going up and down because of the lack of precision of the mv.
|
||||
Note that this will underestimate battery level.
|
||||
|
||||
:returns: Battery voltage, in millivolts.
|
||||
"""
|
||||
raw = self._battery.read_u16()
|
||||
return (2 * 3300 * raw) // 65535
|
||||
mv = (2 * 3300 * raw) // 65535
|
||||
|
||||
if mv not in self._cache:
|
||||
self._cache.add(mv)
|
||||
while len(self._cache) > 2:
|
||||
self._cache.remove(max(self._cache))
|
||||
return min(self._cache)
|
||||
|
||||
def level(self):
|
||||
"""Estimate the battery level.
|
||||
|
@ -61,15 +73,12 @@ class Battery(object):
|
|||
The current the estimation approach is extremely simple. It is assumes
|
||||
the discharge from 4v to 3.5v is roughly linear and 4v is 100% and
|
||||
that 3.5v is 5%. Below 3.5v the voltage will start to drop pretty
|
||||
sharply to we will drop from 5% to 0% pretty fast... but we'll
|
||||
sharply so we will drop from 5% to 0% pretty fast... but we'll
|
||||
live with that for now.
|
||||
|
||||
:returns: Estimate battery level in percent.
|
||||
"""
|
||||
mv = self.voltage_mv()
|
||||
level = ((19 * mv) // 100) - 660
|
||||
if level > 100:
|
||||
return 100
|
||||
if level < 0:
|
||||
return 0
|
||||
level = min(100, max(0, level))
|
||||
return level
|
||||
|
|
Loading…
Reference in a new issue