wasp: Add battery support
This commit is contained in:
parent
ef5d805c51
commit
a34d65d7fd
5 changed files with 70 additions and 2 deletions
2
TODO.md
2
TODO.md
|
@ -36,5 +36,5 @@ The TODO list helps keep track on progress towards that goal. It is not
|
||||||
- [ ] Optimized RLE inner loops
|
- [ ] Optimized RLE inner loops
|
||||||
* [X] Backlight driver
|
* [X] Backlight driver
|
||||||
* [ ] Button driver (interrupt based)
|
* [ ] Button driver (interrupt based)
|
||||||
* [ ] Battery/charger driver
|
* [X] Battery/charger driver
|
||||||
* [ ] Simple clock and battery level application
|
* [ ] Simple clock and battery level application
|
||||||
|
|
|
@ -2,6 +2,8 @@ freeze('$(MPY_DIR)/../wasp',
|
||||||
(
|
(
|
||||||
'boot.py',
|
'boot.py',
|
||||||
'demo.py',
|
'demo.py',
|
||||||
|
'drivers/battery.py',
|
||||||
|
'drivers/signal.py',
|
||||||
'drivers/st7789.py',
|
'drivers/st7789.py',
|
||||||
'logo.py',
|
'logo.py',
|
||||||
'pinetime.py'
|
'pinetime.py'
|
||||||
|
|
36
wasp/drivers/battery.py
Normal file
36
wasp/drivers/battery.py
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
# Generic lithium ion battery driver
|
||||||
|
|
||||||
|
from machine import Pin, ADC
|
||||||
|
|
||||||
|
class Battery(object):
|
||||||
|
def __init__(self, battery, charging, power=None):
|
||||||
|
self._battery = ADC(battery)
|
||||||
|
self._charging = charging
|
||||||
|
self._power = power
|
||||||
|
|
||||||
|
def charging(self):
|
||||||
|
return self._charging.value()
|
||||||
|
|
||||||
|
def power(self):
|
||||||
|
if self._power:
|
||||||
|
return self._power.value()
|
||||||
|
return self._charging.value()
|
||||||
|
|
||||||
|
def voltage_mv(self):
|
||||||
|
# Assumes a 50/50 voltage divider and a 3.3v power supply
|
||||||
|
raw = self._battery.read_u16()
|
||||||
|
return (2 * 3300 * raw) // 65535
|
||||||
|
|
||||||
|
def level(self):
|
||||||
|
# This is a trivial battery level estimation approach. 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
|
||||||
|
# live with that for now.
|
||||||
|
mv = self.voltage_mv()
|
||||||
|
level = ((19 * mv) // 100) - 660
|
||||||
|
if level > 100:
|
||||||
|
return 100
|
||||||
|
if level < 0:
|
||||||
|
return 0
|
||||||
|
return level
|
23
wasp/drivers/signal.py
Normal file
23
wasp/drivers/signal.py
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
class Signal(object):
|
||||||
|
'''Simplified Signal class
|
||||||
|
|
||||||
|
Note: The normal C implementation isn't working for the NRF port
|
||||||
|
'''
|
||||||
|
|
||||||
|
def __init__(self, pin, invert=False):
|
||||||
|
self.pin = pin
|
||||||
|
self.invert = invert
|
||||||
|
|
||||||
|
def __call__(self, v=None):
|
||||||
|
return self.value(v)
|
||||||
|
|
||||||
|
def value(self, v=None):
|
||||||
|
if v == None:
|
||||||
|
return self.invert ^ self.pin.value()
|
||||||
|
self.pin.value(self.invert ^ bool(v))
|
||||||
|
|
||||||
|
def on(self):
|
||||||
|
self.value(1)
|
||||||
|
|
||||||
|
def off(self):
|
||||||
|
self.value(0)
|
|
@ -1,6 +1,9 @@
|
||||||
from machine import Pin
|
from machine import Pin
|
||||||
|
#from machine import Signal
|
||||||
from machine import SPI
|
from machine import SPI
|
||||||
|
|
||||||
|
from drivers.battery import Battery
|
||||||
|
from drivers.signal import Signal
|
||||||
from drivers.st7789 import ST7789_SPI
|
from drivers.st7789 import ST7789_SPI
|
||||||
|
|
||||||
class Display(ST7789_SPI):
|
class Display(ST7789_SPI):
|
||||||
|
@ -42,5 +45,9 @@ class Backlight(object):
|
||||||
|
|
||||||
backlight = Backlight(0)
|
backlight = Backlight(0)
|
||||||
display = Display()
|
display = Display()
|
||||||
|
|
||||||
backlight.set(1)
|
backlight.set(1)
|
||||||
|
|
||||||
|
battery = Battery(
|
||||||
|
Pin('BATTERY', Pin.IN),
|
||||||
|
Signal(Pin('CHARGING', Pin.IN), invert=True),
|
||||||
|
Signal(Pin('USB_PWR', Pin.IN), invert=True))
|
||||||
|
|
Loading…
Reference in a new issue