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._battery = ADC(battery)
|
||||||
self._charging = charging
|
self._charging = charging
|
||||||
self._power = power
|
self._power = power
|
||||||
|
self._cache = set()
|
||||||
|
|
||||||
@micropython.native
|
@micropython.native
|
||||||
def charging(self):
|
def charging(self):
|
||||||
|
@ -33,7 +34,7 @@ class Battery(object):
|
||||||
|
|
||||||
:returns: True if the battery is charging, False otherwise.
|
:returns: True if the battery is charging, False otherwise.
|
||||||
"""
|
"""
|
||||||
return self._charging.value()
|
return self._charging.value()
|
||||||
|
|
||||||
def power(self):
|
def power(self):
|
||||||
"""Check whether the device has external power.
|
"""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
|
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.
|
:returns: Battery voltage, in millivolts.
|
||||||
"""
|
"""
|
||||||
raw = self._battery.read_u16()
|
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):
|
def level(self):
|
||||||
"""Estimate the battery level.
|
"""Estimate the battery level.
|
||||||
|
@ -61,15 +73,12 @@ class Battery(object):
|
||||||
The current the estimation approach is extremely simple. It is assumes
|
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
|
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
|
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.
|
live with that for now.
|
||||||
|
|
||||||
:returns: Estimate battery level in percent.
|
:returns: Estimate battery level in percent.
|
||||||
"""
|
"""
|
||||||
mv = self.voltage_mv()
|
mv = self.voltage_mv()
|
||||||
level = ((19 * mv) // 100) - 660
|
level = ((19 * mv) // 100) - 660
|
||||||
if level > 100:
|
level = min(100, max(0, level))
|
||||||
return 100
|
|
||||||
if level < 0:
|
|
||||||
return 0
|
|
||||||
return level
|
return level
|
||||||
|
|
Loading…
Reference in a new issue